code-handler.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2021 INRIA
3  */
4 #ifndef __pycppad_codegen_code_handler_hpp__
5 #define __pycppad_codegen_code_handler_hpp__
6 
7 #include <cppad/cg/code_handler.hpp>
8 #include <cppad/cg/lang/c/language_c.hpp>
9 #include <cppad/cg/lang/c/lang_c_default_var_name_gen.hpp>
10 
11 namespace pycppad
12 {
13  namespace codegen
14  {
15 
16  namespace bp = boost::python;
17 
18  template<typename Scalar>
20  : public bp::def_visitor< CodeHandlerVisitor<Scalar> >
21  {
22  public:
23  typedef ::CppAD::cg::CG<Scalar> CG;
24  typedef ::CppAD::AD<CG> ADCG;
25  typedef ::CppAD::AD<Scalar> AD;
26  typedef Eigen::Matrix<ADCG,Eigen::Dynamic,1> VectorADCG;
27  typedef Eigen::Matrix<AD,Eigen::Dynamic,1> VectorAD;
28  typedef Eigen::Matrix<ADCG,1,Eigen::Dynamic> RowVectorADCG;
29  typedef Eigen::Matrix<CG,Eigen::Dynamic,1> VectorCG;
30  typedef Eigen::Matrix<CG,1,Eigen::Dynamic> RowVectorCG;
31  typedef Eigen::Ref<VectorCG> RefVectorCG;
32  typedef Eigen::Ref<RowVectorCG> RefRowVectorCG;
33  typedef ::CppAD::cg::CodeHandler<Scalar> CodeHandler;
34  typedef ::CppAD::cg::LanguageC<Scalar> LanguageC;
35  typedef ::CppAD::cg::LangCDefaultVariableNameGenerator<Scalar> LangCDefaultVariableNameGenerator;
36 
37 
38  protected:
39 
40  template<typename Vector>
41  static void makeVariables(CodeHandler& self, Eigen::Ref<Vector> x)
42  {
43  Vector x_(x);
44  ::CppAD::cg::ArrayView<typename Vector::Scalar> independent_av(x_.data(), x_.size());
45  self.makeVariables(independent_av);
46  x = x_;
47  return;
48  }
49 
50  template<typename LangType, typename NameGenType>
51  static std::string generateCode(CodeHandler& self,
52  LangType& lang,
53  RefVectorCG dependent,
54  NameGenType& nameGen,
55  const std::string& jobName)
56  {
57  std::ostringstream oss;
58  VectorCG dependent_(dependent);
59  ::CppAD::cg::ArrayView<CG> dependent_av(dependent_.data(), dependent_.size());
60  dependent = dependent_;
61  self.generateCode(oss, lang, dependent_av, nameGen, jobName);
62  return oss.str();
63  }
64 
65 
66  public:
67 
68  template<class PyClass>
69  void visit(PyClass& cl) const
70  {
71  cl
72  .def(bp::init<size_t>(bp::args("self","varCount")))
73  .def("setReuseVariableIDs", &CodeHandler::setReuseVariableIDs, bp::args("self", "reuse"))
74  .def("isReuseVariableIDs", &CodeHandler::isReuseVariableIDs, bp::arg("self"))
75  .def("makeVariable",
76  static_cast<void (CodeHandler::*)(CG&)>(&CodeHandler::makeVariable),
77  bp::args("self", "variable"),
78  "Marks the provided variable as being an independent variable.\n"
79  "Parameters:\n"
80  "\tvariable: the variables that will become independent variable")
81  .def("makeVariable",
82  static_cast<void (CodeHandler::*)(ADCG&)>(&CodeHandler::makeVariable),
83  bp::args("self", "variable"),
84  "Marks the provided variable as being an independent variable.\n"
85  "Parameters:\n"
86  "\tvariable: the variables that will become independent variable"
87  )
88  .def("makeVariables",
89  &makeVariables<VectorCG>,
90  bp::args("self", "variables"),
91  "Marks the provided variables as being independent variables.\n"
92  "Parameters:\n"
93  "\tvariables: the vector of variables that will become independent variables")
94  .def("makeVariables",
95  &makeVariables<VectorADCG>,
96  bp::args("self", "variables"),
97  "Marks the provided variables as being independent variables.\n"
98  "Parameters:\n"
99  "\tvariables: the vector of variables that will become independent variables")
100  .def("getIndependentVariableSize", &CodeHandler::getIndependentVariableSize, bp::arg("self"))
101  .def("getIndependentVariableIndex", &CodeHandler::getIndependentVariableIndex, bp::args("self", "var"))
102  .def("getMaximumVariableID", &CodeHandler::getMaximumVariableID, bp::arg("self"))
103  .def("isVerbose", &CodeHandler::isVerbose, bp::arg("self"))
104  .def("setVerbose", &CodeHandler::setVerbose, bp::arg("self"))
105  //.def("getJobTimer", &CodeHandler::getJobTimer, bp::arg("self"))
106  //.def("setJobTimer", &CodeHandler::setJobTimer, bp::args("self", "jobTimer"))
107  .def("isZeroDependents", &CodeHandler::isZeroDependents, bp::arg("self"))
108  .def("setZeroDependents", &CodeHandler::setZeroDependents, bp::args("self", "zeroDependents"))
109  .def("getOperationTreeVisitId", &CodeHandler::getOperationTreeVisitId, bp::arg("self"))
110  .def("startNewOperationTreeVisit", &CodeHandler::startNewOperationTreeVisit, bp::arg("self"))
111  .def("isVisited", &CodeHandler::isVisited, bp::args("self", "node"))
112  .def("markVisited", &CodeHandler::markVisited, bp::args("self", "node"))
113  .def("getAtomicFunctionName", &CodeHandler::getAtomicFunctionName, bp::args("self", "id"),
114  "Provides the name used by an atomic function with a given ID.\n"
115  "Parameters:\n"
116  "\tid: the atomic function ID.")
117  //.def("getExternalFuncMaxForwardOrder", &CodeHandler::getExternalFuncMaxForwardOrder, bp::arg("self"))
118  //.def("getExternalFuncMaxReverseOrder", &CodeHandler::getExternalFuncMaxReverseOrder, bp::arg("self"))
119  .def("generateCode", &generateCode<LanguageC, LangCDefaultVariableNameGenerator>,
120  (bp::arg("self"), bp::arg("lang"), bp::arg("dependent"), bp::arg("nameGen"), bp::arg("jobName")="source"),
121  "Creates the source code from the operations registered so far.\n"
122  "Parameters:\n"
123  "\tlang: The targeted language.\n"
124  "\tdependent: The dependent variables for which the source code\n"
125  " should be generated. By defining this vector the \n"
126  " number of operations in the source code can be\n"
127  " reduced and thus providing a more optimized code.\n"
128  "\tnameGen: Provides the rules for variable name creation. data related to the model\n"
129  "\tjobName: Name of this job.")
130  ;
131  }
132 
133  static void expose(const std::string & class_name = "CodeHandler")
134  {
135  bp::class_<CodeHandler,
136  boost::noncopyable>(class_name.c_str(),
137  "Helper class to analyze the operation graph"
138  "and generate source code for several languages",
139  bp::no_init)
141  }
142  };
143 
144  }
145 }
146 #endif //#ifndef __pycppad_codegen_code_handler_hpp__
Definition: code-handler.hpp:21
Eigen::Ref< VectorCG > RefVectorCG
Definition: code-handler.hpp:31
::CppAD::AD< Scalar > AD
Definition: code-handler.hpp:25
::CppAD::cg::LanguageC< Scalar > LanguageC
Definition: code-handler.hpp:34
::CppAD::AD< CG > ADCG
Definition: code-handler.hpp:24
Eigen::Ref< RowVectorCG > RefRowVectorCG
Definition: code-handler.hpp:32
Eigen::Matrix< ADCG, Eigen::Dynamic, 1 > VectorADCG
Definition: code-handler.hpp:26
Eigen::Matrix< ADCG, 1, Eigen::Dynamic > RowVectorADCG
Definition: code-handler.hpp:28
Eigen::Matrix< CG, Eigen::Dynamic, 1 > VectorCG
Definition: code-handler.hpp:29
static void makeVariables(CodeHandler &self, Eigen::Ref< Vector > x)
Definition: code-handler.hpp:41
Eigen::Matrix< CG, 1, Eigen::Dynamic > RowVectorCG
Definition: code-handler.hpp:30
Eigen::Matrix< AD, Eigen::Dynamic, 1 > VectorAD
Definition: code-handler.hpp:27
static void expose(const std::string &class_name="CodeHandler")
Definition: code-handler.hpp:133
::CppAD::cg::CodeHandler< Scalar > CodeHandler
Definition: code-handler.hpp:33
void visit(PyClass &cl) const
Definition: code-handler.hpp:69
static std::string generateCode(CodeHandler &self, LangType &lang, RefVectorCG dependent, NameGenType &nameGen, const std::string &jobName)
Definition: code-handler.hpp:51
::CppAD::cg::CG< Scalar > CG
Definition: code-handler.hpp:23
::CppAD::cg::LangCDefaultVariableNameGenerator< Scalar > LangCDefaultVariableNameGenerator
Definition: code-handler.hpp:35
Definition: ad.hpp:15