示例#1
0
        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);
        }
示例#2
0
        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;
        }