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);
   }
}
Beispiel #2
0
 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;
  }