4 #ifndef __pycppad_codegen_code_handler_hpp__
5 #define __pycppad_codegen_code_handler_hpp__
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>
16 namespace bp = boost::python;
18 template<
typename Scalar>
20 :
public bp::def_visitor< CodeHandlerVisitor<Scalar> >
23 typedef ::CppAD::cg::CG<Scalar>
CG;
24 typedef ::CppAD::AD<CG>
ADCG;
25 typedef ::CppAD::AD<Scalar>
AD;
27 typedef Eigen::Matrix<AD,Eigen::Dynamic,1>
VectorAD;
29 typedef Eigen::Matrix<CG,Eigen::Dynamic,1>
VectorCG;
40 template<
typename Vector>
44 ::CppAD::cg::ArrayView<typename Vector::Scalar> independent_av(x_.data(), x_.size());
45 self.makeVariables(independent_av);
50 template<
typename LangType,
typename NameGenType>
55 const std::string& jobName)
57 std::ostringstream oss;
59 ::CppAD::cg::ArrayView<CG> dependent_av(dependent_.data(), dependent_.size());
60 dependent = dependent_;
61 self.generateCode(oss, lang, dependent_av, nameGen, jobName);
68 template<
class PyClass>
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"))
76 static_cast<void (
CodeHandler::*)(
CG&)
>(&CodeHandler::makeVariable),
77 bp::args(
"self",
"variable"),
78 "Marks the provided variable as being an independent variable.\n"
80 "\tvariable: the variables that will become independent variable")
83 bp::args(
"self",
"variable"),
84 "Marks the provided variable as being an independent variable.\n"
86 "\tvariable: the variables that will become independent variable"
89 &makeVariables<VectorCG>,
90 bp::args(
"self",
"variables"),
91 "Marks the provided variables as being independent variables.\n"
93 "\tvariables: the vector of variables that will become independent variables")
95 &makeVariables<VectorADCG>,
96 bp::args(
"self",
"variables"),
97 "Marks the provided variables as being independent variables.\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"))
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"
116 "\tid: the atomic function ID.")
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"
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.")
133 static void expose(
const std::string & class_name =
"CodeHandler")
136 boost::noncopyable>(class_name.c_str(),
137 "Helper class to analyze the operation graph"
138 "and generate source code for several languages",
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