1 #ifndef CPPAD_CG_LANGUAGE_DOT_INDEX_PATTERNS_INCLUDED 2 #define CPPAD_CG_LANGUAGE_DOT_INDEX_PATTERNS_INCLUDED 22 inline void LanguageDot<Base>::generateNames4RandomIndexPatterns(
const std::set<RandomIndexPattern*>& randomPatterns) {
23 std::ostringstream os;
25 std::set<std::string> usedNames;
29 for (RandomIndexPattern* ip : randomPatterns) {
30 if (!ip->getName().empty()) {
31 usedNames.insert(ip->getName());
37 for (RandomIndexPattern* ip : randomPatterns) {
38 if (ip->getName().empty()) {
42 os << _C_STATIC_INDEX_ARRAY << c;
46 }
while (usedNames.find(name) != usedNames.end());
56 const std::set<RandomIndexPattern*>& randomPatterns) {
57 if (randomPatterns.empty())
60 _code <<
"subgraph index {" << _endline;
61 _code <<
" rank=same" << _endline;
63 os <<
"idx_" << ip->getName() <<
"[label=\"";
64 if (ip->getType() == IndexPatternType::Random1D) {
69 const std::map<size_t, size_t>& x2y = ip1->getValues();
71 std::vector<size_t> y(x2y.rbegin()->first + 1);
72 for (
const std::pair<size_t, size_t>& p : x2y)
73 y[p.first] = p.second;
75 printStaticIndexArray(os, ip->getName(), y);
77 CPPADCG_ASSERT_UNKNOWN(ip->getType() == IndexPatternType::Random2D);
82 printStaticIndexMatrix(os, ip->getName(), ip2->getValues());
88 _code <<
"}" << _endline;
93 const std::string& name,
94 const std::vector<size_t>& values) {
96 for (
size_t i = 0; i < values.size(); i++) {
106 const std::string& name,
107 const std::map<
size_t, std::map<size_t, size_t> >& values) {
108 std::map<size_t, std::map<size_t, size_t> >::const_iterator it;
109 std::map<size_t, size_t>::const_iterator ity2z;
112 for (it = values.begin(); it != values.end(); ++it) {
113 if (it != values.begin())
114 os << it->first <<
",\\n";
115 os << it->first <<
":[";
117 for (ity2z = it->second.begin(); ity2z != it->second.end(); ++ity2z) {
118 if (ity2z->first != y) {
119 while (ity2z->first != y) {
120 if (y > 0) os <<
", ";
126 if (y > 0) os <<
", ";
140 indexPattern2String(os, ip,{&index});
147 std::stringstream ss;
148 switch (ip.getType()) {
149 case IndexPatternType::Linear:
151 CPPADCG_ASSERT_KNOWN(indexes.size() == 1,
"Invalid number of indexes");
153 linearIndexPattern2String(os, lip, *indexes[0]);
156 case IndexPatternType::Sectioned:
158 CPPADCG_ASSERT_KNOWN(indexes.size() == 1,
"Invalid number of indexes");
160 const std::map<size_t, IndexPattern*>& sections = lip->getLinearSections();
161 size_t sSize = sections.size();
162 CPPADCG_ASSERT_UNKNOWN(sSize > 1);
164 std::map<size_t, IndexPattern*>::const_iterator its = sections.begin();
165 for (
size_t s = 0; s < sSize - 1; s++) {
168 size_t xStart = its->first;
170 os << (*indexes[0]->getName()) <<
" < " << xStart <<
")? ";
171 indexPattern2String(os, *lp, *indexes[0]);
174 indexPattern2String(os, *its->second, *indexes[0]);
179 case IndexPatternType::Plane2D:
181 CPPADCG_ASSERT_KNOWN(indexes.size() >= 1,
"Invalid number of indexes");
183 bool useParens = pip.getPattern1() !=
nullptr && pip.getPattern2() !=
nullptr;
185 if (useParens) os <<
"(";
187 if (pip.getPattern1() !=
nullptr)
188 indexPattern2String(os, *pip.getPattern1(), *indexes[0]);
190 if (useParens) os <<
") + (";
192 if (pip.getPattern2() !=
nullptr)
193 indexPattern2String(os, *pip.getPattern2(), *indexes.back());
195 if (useParens) os <<
")";
199 case IndexPatternType::Random1D:
201 CPPADCG_ASSERT_KNOWN(indexes.size() == 1,
"Invalid number of indexes");
203 CPPADCG_ASSERT_KNOWN(!rip.getName().empty(),
"Invalid name for array");
204 os << rip.getName() <<
"[" << (*indexes[0]->getName()) <<
"]";
207 case IndexPatternType::Random2D:
209 CPPADCG_ASSERT_KNOWN(indexes.size() == 2,
"Invalid number of indexes");
211 CPPADCG_ASSERT_KNOWN(!rip.getName().empty(),
"Invalid name for array");
212 os << rip.getName() <<
213 "[" << (*indexes[0]->getName()) <<
"]" 214 "[" << (*indexes[1]->getName()) <<
"]";
218 CPPADCG_ASSERT_UNKNOWN(
false);
227 long dy = lip.getLinearSlopeDy();
228 long dx = lip.getLinearSlopeDx();
229 long b = lip.getLinearConstantTerm();
230 long xOffset = lip.getXOffset();
238 os <<
" -" << xOffset <<
")";
const std::string * getName() const
void printRandomIndexPatternDeclaration(std::ostringstream &os, const std::set< RandomIndexPattern *> &randomPatterns)