예제 #1
0
파일: GauSid.hpp 프로젝트: jgoymerac/OONM
MyVect<T> GauSid<T>::operator () (MyVect<MyVect<T>> &vectr)
{
    mult = 0;
    MyVect<T> vect_to_return (vectr.size ());
    vect_to_return = 0;
    for (int i = 0; i < vectr.size () - 1; i++)
    {
        for (int k = 1; k < vectr.size (); k++)
        {
            if (i == k)
            {
                continue;//skips comparing MyVect object to itself
            }
            else if (isMult (vectr[i], vectr[k]))
            {
                vect_to_return[i] = 1;
                vect_to_return[k] = mult;
                //return vect_to_return;
            }
        }
    }
    for (int i = 2; i < vectr.size (); i++)
    {
        MyVect <MyVect<T>> gsTest, gsTest2 (vectr.size ());
        MyVect<T> temp (i), tempAlso (vectr.size ()), sum (vectr.size ());
        temp = 0;
        sum = 0;
        for (int k = 0; k < i + 1; k++)
        {
            gsTest.insert (vectr[k], k);
        }
        tempAlso = iteration (gsTest);
        if (tempAlso != temp)
        {
            for (int i = 0; i < tempAlso.size (); i++)
            {
                sum = sum + (vectr[i] * tempAlso[i]);
            }
            if (sum == vectr[tempAlso.size ()])
            {
                return tempAlso;
            }
        }
    }
    //Does not converge or remaing ewlements after Gauss Seidel don't sum up;
    return vect_to_return;
}
// store the rational representation of exp into rat, according to the
// most recently generated model.
static bool ExpModelRational(const CVC3::Expr &exp, CVC3::Rational &rat)
{
  // usual case, the expression is already an integer. it would be nice if
  // this was the 'always' case (except with assignments for function symbols,
  // which shouldn't get here), but it is not.
  if (exp.isRational()) {
    rat = exp.getRational();
    return true;
  }

  if (isPlus(exp)) {
    if (!ExpModelRational(exp[0], rat))
      return false;
    for (int i = 1; i < exp.arity(); i++) {
      CVC3::Rational crat;
      if (!ExpModelRational(exp[i], crat))
        return false;
      rat += crat;
    }
    return true;
  }

  if (isMult(exp)) {
    if (!ExpModelRational(exp[0], rat))
      return false;
    for (int i = 1; i < exp.arity(); i++) {
      CVC3::Rational crat;
      if (!ExpModelRational(exp[i], crat))
        return false;
      rat *= crat;
    }
    return true;
  }

  // see if this is a key in the model we generated.
  for (long i = 0; i < model_size; i++) {
    if (model_vars[i] == ToExp(exp))
      return ExpModelRational(FromExp(model_vals[i]), rat);
  }

  // printf("ERROR: Unknown expression from model: %s\n",
  //        exp.toString().c_str());

  return false;
}