/// <summary> /// Initializes a new instance of the RangeConstraint class based on a copy of the given constraint, /// but with the given name. /// </summary> /// <param name="name">The name for the new constraint.</param> /// <param name="rangeConstraint">The range constraint to be copied.</param> public RangeConstraint(string name, RangeConstraint rangeConstraint) : base(name, rangeConstraint) { this.lower = rangeConstraint.lower; }
private static Model NewHelper(out Variable[] variables, Func <int, bool> isIntegerFunc, Func <int, string> columnNameFunc, Func <int, string> rowNameFunc, double[] colLower, double[] colUpper, string objName, double[] objCoefs, int numberVariables, int numberConstraints, char[] rowSenses, CoinPackedMatrix rowMatrix, double[] rowLowers, double[] rowUppers) { Model model = new Model(); variables = new Variable[numberVariables]; Expression objExpr = new Expression(); int i = 0; for (i = 0; i < numberVariables; i++) { Variable var = new Variable(); variables[i] = var; double lower = colLower[i]; double upper = colUpper[i]; bool isInteger = isIntegerFunc.Invoke(i); string name = columnNameFunc.Invoke(i); if (!string.IsNullOrEmpty(name)) { var.Name = name; } else { var.Name = string.Concat("VAR", i); } var.Lower = lower; var.Upper = upper; var.Type = (isInteger) ? VariableType.Integer : VariableType.Continuous; objExpr.Add(objCoefs[i], var); } model.Objective = new Objective(objName, objExpr); model.ObjectiveSense = ObjectiveSense.Minimise; // NOTE: MPS DOESNT STORE MAXIMIZATION OR MINIMIZATION! // bUT LP always returns Minimization (and transforms objective accordingly if original is max) for (int j = 0; j < numberConstraints; j++) { Expression expr = new Expression(); CoinShallowPackedVector vector = rowMatrix.getVector(j); // I guess.. int nElements = vector.getNumElements(); int[] indices = vector.getIndices(); double[] elements = vector.getElements(); for (int e = 0; e < nElements; e++) { int index = indices[e]; Variable var = variables[index]; double coef = elements[e]; expr.Add(coef, var); } double lower = rowLowers[j]; double upper = rowUppers[j]; string name = rowNameFunc.Invoke(j); string conName; if (!string.IsNullOrEmpty(name)) { conName = name; } else { conName = string.Concat("CON", i); } switch (rowSenses[j]) { case 'L': //<= constraint and rhs()[i] == rowupper()[i] { ConstraintType type = ConstraintType.LE; Expression upperExpr = new Expression(upper); Constraint con = new Constraint(conName, expr, type, upperExpr); upperExpr.Clear(); model.Add(con); break; } case 'E': //= constraint { ConstraintType type = ConstraintType.EQ; Expression upperExpr = new Expression(upper); Constraint con = new Constraint(conName, expr, type, upperExpr); upperExpr.Clear(); model.Add(con); break; } case 'G': //>= constraint and rhs()[i] == rowlower()[i] { ConstraintType type = ConstraintType.GE; Expression lowerExpr = new Expression(lower); Constraint con = new Constraint(conName, expr, type, lowerExpr); lowerExpr.Clear(); model.Add(con); break; } case 'R': //ranged constraint { RangeConstraint con = new RangeConstraint(conName, lower, expr, upper); model.Add(con); break; } case 'N': //free constraint { RangeConstraint con = new RangeConstraint(conName, lower, expr, upper); con.Enabled = false; model.Add(con); break; } default: break; } } return(model); }
/// <summary> /// Initializes a new instance of the RangeConstraint class based on a copy of the given constraint. /// A default name is used. /// </summary> /// <param name="rangeConstraint">The range constraint to be copied.</param> public RangeConstraint(RangeConstraint rangeConstraint) : base(null, rangeConstraint) { this.lower = rangeConstraint.lower; }