Skip to content

Commit 017e5f5

Browse files
committed
[code-handler] use Eigen::Ref for the independent and dependent variables in generateCode and makeVariables
1 parent 20cefc6 commit 017e5f5

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

include/pycppad/codegen/code-handler.hpp

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,36 @@ namespace pycppad
2727
typedef Eigen::Matrix<AD,Eigen::Dynamic,1> VectorAD;
2828
typedef Eigen::Matrix<ADCG,1,Eigen::Dynamic> RowVectorADCG;
2929
typedef Eigen::Matrix<CG,Eigen::Dynamic,1> VectorCG;
30-
typedef Eigen::Matrix<CG,1,Eigen::Dynamic> RowVectorCG;
30+
typedef Eigen::Matrix<CG,1,Eigen::Dynamic> RowVectorCG;
31+
typedef Eigen::Ref<VectorCG> RefVectorCG;
32+
typedef Eigen::Ref<RowVectorCG> RefRowVectorCG;
3133
typedef ::CppAD::cg::CodeHandler<Scalar> CodeHandler;
3234
typedef ::CppAD::cg::LanguageC<Scalar> LanguageC;
3335
typedef ::CppAD::cg::LangCDefaultVariableNameGenerator<Scalar> LangCDefaultVariableNameGenerator;
3436

3537

3638
protected:
37-
template<typename VectorType>
38-
static void makeVariables(CodeHandler& self, const VectorType& x)
39+
40+
static void makeVariables(CodeHandler& self, RefVectorCG x)
3941
{
40-
VectorType& x_= const_cast<VectorType&>(x);
41-
self.makeVariables(x_);
42+
VectorCG x_(x);
43+
::CppAD::cg::ArrayView<CG> independent_av(x_.data(), x_.size());
44+
self.makeVariables(independent_av);
45+
x = x_;
4246
return;
4347
}
4448

45-
template<typename VectorType, typename LangType, typename NameGenType>
49+
template<typename LangType, typename NameGenType>
4650
static std::string generateCode(CodeHandler& self,
4751
LangType& lang,
48-
const VectorType& dependent,
52+
RefVectorCG dependent,
4953
NameGenType& nameGen,
5054
const std::string& jobName)
5155
{
5256
std::ostringstream oss;
53-
VectorType& dependent_= const_cast<VectorType&>(dependent);
54-
::CppAD::cg::ArrayView<typename VectorType::Scalar> dependent_av(dependent_.data(), dependent_.size());
57+
VectorCG dependent_(dependent);
58+
::CppAD::cg::ArrayView<CG> dependent_av(dependent_.data(), dependent_.size());
59+
dependent = dependent_;
5560
self.generateCode(oss, lang, dependent_av, nameGen, jobName);
5661
return oss.str();
5762
}
@@ -80,7 +85,7 @@ namespace pycppad
8085
"\tvariable: the variables that will become independent variable"
8186
)
8287
.def("makeVariables",
83-
&makeVariables<VectorCG>,
88+
&makeVariables,
8489
bp::args("self", "variables"),
8590
"Marks the provided variables as being independent variables.\n"
8691
"Parameters:\n"
@@ -122,18 +127,7 @@ namespace pycppad
122127
"\tid: the atomic function ID.")
123128
//.def("getExternalFuncMaxForwardOrder", &CodeHandler::getExternalFuncMaxForwardOrder, bp::arg("self"))
124129
//.def("getExternalFuncMaxReverseOrder", &CodeHandler::getExternalFuncMaxReverseOrder, bp::arg("self"))
125-
.def("generateCode", &generateCode<VectorCG, LanguageC, LangCDefaultVariableNameGenerator>,
126-
(bp::arg("self"), bp::arg("lang"), bp::arg("dependent"), bp::arg("nameGen"), bp::arg("jobName")="source"),
127-
"Creates the source code from the operations registered so far.\n"
128-
"Parameters:\n"
129-
"\tlang: The targeted language.\n"
130-
"\tdependent: The dependent variables for which the source code\n"
131-
" should be generated. By defining this vector the \n"
132-
" number of operations in the source code can be\n"
133-
" reduced and thus providing a more optimized code.\n"
134-
"\tnameGen: Provides the rules for variable name creation. data related to the model\n"
135-
"\tjobName: Name of this job.")
136-
.def("generateCode", &generateCode<RowVectorCG, LanguageC, LangCDefaultVariableNameGenerator>,
130+
.def("generateCode", &generateCode<LanguageC, LangCDefaultVariableNameGenerator>,
137131
(bp::arg("self"), bp::arg("lang"), bp::arg("dependent"), bp::arg("nameGen"), bp::arg("jobName")="source"),
138132
"Creates the source code from the operations registered so far.\n"
139133
"Parameters:\n"

0 commit comments

Comments
 (0)