assert(number_shifts >0); // shouldn't be odd.
}
- bool BVSolver::DoNotSolveThis(const ASTNode& var)
- {
- return (DoNotSolve_TheseVars.find(var) != DoNotSolve_TheseVars.end());
- }
-
//chooses a variable in the lhs and returns the chosen variable
ASTNode BVSolver::ChooseMonom(const ASTNode& eq, ASTNode& modifiedlhs, ASTNodeSet& checked)
{
(
SYMBOL == monom.GetKind()
&& !chosen_symbol
- && !DoNotSolveThis(monom)
&& checked.find(monom)==checked.end()
&& !vars.VarSeenInTerm(monom,rhs)
)
BVUMINUS == monom.GetKind()
&& SYMBOL == monom[0].GetKind()
&& !chosen_symbol
- && !DoNotSolveThis(monom[0])
&& checked.find(monom[0])==checked.end()
&& !vars.VarSeenInTerm(monom[0],rhs)
)
&& BVCONST == monom[0].GetKind()
&& _simp->BVConstIsOdd(monom[0])
&& !chosen_symbol
- && !DoNotSolveThis(var)
&& checked.find(var)==checked.end()
&& ((SYMBOL == var.GetKind()
&& !vars.VarSeenInTerm(var,rhs)
&& SYMBOL == var[0].GetKind()
&& BVCONST == var[1].GetKind()
&& zero == var[2]
- && !DoNotSolveThis(var[0])
&& !vars.VarSeenInTerm(var[0],rhs)
))
)
&& SYMBOL == monom[0].GetKind()
&& BVCONST == monom[1].GetKind()
&& zero == monom[2]
- && !DoNotSolveThis(monom[0])
&& checked.find(monom[0])==checked.end()
&& !vars.VarSeenInTerm(monom[0],rhs)
)
&& SYMBOL == monom[0][0].GetKind()
&& BVCONST == monom[0][1].GetKind()
&& zero == monom[0][2]
- && !DoNotSolveThis(monom[0][0])
&& checked.find(monom[0][0])==checked.end()
&& !vars.VarSeenInTerm(monom[0][0],rhs)
)
{
case SYMBOL:
{
- DoNotSolve_TheseVars.insert(lhs);
-
//input is of the form x = rhs first make sure that the lhs
//symbol does not occur on the rhs or that it has not been
//solved for
&& BVCONST == lhs[1].GetKind()
&& zero == lhs[2]
&& !vars.VarSeenInTerm(lhs[0], rhs)
- && !DoNotSolveThis(lhs[0])))
+ ))
{
return eq;
}
if (vars.VarSeenInTerm(lhs[0], rhs))
{
- DoNotSolve_TheseVars.insert(lhs[0]);
return eq;
}
- DoNotSolve_TheseVars.insert(lhs[0]);
if (!_simp->UpdateSolverMap(lhs, rhs))
{
return eq;
if (vars.VarSeenInTerm(chosenvar, chosenvar_value))
{
//abort solving
- DoNotSolve_TheseVars.insert(lhs);
return eq;
}
return eq;
//found a variable to solve
- DoNotSolve_TheseVars.insert(chosenvar);
chosenvar = lhs[1];
if (!_simp->UpdateSolverMap(chosenvar, chosenvar_value))
{
//
ASTNode ASTTrue, ASTFalse, ASTUndefined;
- //solved variables list: If a variable has been solved for then do
- //not solve for it again
- ASTNodeSet DoNotSolve_TheseVars;
-
- //checks if var has been solved for or not. if yes, then return
- //true else return false
- bool DoNotSolveThis(const ASTNode& var);
-
//choose a suitable var from the term
ASTNode ChooseMonom(const ASTNode& eq, ASTNode& modifiedterm, ASTNodeSet& checked);
//accepts an equation and solves for a variable or a monom in it
void ClearAllTables(void)
{
- DoNotSolve_TheseVars.clear();
FormulasAlreadySolvedMap.clear();
} //End of ClearAllTables()