Loading...
Searching...
No Matches
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
11namespace 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,
55 const std::string& jobName)
56 {
57 std::ostringstream oss;
59 ::CppAD::cg::ArrayView<CG> dependent_av(dependent_.data(), dependent_.size());
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",
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",
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"))
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