public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments) { if (!SupportsOperation(type, arguments)) { throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments)); } if (arguments.All(a => a.IsConstant())) { var constantResult = arguments[0].ConstantValue.Value / arguments[1].ConstantValue.Value; if (arguments.All(a => a.IsInteger())) { return(milpManager.FromConstant((int)constantResult)); } else { return(milpManager.FromConstant(constantResult)); } } var domain = CalculateDomain(arguments); if (IsDividingByConstant(arguments)) { var finalDomain = arguments.All(x => x.IsConstant()) ? domain.MakeConstant() : domain; var physicalResult = milpManager.DivideVariableByConstant(arguments[0], arguments[1], finalDomain); physicalResult.ConstantValue = arguments[0].ConstantValue / arguments[1].ConstantValue; physicalResult.Expression = $"{arguments[0].FullExpression()} / {arguments[1].FullExpression()}"; return(physicalResult); } IVariable one = milpManager.FromConstant(1); var result = milpManager.CreateAnonymous(domain); result.Operation(OperationType.Multiplication, arguments[1]) .Set(ConstraintType.LessOrEqual, arguments[0]); result.Operation(OperationType.Addition, one) .Operation(OperationType.Multiplication, arguments[1]) .Set(ConstraintType.GreaterOrEqual, arguments[0].Operation(OperationType.Addition, one)); result.ConstantValue = arguments.All(a => a.ConstantValue.HasValue) ? arguments[1].ConstantValue.Value == 0 ? (double?)null : (long)arguments[0].ConstantValue.Value / (long)arguments[1].ConstantValue.Value : null; result.Expression = $"{arguments[0].FullExpression()} / {arguments[1].FullExpression()}"; return(result); }
public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments) { if (!SupportsOperation(type, arguments)) throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments)); if (arguments.All(a => a.IsConstant())) { var constantResult = arguments[0].ConstantValue.Value/arguments[1].ConstantValue.Value; if (arguments.All(a => a.IsInteger())) { return milpManager.FromConstant((int) constantResult); } else { return milpManager.FromConstant(constantResult); } } var domain = CalculateDomain(arguments); if (IsDividingByConstant(arguments)) { var finalDomain = arguments.All(x => x.IsConstant()) ? domain.MakeConstant() : domain; var physicalResult = milpManager.DivideVariableByConstant(arguments[0], arguments[1], finalDomain); physicalResult.ConstantValue = arguments[0].ConstantValue/arguments[1].ConstantValue; physicalResult.Expression = $"{arguments[0].FullExpression()} / {arguments[1].FullExpression()}"; return physicalResult; } IVariable one = milpManager.FromConstant(1); var result = milpManager.CreateAnonymous(domain); result.Operation(OperationType.Multiplication, arguments[1]) .Set(ConstraintType.LessOrEqual, arguments[0]); result.Operation(OperationType.Addition, one) .Operation(OperationType.Multiplication, arguments[1]) .Set(ConstraintType.GreaterOrEqual, arguments[0].Operation(OperationType.Addition, one)); result.ConstantValue = arguments.All(a => a.ConstantValue.HasValue) ? arguments[1].ConstantValue.Value == 0 ? (double?)null : (long)arguments[0].ConstantValue.Value / (long)arguments[1].ConstantValue.Value : null; result.Expression = $"{arguments[0].FullExpression()} / {arguments[1].FullExpression()}"; return result; }