private static IVariable CalculateForTwoVariables(IMilpManager milpManager, OperationType type, IVariable[] arguments)
        {
            if (arguments.All(a => a.IsConstant()))
            {
                var values = arguments.Select(a => a.ConstantValue.Value);
                var result = type == OperationType.Maximum ? values.Max() : values.Min();
                if (arguments.All(a => a.IsInteger()))
                {
                    return milpManager.FromConstant((int) result);
                }
                else
                {
                    return milpManager.FromConstant(result);
                }
            }
            var first = arguments[0];
            var second = arguments[1];

            IVariable max = milpManager.CreateAnonymous(CalculateDomain(arguments));
            IVariable min = milpManager.CreateAnonymous(CalculateDomain(arguments));

            max.Set(ConstraintType.GreaterOrEqual, first);
            max.Set(ConstraintType.GreaterOrEqual, second);
            min.Set(ConstraintType.LessOrEqual, first);
            min.Set(ConstraintType.LessOrEqual, second);

            max.Operation(OperationType.Subtraction, min)
                .Set(ConstraintType.Equal,
                    first.Operation(OperationType.Subtraction, second).Operation(OperationType.AbsoluteValue));

            max.ConstantValue = arguments.All(a => a.ConstantValue.HasValue)
                ? Math.Max(arguments[0].ConstantValue.Value, arguments[1].ConstantValue.Value)
                : (double?)null;
            min.ConstantValue = arguments.All(a => a.ConstantValue.HasValue)
                ? Math.Min(arguments[0].ConstantValue.Value, arguments[1].ConstantValue.Value)
                : (double?)null;
            max.Expression = $"max({arguments[0].FullExpression()}, {arguments[1].FullExpression()}";
            min.Expression = $"min({arguments[0].FullExpression()}, {arguments[1].FullExpression()}";
            return type == OperationType.Maximum ? max : min;
        }