void Default0( const SymbolicVal &v1, const SymbolicVal &v2) { Default1(v1,v2); if (DebugCompareVal()) std::cerr << " in CompareOperator::Default \n"; if (result == REL_UNKNOWN) { int tmp = comparetime; SymbolicVal diff = v1 - v2; comparetime = tmp; if (diff.GetValType() == VAL_CONST) { int diffval = atoi( diff.toString().c_str()); if (diffval < 0) result = REL_LT; else if (diffval > 0) result = REL_GT; else result = REL_EQ; } else if (func != 0) { int tmp = comparetime; SymbolicBound b1 = GetValBound(v1,*func), b2 = GetValBound(v2,*func); comparetime = tmp; CompareRel ge1 = (b1.lb != v1)? CompareValHelp(b1.lb,v2,func) : REL_UNKNOWN; CompareRel le2 = (b2.ub != v2)? CompareValHelp(b2.ub,v1,func) : REL_UNKNOWN; CompareRel le1 = (b1.ub != v1)? CompareValHelp(b1.ub,v2,func) : REL_UNKNOWN; CompareRel ge2 = (b2.lb != v2)? CompareValHelp(b2.lb,v1,func) : REL_UNKNOWN; if (CountGT(ge1) || CountLT(le2)) result = REL_GT; else if (CountGE(ge1) || CountLE(le2)) result = REL_GE; else if (CountLT(le1) || CountGT(ge2)) result = REL_LT; else if (CountLE(le1) || CountGE(ge2)) result = REL_LE; } } }
bool AnalyzeEquation(const CoeffVec& vec, const BoundVec& bounds, BoundOp& boundop, Dep& result, const DepRel& rel) { int dim = vec.size()- 1; std::vector<int> signs; for (int index = 0; index < dim; ++index) { if (vec[index]==0) { signs.push_back(0); continue; } SymbolicBound cb = GetValBound(vec[index], boundop); assert(!cb.lb.IsNIL() && !cb.ub.IsNIL()); const SymbolicBound& b = bounds[index]; assert(!b.lb.IsNIL() && !b.ub.IsNIL()); if (b.lb >= 0) { if (cb.lb >= 0) signs.push_back(1); else if (cb.ub <= 0) signs.push_back(-1); else { if (DebugDep()) std::cerr << "unable to decide sign of coeff when lb >=0 for ivar[" << index << "]\n"; //return false; signs.push_back(2); } } else if (b.ub <= 0) { if (cb.lb >= 0) signs.push_back(-1); else if (cb.ub <= 0) signs.push_back(1); else { if (DebugDep()) std::cerr << "unable to decide sign of coeff when ub <=0 for ivar[" << index << "]\n"; //return false; signs.push_back(2); } } else { if (DebugDep()) std::cerr << "unable to decide sign of ivar[" << index << "]\n"; //return false; signs.push_back(2); } } if (vec[dim] == 0) signs.push_back(0); else { SymbolicVal leftval = vec[dim]; if (leftval.IsNIL()) { if (DebugDep()) std::cerr << "unable to decide sign of leftval\n"; return false; } SymbolicBound lb = GetValBound(vec[dim], boundop); if (lb.ub <= 0) signs.push_back(-1); else if (lb.lb >= 0) signs.push_back(1); else { if (DebugDep()) std::cerr << "unable to decide sign of leftval\n"; return false; //signs.push_back(2); } } for (int i = 0; i < dim ; ++i) { if (signs[i] == 0) continue; SymbolicVal coeff = vec[i]; assert(!coeff.IsNIL()); int j = 0; for ( j = i+1; j < dim; ++j) { if (signs[j] == 0 || coeff + vec[j] != 0) continue; int left = 0, k; for (k = 0; k < dim ; ++k) { if (k == i || k == j) continue; if (left == 0) left = signs[k]; else if (signs[k] == 2 || signs[k] * left < 0) break; } if ( k < dim || left == 2 || left * signs[dim] < 0) continue; int diff = 0, c = 1; bool hasdiff = false; if (left == 0 && vec[dim].isConstInt(diff) && (diff == 0 || coeff.isConstInt(c))) { if (diff != 0 && c != 1) { int odiff = diff; diff = diff / c; if (odiff != diff * c) { //DepStats.AddAdhocDV(DepStats.RoseToPlatoDV(DepRel(DEPDIR_NONE))); result[i][j] = DepRel(DEPDIR_NONE); return true; } } hasdiff = true; } if (hasdiff) { //DepStats.AddAdhocDV(DepStats.RoseToPlatoDV(DepRel(DEPDIR_EQ, diff))); result[i][j] = rel * DepRel(DEPDIR_EQ, diff); return true; // precise dependence } else if (signs[i] != 2) { if (signs[dim]* signs[i] > 0) { //DepStats.AddAdhocDV(DepStats.RoseToPlatoDV(DepRel(DEPDIR_GE, diff))); result[i][j] = rel * DepRel(DEPDIR_GE, diff); } else { //DepStats.AddAdhocDV(DepStats.RoseToPlatoDV(DepRel(DEPDIR_LE, diff))); result[i][j] = rel * DepRel(DEPDIR_LE, diff); } } } } return false; }