void ExprTermCompare( const SymbolicExpr &e1, const SymbolicVal& v2, Matrix<CompareRel> &result, MapObject<SymbolicVal,SymbolicBound>* f) { if (DebugCompareVal()) std::cerr << " in ExprTermCompare1 \n"; int i = 0; for (SymbolicExpr::OpdIterator p1 = e1.GetOpdIterator(); !p1.ReachEnd(); ++p1,++i) { SymbolicVal v1 = e1.Term2Val(p1.Current()); int j = 0; result(i,j) = CompareValHelp(v1, v2, f); } }
void VisitExpr( const SymbolicExpr &v) { if (target.GetValType() == VAL_EXPR && cur == target) result = true; else { for (SymbolicExpr::OpdIterator iter = v.GetOpdIterator(); !iter.ReachEnd(); iter.Advance()) { SymbolicVal tmp = v.Term2Val(iter.Current()); cur = tmp; cur.Visit(this); if (result) break; } } }
void VisitExpr( const SymbolicExpr& v) { switch (v.GetOpType()) { case SYMOP_MULTIPLY: case SYMOP_PLUS: Default0(); break; case SYMOP_MIN: case SYMOP_MAX: Default1(v1,v2); if (result == REL_UNKNOWN) result = (index == 1)? SelectCompare(v1,v,GetFunc())(v2) : Reverse(SelectCompare(v2,v,GetFunc())(v1)); break; default: assert(false); } }
virtual void VisitExpr( const SymbolicExpr& e2) { SymOpType t1 = e1.GetOpType(), t2 = e2.GetOpType(); unsigned c1 = e1.NumOfOpds(), c2 = e2.NumOfOpds(); if (t2 == SYMOP_MULTIPLY || t2 == SYMOP_PLUS ) Default0(); else if (t1 == t2) { Matrix<CompareRel> rel(c1,c2,0); ExprTermCompare(e1,e2,rel,GetFunc()); MatchCompare(rel,c2); } else if (t1 == SYMOP_MIN && t2 == SYMOP_MAX) { size_t le = 0, lt = 0, ge = 0, gt = 0; SymbolicExpr::OpdIterator p2 = e2.GetOpdIterator(); for ( ; !p2.ReachEnd(); ++p2) { CompareRel r = CompareValHelp(v1, e2.Term2Val(p2.Current()),GetFunc()); if (CountLE(r)) ++le; if (CountGE(r)) ++ge; if (CountLT(r)) ++lt; if (CountGT(r)) ++gt; } if (gt == e2.NumOfOpds()) result = REL_GT; else if (lt > 0) result = REL_LT; else if (ge == e2.NumOfOpds()) result = REL_GE; else if (le > 0) result = REL_LE; } else if (t1 == SYMOP_MAX && t2 == SYMOP_MIN) result = Reverse( SelectCompare(v2, e2, GetFunc())(v1) ); else assert(false); }
virtual void VisitExpr( const SymbolicExpr& v) { SymbolicVal in1, fr1; bool _hasfrac = hasfrac; SymbolicExpr::OpdIterator opds = v.GetOpdIterator(); for ( ; !opds.ReachEnd(); ++opds) { if (operator()(v.Term2Val(*opds), inp, frp)) { _hasfrac = true; break; } } if (opds.ReachEnd()) { if (inp != 0) *inp = v; } else { if (inp == 0 && frp == 0) return; SymbolicExpr* inv = (inp == 0)? 0 : v.DistributeExpr(SYMOP_NIL, SymbolicVal()); SymbolicExpr* frv = (frp == 0)? 0 : v.DistributeExpr(SYMOP_NIL, SymbolicVal()); SymbolicExpr::OpdIterator opd1 = v.GetOpdIterator(); for ( ; opd1 != opds ; ++opd1) { if (inv != 0) inv->AddOpd(*opd1); if (frv != 0) frv->AddOpd(*opd1); } if (inv != 0) inv->ApplyOpd(*inp); if (frv != 0) frv->ApplyOpd(*frp); for (++opd1; !opd1.ReachEnd(); ++opd1) { SymbolicVal cur = v.Term2Val(*opd1); if (operator()(cur, inp, frp)) { if (inv != 0) inv->ApplyOpd(*inp); if (frv != 0) frv->ApplyOpd(*frp); } else { if (inv != 0) inv->AddOpd(*opd1); if (frv != 0) frv->AddOpd(*opd1); } } if (inp != 0) *inp = GetExprVal(inv); if (frp != 0) *frp = GetExprVal(frv); } hasfrac = _hasfrac; }