void MMO_Expression_::_addAlgebriacDeps (Index algIndex, MMO_Equation equation, Index equationIndex, Index derivativeIndex, Dependencies derivativeDeps, map<Index, Index> *states, map<Index, Index> *discretes, Index variableChange, int value) { stringstream buffer; string indent; string variableString = equation->lhs ().variable (algIndex, "i"); Dependencies deps = equation->exp ()->deps (); map<Index, Index> &stateVariables = *states; Index eqIndex = equationIndex; for (Index *idx = deps->begin (DEP_STATE); !deps->end (DEP_STATE); idx = deps->next (DEP_STATE)) { if (stateVariables.find (*idx) == stateVariables.end () || equation->lhs ().variableChange (algIndex)) { Index stateIndex = Index ( idx->applyVariableChange ( equation->lhs ().variableIndex (algIndex))); stateVariables[*idx] = *idx; eqIndex.setOffset (_equationIndex++); if (idx->hasRange () && eqIndex.hasRange ()) { // X[i] = B[i]; derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE); } else if (!idx->hasRange () && eqIndex.hasRange ()) { // X[i] = B[N]; derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE); } else if (idx->hasRange () && !eqIndex.hasRange ()) { // X[N] = B[i]; if (derivativeIndex.hasRange ()) { Index newEqIndex = eqIndex; newEqIndex.setRange (); newEqIndex.setLow (derivativeIndex.low ()); newEqIndex.setHi (derivativeIndex.hi ()); derivativeDeps->insert ( stateIndex.indexValue ( stateIndex.value (algIndex.constant ())), newEqIndex, DEP_ALGEBRAIC_STATE); } else { derivativeDeps->insert ( stateIndex.indexValue ( stateIndex.value (algIndex.constant ())), eqIndex, DEP_ALGEBRAIC_STATE); } } else if (!idx->hasRange () && !eqIndex.hasRange ()) { // X[N] = B[N]; if (derivativeIndex.hasRange () && !algIndex.isArray()) { Index newEqIndex = eqIndex; newEqIndex.setRange (); newEqIndex.setLow (derivativeIndex.low ()); newEqIndex.setHi (derivativeIndex.hi ()); derivativeDeps->insert (stateIndex, newEqIndex, DEP_ALGEBRAIC_STATE); } else { derivativeDeps->insert (stateIndex, eqIndex, DEP_ALGEBRAIC_STATE); } } } } map<Index, Index> &discreteVariables = *discretes; for (Index *idx = deps->begin (DEP_DISCRETE); !deps->end (DEP_DISCRETE); idx = deps->next (DEP_DISCRETE)) { if (discreteVariables.find (*idx) == discreteVariables.end () || equation->lhs ().variableChange (algIndex)) { Index discreteIndex = Index ( idx->applyVariableChange ( equation->lhs ().variableIndex (algIndex))); discreteVariables[*idx] = *idx; eqIndex.setOffset (_equationIndex++); if (idx->hasRange () && eqIndex.hasRange ()) { // X[i] = B[i]; derivativeDeps->insert (discreteIndex, eqIndex, DEP_ALGEBRAIC_DISCRETE); } else if (!idx->hasRange () && eqIndex.hasRange ()) { // X[i] = B[N]; derivativeDeps->insert (discreteIndex, eqIndex, DEP_ALGEBRAIC_DISCRETE); } else if (idx->hasRange () && !eqIndex.hasRange ()) { // X[N] = B[i]; derivativeDeps->insert ( discreteIndex.indexValue ( discreteIndex.value (discreteIndex.constant ())), eqIndex, DEP_ALGEBRAIC_DISCRETE); } else if (!idx->hasRange () && !eqIndex.hasRange ()) { // X[N] = B[N]; derivativeDeps->insert (discreteIndex, eqIndex, DEP_ALGEBRAIC_DISCRETE); } } } for (Index *idx = deps->begin (DEP_STATE_VECTOR); !deps->end (DEP_STATE_VECTOR); idx = deps->next (DEP_STATE_VECTOR)) { derivativeDeps->insert (*idx, DEP_STATE_VECTOR); } for (Index *idx = deps->begin (DEP_DISCRETE_VECTOR); !deps->end (DEP_DISCRETE_VECTOR); idx = deps->next (DEP_DISCRETE_VECTOR)) { derivativeDeps->insert (*idx, DEP_DISCRETE_VECTOR); } _traverseAlgebraics (deps, derivativeIndex, derivativeDeps, states, discretes, variableChange, DEP_ALGEBRAIC_DEF, value); _traverseAlgebraics (deps, derivativeIndex, derivativeDeps, states, discretes, variableChange, DEP_ALGEBRAIC_VECTOR_DEF, value); }