TVM  0.9.4
FirstOrderProvider.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <tvm/defs.h>
6 
7 #include <tvm/Variable.h>
8 #include <tvm/VariableVector.h>
12 
13 #include <Eigen/Core>
14 
15 #include <algorithm>
16 #include <map>
17 #include <vector>
18 
19 namespace tvm::internal
20 {
21 
42 class TVM_DLLAPI FirstOrderProvider : public graph::abstract::Node<FirstOrderProvider>
43 {
44 public:
45  SET_OUTPUTS(FirstOrderProvider, Value, Jacobian)
46 
47 
53  virtual const Eigen::VectorXd & value() const;
57  virtual MatrixConstRefWithProperties jacobian(const Variable & x) const;
58 
60  bool linearIn(const Variable & x) const;
61 
62  const Space & imageSpace() const;
63 
65  int size() const;
67  int rSize() const;
69  int tSize() const;
70 
72  const VariableVector & variables() const;
73 
74 protected:
75  struct slice_linear
76  {
77  using Type = bool;
78  using ConstType = bool;
79  static bool get(bool & b, const Range &) { return b; }
80  static bool get(const bool & b, const Range &) { return b; }
81  };
82 
83  struct slice_matrix
84  {
88  {
89  if(p.isZero())
91  else
93  }
94  static Type get(MatrixWithProperties & M, const Range & r)
95  { return {M.middleCols(r.start, r.dim), M.properties()}; }
96  static ConstType get(const MatrixWithProperties & M, const Range & r)
97  { return {M.middleCols(r.start, r.dim), slice(M.properties())}; }
98  };
99 
107 
113 
121  virtual void resizeCache();
122 
132 
138  void addVariable(VariablePtr v, bool linear);
141 
149  void addVariable(const VariableVector & v, bool linear);
150 
154  virtual void addVariable_(VariablePtr);
155 
160 
171  void splitJacobian(const MatrixConstRef & J, const std::vector<VariablePtr> & vars, bool keepProperties = false);
172 
174  inline void splitJacobian(const MatrixConstRef & J, const VariableVector & vars, bool keepProperties = false)
175  { splitJacobian(J, vars.variables(), keepProperties); }
176 
177  // cache
178  Eigen::VectorXd value_;
179  utils::internal::MapWithVariableAsKey<MatrixWithProperties, slice_matrix, true> jacobian_;
180 
181 protected:
183  void resize(int m);
184 
185  Space imageSpace_; // output space
187  utils::internal::MapWithVariableAsKey<bool, slice_linear> linear_;
188 };
189 
190 inline const Eigen::VectorXd & FirstOrderProvider::value() const { return value_; }
191 
193 { return jacobian_.at(&x, tvm::utils::internal::with_sub{}); }
194 
195 inline bool FirstOrderProvider::linearIn(const Variable & x) const
196 { return linear_.at(&x, tvm::utils::internal::with_sub{}); }
197 
198 inline const Space & FirstOrderProvider::imageSpace() const { return imageSpace_; }
199 
200 inline int FirstOrderProvider::size() const { return imageSpace_.size(); }
201 
202 inline int FirstOrderProvider::rSize() const { return imageSpace_.rSize(); }
203 inline int FirstOrderProvider::tSize() const { return imageSpace_.tSize(); }
204 
205 inline const VariableVector & FirstOrderProvider::variables() const { return variables_; }
206 
207 } // namespace tvm::internal
#define SET_OUTPUTS(SelfT,...)
Definition: Outputs.h:113
#define TVM_DLLAPI
Definition: api.h:35
Definition: Range.h:19
int dim
Definition: Range.h:24
int start
Definition: Range.h:23
Definition: Space.h:33
int size() const
int rSize() const
int tSize() const
Definition: VariableVector.h:41
const std::vector< VariablePtr > & variables() const
Definition: Variable.h:49
Definition: Node.h:27
Definition: FirstOrderProvider.h:43
int size() const
Definition: FirstOrderProvider.h:200
VariableVector variables_
Definition: FirstOrderProvider.h:186
int rSize() const
Definition: FirstOrderProvider.h:202
void addVariable(const VariableVector &v, bool linear)
virtual MatrixConstRefWithProperties jacobian(const Variable &x) const
Definition: FirstOrderProvider.h:192
utils::internal::MapWithVariableAsKey< MatrixWithProperties, slice_matrix, true > jacobian_
Definition: FirstOrderProvider.h:179
void splitJacobian(const MatrixConstRef &J, const std::vector< VariablePtr > &vars, bool keepProperties=false)
const VariableVector & variables() const
Definition: FirstOrderProvider.h:205
int tSize() const
Definition: FirstOrderProvider.h:203
utils::internal::MapWithVariableAsKey< bool, slice_linear > linear_
Definition: FirstOrderProvider.h:187
void addVariable(VariablePtr v, bool linear)
virtual const Eigen::VectorXd & value() const
Definition: FirstOrderProvider.h:190
Eigen::VectorXd value_
Definition: FirstOrderProvider.h:178
virtual void addVariable_(VariablePtr)
Space imageSpace_
Definition: FirstOrderProvider.h:185
void removeVariable(VariablePtr v)
bool linearIn(const Variable &x) const
Definition: FirstOrderProvider.h:195
virtual void removeVariable_(VariablePtr)
void splitJacobian(const MatrixConstRef &J, const VariableVector &vars, bool keepProperties=false)
Definition: FirstOrderProvider.h:174
const Space & imageSpace() const
Definition: FirstOrderProvider.h:198
Definition: MatrixProperties.h:17
@ ZERO
Definition: MatrixProperties.h:39
bool isConstant() const
Definition: MatrixProperties.h:217
bool isZero() const
Definition: MatrixProperties.h:235
Definition: MatrixWithProperties.h:54
const MatrixProperties & properties() const
Definition: MatrixWithProperties.h:130
Definition: CallbackManager.h:12
ObjectWithProperties< Eigen::Ref< const Eigen::MatrixXd > > MatrixConstRefWithProperties
Definition: MatrixWithProperties.h:164
std::shared_ptr< Variable > VariablePtr
Definition: defs.h:65
Eigen::Ref< const Eigen::MatrixXd > MatrixConstRef
Definition: defs.h:48
Definition: FirstOrderProvider.h:76
static bool get(bool &b, const Range &)
Definition: FirstOrderProvider.h:79
bool ConstType
Definition: FirstOrderProvider.h:78
bool Type
Definition: FirstOrderProvider.h:77
static bool get(const bool &b, const Range &)
Definition: FirstOrderProvider.h:80
Definition: FirstOrderProvider.h:84
static MatrixProperties slice(const MatrixProperties &p)
Definition: FirstOrderProvider.h:87
static Type get(MatrixWithProperties &M, const Range &r)
Definition: FirstOrderProvider.h:94
static ConstType get(const MatrixWithProperties &M, const Range &r)
Definition: FirstOrderProvider.h:96
Definition: MatrixProperties.h:65