Мне нужно, чтобы Pulse или pyomo выполняли ВСЕ арифметические операции исключительно с использованием float32.
Похоже, что по умолчанию они используют float64.
Следующие — 2 примеры из мякоти и пиомо для операции суммирования.
import pulp
import pyomo.environ as pyo
import numpy as np
def pulp_example(values, target_float):
variables = pulp.LpVariable.dicts("x", range(len(values)), 0, 1, pulp.LpBinary)
problem = pulp.LpProblem("Problem", pulp.LpMinimize)
problem += 0
problem += pulp.lpSum([variables for i in range(len(values))]) == 2
sum_exp = pulp.lpSum([variables * float(values) for i in range(len(values))])
problem += sum_exp == target_float
status = problem.solve()
return status
def pyomo_example(values, target_float):
model = pyo.ConcreteModel()
model.I = pyo.RangeSet(0, len(values) - 1)
model.x = pyo.Var(model.I, within=pyo.Binary)
model.selection_constraint = pyo.Constraint(expr=sum(model.x for i in model.I) == 2)
def sum_expr_rule(model):
return sum(model.x * values for i in model.I)
model.eq_expr = pyo.Expression(rule=sum_expr_rule)
model.constraint = pyo.Constraint(expr=model.eq_expr == target_float)
model.objective = pyo.Objective(expr=0, sense=pyo.minimize)
solver = pyo.SolverFactory('cbc')
result = solver.solve(model, tee=False)
return result.solver.status
input_values = [90.2743351459503174, 4.8144315292034]
# As expected, summation of same input values results in different outputs depending on float data type
float32_target = 95.0887680053711 # float32 arithmetic
float64_target = 95.08876667515372 # float64 arithmetic
assert np.sum([input_values], dtype=np.float32) == float32_target
assert np.sum([input_values], dtype=np.float64) == float64_target
pulp_res = pulp_example(input_values, float32_target) # 'Infeasible
pyomo_res = pyomo_example(input_values, float32_target) # 'warning'
pulp_res = pulp_example(input_values, float64_target) # 'Optimal'
pyomo_res = pyomo_example(input_values, float64_target) # 'ok'
Подробнее здесь: https://stackoverflow.com/questions/793 ... se-float32
Как ограничить арифметику с плавающей запятой в Pulse или pyomo специально для использования float32 ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение