// Reformulate explicit user constraint so it matches the format of the constraint parser string ConstraintFomatter::consToFormula(const Model & model, const CompID ID) { string formula; // Resulting formula specifying all the constraints formula = "tt"; for (const string constraint : model.components[ID].constraints) { try { formula.append(" & " + addBrackets(formatConstraint(constraint, model, ID))); } catch (exception & e) { throw runtime_error("Error while parsing the constraint: " + quote(constraint) + ". " + e.what()); } } return addBrackets(formula); }
static string addBrackets(string s) { int i = 0; while (i<s.length()) { if (i<s.length()-1 && isOp(s[i]) && isOp(s[i+1])) { string f = s.substr(0,i+1); return f + "(" + addBrackets(s.substr(i+1,s.length()-i-1)) + ")"; } i++; } return s; }
static long double eval(string s, int* error) { int len = s.length(); /*** WHITE SPACES DELETING ***/ s = eliminateWhiteSpaces(s, error); /*** WHITE SPACES DELETING ***/ /*** BRACKET DELETING ***/ s = trimBrackets(s, error); /*** BRACKET DELETING ***/ /*** ADD BRACKETS BETWEEN OPERATORS ***/ s = addBrackets(s); /*** ADD BRACKETS BETWEEN OPERATORS ***/ if (s.length()==0) { if (s.length()!=len) { *error = 1; } return 0; } if (*error == 1) { return 0; } /*** CALCULATING THE NUMBER OF PARANTHESIS IN EACH POSITION ***/ stack<int> ps; int brs[201]; for (int i = 0; i<s.length();i++) { char a = s[i]; if (a=='(') ps.push(1); else if (a==')') { if (ps.size()==0) { *error = 1; return 0; } else ps.pop(); } brs[i] = ps.size(); } if (ps.size() != 0) { *error = 1; return 0; } int pl = s.rfind("+"), mn = s.rfind("-"), mp = s.rfind("*"), dv = s.rfind("/"), sn = s.find("sin("), cs = s.find("cos("); if (pl != -1) { int p = s.length()-1; while (s.rfind("+",p)!=-1) { int i = s.rfind("+",p); if (brs[i] == 0) { string s1 = s.substr(0,i), s2 = s.substr(i+1,s.length()-i-1); if (s2.length() == 0) { *error = 1; return 0; } long double val1 = eval(s1, error); long double val2 = eval(s2, error); return val1+val2; } p = i-1; if(p<0) break; } } if (mn != -1) { int p = s.length()-1; while (s.rfind("-",p)!=-1) { int i = s.rfind("-",p); if (brs[i] == 0) { string s1 = s.substr(0,i), s2 = s.substr(i+1,s.length()-i-1); if (s2.length() == 0) { *error = 1; return 0; } long double val1 = eval(s1, error); long double val2 = eval(s2, error); return val1-val2; } p = i-1; if(p<0) break; } } if (mp != -1) { int p = s.length()-1; while (s.rfind("*",p)!=-1) { int i = s.rfind("*",p); if (brs[i] == 0) { string s1 = s.substr(0,i), s2 = s.substr(i+1,s.length()-i-1); if (s1.length() == 0 || s2.length() == 0) { *error = 1; return 0; } long double val1 = eval(s1, error); long double val2 = eval(s2, error); return val1*val2; } p = i-1; if(p<0) break; } } if (dv != -1) { int p = s.length()-1; while (s.rfind("/",p)!=-1) { int i = s.rfind("/",p); if (brs[i] == 0) { string s1 = s.substr(0,i), s2 = s.substr(i+1,s.length()-i-1); if (s1.length() == 0 || s2.length() == 0) { *error = 1; return 0; } long double val1 = eval(s1, error); long double val2 = eval(s2, error); if (val2 == 0) { *error = 1; return 0; } return val1/val2; } p = i-1; if(p<0) break; } } if (cs != -1) { if (cs == 0 && brs[0] == 0) { string s1 = s.substr(4,s.length()-5); if (s[s.length()-1] != ')') { *error = 1; return 0; } if (s1.length()==0) { *error = 1; return 0; } long double val = cos(eval(s1, error)); return val; } } if (sn != -1) { if (sn == 0 && brs[0] == 0) { string s1 = s.substr(4,s.length()-5); if (s[s.length()-1] != ')') { *error = 1; return 0; } if (s1.length()==0) { *error = 1; return 0; } long double val = sin(eval(s1, error)); return val; } } return toString(s,error); }