33 const std::vector<VariablePtr> & x,
51 template<
typename Derived>
57 template<
typename CstDerived,
typename... Derived>
68 using LinearFunction::b;
71 template<
typename Derived>
72 void add(
const Eigen::MatrixBase<Derived> & A,
VariablePtr x);
74 template<
typename Tuple,
size_t... Indices>
75 void add(Tuple && tuple, std::index_sequence<Indices...>);
77 template<
typename Derived>
83 template<
typename Tuple,
size_t... Indices>
85 { (v.
add(std::get<Indices>(std::forward<Tuple>(tuple)).variable()), ...); }
88 template<
typename Derived>
90 : LinearFunction(static_cast<int>(lin.matrix().rows()))
93 this->
b(Eigen::VectorXd::Zero(
size()),
98 template<
typename CstDerived,
typename... Derived>
100 : LinearFunction(static_cast<int>(
std::get<0>(aff.linear()).matrix().rows()))
102 using Indices = std::make_index_sequence<
sizeof...(Derived)>;
106 const auto & simple = v.
simple();
107 for(
int i = 0; i < vars.numberOfVariables(); ++i)
121 add(aff.
linear(), Indices{});
122 if constexpr(std::is_same_v<CstDerived, utils::internal::NoConstant>)
124 this->
b(Eigen::VectorXd::Zero(
size()),
129 this->
b(aff.
constant(), {tvm::internal::MatrixProperties::Constness(true)});
134 template<
typename Derived>
135 inline void BasicLinearFunction::add(
const Eigen::MatrixBase<Derived> & A,
VariablePtr x)
137 if(!x->space().isEuclidean() && x->isBasePrimitive())
138 throw std::runtime_error(
"We allow linear function only on Euclidean variables.");
139 if(
A.rows() !=
size())
140 throw std::runtime_error(
"Matrix A doesn't have coherent row size.");
141 if(
A.cols() != x->size())
142 throw std::runtime_error(
"Matrix A doesn't have its column size coherent with its corresponding variable.");
146 auto J =
jacobian_.at(x.get(), tvm::utils::internal::with_sub{});
158 if constexpr(std::is_same_v<Derived, std::remove_const_t<tvm::utils::internal::IdentityType>>)
162 if constexpr(std::is_same_v<Derived, std::remove_const_t<tvm::utils::internal::MinusIdentityType>>)
164 shape = Shape::MINUS_IDENTITY;
166 if constexpr(std::is_same_v<Derived, std::remove_const_t<tvm::utils::internal::MultIdentityType>>)
168 shape = Shape::MULTIPLE_OF_IDENTITY;
170 if constexpr(std::is_same_v<Derived, std::remove_const_t<decltype(Eigen::VectorXd(1).asDiagonal())>>)
178 template<
typename Tuple,
size_t... Indices>
179 inline void BasicLinearFunction::add(Tuple && tuple, std::index_sequence<Indices...>)
180 { (add(std::get<Indices>(std::forward<Tuple>(tuple))), ...); }
182 template<
typename Derived>
183 inline void BasicLinearFunction::add(
const utils::LinearExpr<Derived> & lin)
184 { add(lin.matrix(), lin.variable()); }
#define TVM_DLLAPI
Definition: api.h:35
Definition: Variable.h:49
Definition: BasicLinearFunction.h:22
virtual void b(const VectorConstRef &b, const tvm::internal::MatrixProperties &p={})
BasicLinearFunction(int m, VariablePtr x)
BasicLinearFunction(const std::vector< MatrixConstRef > &A, const std::vector< VariablePtr > &x)
BasicLinearFunction(const MatrixConstRef &A, VariablePtr x)
BasicLinearFunction(int m, const std::vector< VariablePtr > &x)
virtual void A(const MatrixConstRef &A, const Variable &x, const tvm::internal::MatrixProperties &p={})
BasicLinearFunction(const std::vector< MatrixConstRef > &A, const std::vector< VariablePtr > &x, const VectorConstRef &b)
BasicLinearFunction(const MatrixConstRef &A, VariablePtr x, const VectorConstRef &b)
virtual void A(const MatrixConstRef &A, const tvm::internal::MatrixProperties &p={})
Definition: LinearFunction.h:62
const tvm::internal::VectorWithProperties & b() const
Definition: LinearFunction.h:70
void setDerivativesToZero()
int size() const
Definition: FirstOrderProvider.h:200
utils::internal::MapWithVariableAsKey< MatrixWithProperties, slice_matrix, true > jacobian_
Definition: FirstOrderProvider.h:179
const VariableVector & variables() const
Definition: FirstOrderProvider.h:205
void addVariable(VariablePtr v, bool linear)
Definition: MatrixProperties.h:17
Shape
Definition: MatrixProperties.h:21
@ ZERO
Definition: MatrixProperties.h:39
Definition: VariableCountingVector.h:30
const VariableVector & variables() const
const std::vector< uint8_t > simple() const
Definition: AffineExpr.h:71
const CstDerived & constant() const
Definition: AffineExpr.h:98
const std::tuple< LinearExpr< Derived >... > & linear() const
Definition: AffineExpr.h:97
Definition: AffineExpr.h:26
void addVar(tvm::internal::VariableCountingVector &v, Tuple &&tuple, std::index_sequence< Indices... >)
Definition: BasicLinearFunction.h:84
@ DIAGONAL
Definition: CompiledAssignment.h:38
@ IDENTITY
Definition: CompiledAssignment.h:47
@ GENERAL
Definition: CompiledAssignment.h:49
std::shared_ptr< Variable > VariablePtr
Definition: defs.h:65
Eigen::Ref< const Eigen::VectorXd > VectorConstRef
Definition: defs.h:50
Eigen::Ref< const Eigen::MatrixXd > MatrixConstRef
Definition: defs.h:48
Definition: MatrixProperties.h:65