//// END PUBLIC INTERFACE //// /// <summary> /// Add the constraint expr=0 to the inequality tableau using an /// artificial variable. /// </summary> /// <remarks> /// To do this, create an artificial variable av and add av=expr /// to the inequality tableau, then make av be 0 (raise an exception /// if we can't attain av=0). /// </remarks> private void AddWithArtificialVariable(ClLinearExpression expr) /* throws ExClRequiredFailure, ExClInternalError */ { ClSlackVariable av = new ClSlackVariable(++_artificialCounter, "a"); ClObjectiveVariable az = new ClObjectiveVariable("az"); ClLinearExpression azRow = expr.Clone(); AddRow(az, azRow); AddRow(av, expr); Optimize(az); ClLinearExpression azTableauRow = RowExpression(az); if (!Approx(azTableauRow.Constant, 0.0)) { RemoveRow(az); RemoveColumn(av); throw new CassowaryRequiredFailureException(); } // see if av is a basic variable ClLinearExpression e = RowExpression(av); if (e != null) { // find another variable in this row and pivot, // so that av becomes parametric if (e.IsConstant) { // if there isn't another variable in the row // then the tableau contains the equation av=0 -- // just delete av's row RemoveRow(av); RemoveRow(az); return; } ClAbstractVariable entryVar = e.AnyPivotableVariable(); Pivot(entryVar, av); } Assert(RowExpression(av) == null, "RowExpression(av) == null)"); RemoveColumn(av); RemoveRow(az); }