Пример #1
0
// 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);
}
Пример #2
0
    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;
	}
Пример #3
0
    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);
    }