public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments) { if (!SupportsOperation(type, arguments)) { throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments)); } if (arguments.Length == 1) { return(arguments[0]); } if (MultiplyOnlyConstants(arguments)) { var result = arguments.Select(a => a.ConstantValue.Value).Aggregate((a, b) => a * b); if (arguments.All(a => a.IsInteger())) { return(milpManager.FromConstant((int)result)); } else { return(milpManager.FromConstant(result)); } } var domain = CalculateDomain(arguments); if (MultiplyAtMostOneNonconstant(arguments)) { return(arguments.Aggregate((x, y) => { var result = y.IsConstant() ? milpManager.MultiplyVariableByConstant(x, y, domain) : milpManager.MultiplyVariableByConstant(y, x, domain); result.ConstantValue = x.ConstantValue * y.ConstantValue; result.Expression = $"{x.FullExpression()} * {y.FullExpression()}"; return result; })); } if (MultiplyBinaryVariables(arguments)) { return(milpManager.Operation(OperationType.Conjunction, arguments)); } return(MultiplyIntegers(milpManager, domain, arguments)); }
public IVariable Calculate(IMilpManager milpManager, OperationType type, params IVariable[] arguments) { if (!SupportsOperation(type, arguments)) throw new NotSupportedException(SolverUtilities.FormatUnsupportedMessage(type, arguments)); if (arguments.Length == 1) { return arguments[0]; } if (MultiplyOnlyConstants(arguments)) { var result = arguments.Select(a => a.ConstantValue.Value).Aggregate((a, b) => a*b); if (arguments.All(a => a.IsInteger())) { return milpManager.FromConstant((int) result); } else { return milpManager.FromConstant(result); } } var domain = CalculateDomain(arguments); if (MultiplyAtMostOneNonconstant(arguments)) { return arguments.Aggregate((x, y) => { var result = y.IsConstant() ? milpManager.MultiplyVariableByConstant(x, y, domain) : milpManager.MultiplyVariableByConstant(y, x, domain); result.ConstantValue = x.ConstantValue*y.ConstantValue; result.Expression = $"{x.FullExpression()} * {y.FullExpression()}"; return result; }); } if (MultiplyBinaryVariables(arguments)) { return milpManager.Operation(OperationType.Conjunction, arguments); } return MultiplyIntegers(milpManager, domain, arguments); }