Ejemplo n.º 1
0
MMO_Expression_::MMO_Expression_ (AST_Expression exp, MMO_ModelData data) :
    _exp (NULL), _data (data), _str (), _equationIndex (0), _expressionOrder (2)
{
  _ri = newMMO_ReplaceInterval (_data->symbols ());
  if (_data->hasAnnotation ())
    {
      _expressionOrder = _data->annotation ()->polyCoeffs ();
    }
  AST_Expression e = _ri->foldTraverse (exp);
  _exp = e;
  _gen = newGenerateDeps (_data);
  _deps = _gen->foldTraverse (exp);
  for (VariableInterval vi = _ri->first (); !_ri->end (); vi = _ri->next ())
    {
      VarInfo v = _data->symbols ()->lookup (vi.name ());
      if (v->isState ())
	{
	  _deps->insert (vi.index (), DEP_STATE_VECTOR);
	}
      else if (v->isAlgebraic ())
	{
	  _deps->insert (vi.index (), DEP_ALGEBRAIC_VECTOR_DEF);
	}
      else if (v->isDiscrete ())
	{
	  _deps->insert (vi.index (), DEP_DISCRETE_VECTOR);
	}
    }
  if (_data->calculateAlgebraics ())
    {
      map<Index, Index> states, discretes;
      _traverseAlgebraics (_deps, _data->lhs (), _deps, &states, &discretes,
			   Index (), DEP_ALGEBRAIC_DEF, -1);
      _traverseAlgebraics (_deps, _data->lhs (), _deps, &states, &discretes,
			   Index (), DEP_ALGEBRAIC_VECTOR_DEF, -1);
    }
  _printer = newMMO_PrintExp (_data->symbols (), _ri, data->packages ());
}