24 determineJacobianSparsity();
27 std::map<size_t, std::vector<size_t> > elements;
28 for (
size_t e = 0;
e < _jacSparsity.rows.size();
e++) {
29 elements[_jacSparsity.cols[
e]].push_back(_jacSparsity.rows[
e]);
32 if (!_loopTapes.empty()) {
36 prepareSparseForwardOneWithLoops(elements);
43 startingJob(
"'model (forward one)'", JobTimer::SOURCE_GENERATION);
45 if (isAtomicsUsed()) {
46 generateSparseForwardOneSourcesWithAtomics(elements);
48 generateSparseForwardOneSourcesNoAtomics(elements);
55 generateGlobalDirectionalFunctionSource(FUNCTION_SPARSE_FORWARD_ONE,
57 FUNCTION_FORWARD_ONE_SPARSITY,
68 size_t n = _fun.Domain();
72 const std::string
jobName =
"model (forward one)";
73 startingJob(
"'" +
jobName +
"'", JobTimer::SOURCE_GENERATION);
75 for (
const auto&
it : elements) {
77 const std::vector<size_t>& rows =
it.second;
80 _cache <<
"model (forward one, indep " <<
j <<
")";
83 startingJob(
"'" +
subJobName +
"'", JobTimer::GRAPH);
91 for (
size_t i = 0;
i <
n;
i++) {
99 dx.setValue(Base(1.0));
107 CPPADCG_ASSERT_UNKNOWN(
dy.size() == _fun.Range());
110 for (
size_t it2 : rows) {
117 langC.setMaxAssignmentsPerFunction(_maxAssignPerFunc, &_sources);
118 langC.setMaxOperationsPerAssignment(_maxOperationsPerAssignment);
119 langC.setParameterPrecision(_parameterPrecision);
121 _cache << _name <<
"_" << FUNCTION_SPARSE_FORWARD_ONE <<
"_indep" <<
j;
122 langC.setGenerateFunction(_cache.str());
124 std::ostringstream
code;
125 std::unique_ptr<VariableNameGenerator<Base> > nameGen(createVariableNameGenerator(
"dy"));
139 size_t n = _fun.Domain();
142 handler.setJobTimer(_jobTimer);
147 for (
size_t i = 0;
i <
n;
i++) {
148 x[
i].setValue(_x[
i]);
155 dx.setValue(Base(1.0));
161 _fun.SparseJacobianForward(x, _jacSparsity.sparsity, _jacSparsity.rows, _jacSparsity.cols,
jacFlat,
work);
166 std::map<size_t, vector<CGBase> > jac;
167 std::map<size_t, std::map<size_t, size_t> >
positions;
169 for (
const auto&
it : elements) {
171 const std::vector<size_t>&
column =
it.second;
176 for (
size_t e = 0;
e <
column.size();
e++) {
182 for (
size_t el = 0;
el < _jacSparsity.rows.size();
el++) {
183 size_t i = _jacSparsity.rows[
el];
184 size_t j = _jacSparsity.cols[
el];
194 typename std::map<size_t, vector<CGBase> >::iterator
itJ;
195 for (
itJ = jac.begin();
itJ != jac.end(); ++
itJ) {
196 size_t j =
itJ->first;
200 _cache <<
"model (forward one, indep " <<
j <<
")";
204 langC.setMaxAssignmentsPerFunction(_maxAssignPerFunc, &_sources);
205 langC.setMaxOperationsPerAssignment(_maxOperationsPerAssignment);
206 langC.setParameterPrecision(_parameterPrecision);
208 _cache << _name <<
"_" << FUNCTION_SPARSE_FORWARD_ONE <<
"_indep" <<
j;
209 langC.setGenerateFunction(_cache.str());
211 std::ostringstream
code;
212 std::unique_ptr<VariableNameGenerator<Base> > nameGen(createVariableNameGenerator(
"dy"));
static void printFunctionDeclaration(std::ostringstream &out, const std::string &returnType, const std::string &functionName, const std::vector< std::string > &arguments, const std::vector< std::string > &arguments2={})