/// <summary> /// Remove v from the tableau -- remove the column cross indices for v /// and remove v from every expression in rows in which v occurs /// </summary> protected void RemoveColumn(ClAbstractVariable var) { // remove the rows with the variables in varset HashSet <ClAbstractVariable> rows; if (_columns.TryGetValue(var, out rows)) { _columns.Remove(var); foreach (var expr in rows.Select(clv => _rows[clv])) { expr.Terms.Remove(var); } } if (var.IsExternal) { ExternalRows.Remove((ClVariable)var); ExternalParametricVars.Remove((ClVariable)var); } }
/// <summary> /// Replace all occurrences of oldVar with expr, and update column cross indices /// oldVar should now be a basic variable. /// </summary> protected void SubstituteOut(ClAbstractVariable oldVar, ClLinearExpression expr) { var varset = _columns[oldVar]; foreach (var v in varset) { var row = _rows[v]; row.SubstituteOut(oldVar, expr, v, this); if (v.IsRestricted && row.Constant < 0.0) { InfeasibleRows.Add(v); } } if (oldVar.IsExternal) { ExternalRows.Add((ClVariable)oldVar); ExternalParametricVars.Remove((ClVariable)oldVar); } _columns.Remove(oldVar); }
// Add v=expr to the tableau, update column cross indices // v becomes a basic variable // expr is now owned by ClTableau class, // and ClTableau is responsible for deleting it // (also, expr better be allocated on the heap!). protected void AddRow(ClAbstractVariable var, ClLinearExpression expr) { // for each variable in expr, add var to the set of rows which // have that variable in their expression _rows.Add(var, expr); // FIXME: check correctness! foreach (var clv in expr.Terms.Keys) { InsertColVar(clv, var); if (clv.IsExternal) { ExternalParametricVars.Add((ClVariable)clv); } } if (var.IsExternal) { ExternalRows.Add((ClVariable)var); } }