@@ -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 " \t variable: 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 " \t id: 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- " \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>,
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