totsu_core/cone_rpos.rs
1use num_traits::{Float, Zero};
2use core::marker::PhantomData;
3use crate::solver::{Cone, LinAlg, SliceLike};
4
5//
6
7/// Nonnegative orthant cone
8///
9/// <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
10/// <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
11///
12/// \\[
13/// \mathbb{R}\_+^n = \mathbb{R}\_+ \times \cdots \times \mathbb{R}\_+ =
14/// \left\lbrace x \in \mathbb{R}^n
15/// \ \middle|\ x_i \ge 0,\ i=1,\ldots,n
16/// \right\rbrace
17/// \\]
18pub struct ConeRPos<L: LinAlg>
19{
20 ph_l: PhantomData<L>,
21}
22
23impl<L: LinAlg> ConeRPos<L>
24{
25 /// Creates an instance.
26 ///
27 /// Returns the [`ConeRPos`] instance.
28 pub fn new() -> Self
29 {
30 ConeRPos {
31 ph_l: PhantomData,
32 }
33 }
34}
35
36impl<L: LinAlg> Cone<L> for ConeRPos<L>
37{
38 fn proj(&mut self, _dual_cone: bool, x: &mut L::Sl) -> Result<(), ()>
39 {
40 let x_mut = x.get_mut();
41 for e in x_mut {
42 *e = e.max(L::F::zero());
43 }
44 Ok(())
45 }
46
47 fn product_group<G: Fn(&mut L::Sl) + Copy>(&self, _dp_tau: &mut L::Sl, _group: G)
48 {
49 // do nothing
50 }
51}