@@ -27,31 +27,37 @@ 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+ template <typename Vector>
41+ static void makeVariables (CodeHandler& self, Eigen::Ref<Vector> x)
3942 {
40- VectorType& x_= const_cast <VectorType&>(x);
41- self.makeVariables (x_);
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_;
4247 return ;
4348 }
4449
45- template <typename VectorType, typename LangType, typename NameGenType>
50+ template <typename LangType, typename NameGenType>
4651 static std::string generateCode (CodeHandler& self,
4752 LangType& lang,
48- const VectorType& dependent,
53+ RefVectorCG dependent,
4954 NameGenType& nameGen,
5055 const std::string& jobName)
5156 {
5257 std::ostringstream oss;
53- VectorType& dependent_= const_cast <VectorType&>(dependent);
54- ::CppAD::cg::ArrayView<typename VectorType::Scalar> dependent_av (dependent_.data (), dependent_.size ());
58+ VectorCG dependent_ (dependent);
59+ ::CppAD::cg::ArrayView<CG> dependent_av (dependent_.data (), dependent_.size ());
60+ dependent = dependent_;
5561 self.generateCode (oss, lang, dependent_av, nameGen, jobName);
5662 return oss.str ();
5763 }
@@ -86,19 +92,7 @@ namespace pycppad
8692 " Parameters:\n "
8793 " \t variables: the vector of variables that will become independent variables" )
8894 .def (" makeVariables" ,
89- &CodeHandler::template makeVariables<RowVectorADCG>,
90- bp::args (" self" , " variables" ),
91- " Marks the provided variables as being independent variables.\n "
92- " Parameters:\n "
93- " \t variables: the vector of variables that will become independent variables" )
94- .def (" makeVariables" ,
95- &CodeHandler::template makeVariables<VectorCG>,
96- bp::args (" self" , " variables" ),
97- " Marks the provided variables as being independent variables.\n "
98- " Parameters:\n "
99- " \t variables: the vector of variables that will become independent variables" )
100- .def (" makeVariables" ,
101- &CodeHandler::template makeVariables<RowVectorCG>,
95+ &makeVariables<VectorADCG>,
10296 bp::args (" self" , " variables" ),
10397 " Marks the provided variables as being independent variables.\n "
10498 " Parameters:\n "
@@ -122,18 +116,7 @@ namespace pycppad
122116 " \t id: the atomic function ID." )
123117 // .def("getExternalFuncMaxForwardOrder", &CodeHandler::getExternalFuncMaxForwardOrder, bp::arg("self"))
124118 // .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- " \t lang: The targeted language.\n "
130- " \t dependent: 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- " \t nameGen: Provides the rules for variable name creation. data related to the model\n "
135- " \t jobName: Name of this job." )
136- .def (" generateCode" , &generateCode<RowVectorCG, LanguageC, LangCDefaultVariableNameGenerator>,
119+ .def (" generateCode" , &generateCode<LanguageC, LangCDefaultVariableNameGenerator>,
137120 (bp::arg (" self" ), bp::arg (" lang" ), bp::arg (" dependent" ), bp::arg (" nameGen" ), bp::arg (" jobName" )=" source" ),
138121 " Creates the source code from the operations registered so far.\n "
139122 " Parameters:\n "
0 commit comments