Archived LunaModel 0.5.9 documentation
You are reading the old LunaModel 0.5.9 documentation.
The regular documentation describes LunaModel >=0.6.0; use the
latest documentation unless you explicitly need the old release.
Solution Translators
Solution translators convert solver results from various formats to LunaModel Solution objects, enabling seamless integration with different optimization platforms.
Overview
LunaModel provides solution translators for:
- NumPy: Array-based results
- D-Wave: SampleSet from Ocean SDK
- IBM: Qiskit optimization results
- AWS: Amazon Braket results
- Q-Ctrl: Q-Ctrl optimization results
- ZIB: SCIP solver results
NumpyTranslator
Convert NumPy arrays to LunaModel solutions.
Basic Usage
Python
from luna_model.translator import NumpyTranslator
import numpy as np
# Result array (samples x variables)
result_array = np.array([
[1, 0, 1, 0],
[0, 1, 0, 1],
[1, 1, 0, 0]
])
# Variable names
var_names = ["x", "y", "z", "w"]
# Objective values (optional)
obj_values = [10.0, 12.0, 8.0]
# Convert to Solution
translator = NumpyTranslator()
solution = translator.to_lm(
result_array,
variable_names=var_names,
obj_values=obj_values
)
print(f"Samples: {solution.samples}")
print(f"Best: {solution.best()}")
With Feasibility Flags
Python
feasible = [True, False, True]
solution = translator.to_lm(
result_array,
variable_names=var_names,
obj_values=obj_values,
feasible=feasible
)
DwaveTranslator
Convert D-Wave SampleSet to LunaModel solutions.
Installation
Basic Usage
Python
from luna_model.translator import DwaveTranslator
from dimod import ExactSolver, BinaryQuadraticModel
# Create and solve BQM
bqm = BinaryQuadraticModel({'x': -1, 'y': -2}, {('x', 'y'): 1}, 0.0, 'BINARY')
sampler = ExactSolver()
sampleset = sampler.sample(bqm)
# Convert to LunaModel solution
translator = DwaveTranslator()
solution = translator.to_lm(sampleset)
print(f"Number of samples: {len(solution.samples)}")
print(f"Best solution: {solution.best()}")
print(f"Best energy: {min(solution.obj_values)}")
Complete Workflow
Python
from luna_model import Model, Vtype
from luna_model.translator import BqmTranslator, DwaveTranslator
from dwave.system import DWaveSampler, EmbeddingComposite
# Create model
model = Model()
x = model.add_variable("x", vtype=Vtype.BINARY)
y = model.add_variable("y", vtype=Vtype.BINARY)
model.objective = x * y - x - 2 * y
# Convert to BQM
bqm_translator = BqmTranslator()
bqm = bqm_translator.from_lm(model)
# Solve on D-Wave
sampler = EmbeddingComposite(DWaveSampler())
sampleset = sampler.sample(bqm, num_reads=100)
# Convert solution
solution_translator = DwaveTranslator()
solution = solution_translator.to_lm(sampleset)
# Analyze
print(f"Got {len(solution.samples)} samples")
feasible_count = sum(solution.feasible)
print(f"Feasible solutions: {feasible_count}")
IbmTranslator
Convert IBM Qiskit results to LunaModel solutions.
Installation
Basic Usage
Python
from luna_model.translator import IbmTranslator
from qiskit_optimization import QuadraticProgram
from qiskit_optimization.algorithms import MinimumEigenOptimizer
# Create and solve QAOA problem (pseudo-code)
# qp = QuadraticProgram()
# ... define problem ...
# result = optimizer.solve(qp)
# Convert to LunaModel
translator = IbmTranslator()
solution = translator.to_lm(result, variable_names=var_names)
print(f"Solution: {solution.samples[0]}")
print(f"Objective: {solution.obj_values[0]}")
AwsTranslator
Convert AWS Braket results to LunaModel solutions.
Installation
Basic Usage
Python
from luna_model.translator import AwsTranslator
from braket.devices import LocalSimulator
from braket.ocean_plugin import BraketSampler
# Solve on AWS Braket (pseudo-code)
# device = LocalSimulator()
# sampler = BraketSampler(device)
# result = sampler.sample_qubo(qubo)
# Convert to LunaModel
translator = AwsTranslator()
solution = translator.to_lm(result, variable_names=var_names)
print(f"Best solution: {solution.best()}")
QctrlTranslator
Convert Q-Ctrl results to LunaModel solutions.
Basic Usage
Python
from luna_model.translator import QctrlTranslator
# Q-Ctrl result (pseudo-code)
# result = qctrl_solver.solve(problem)
# Convert to LunaModel
translator = QctrlTranslator()
solution = translator.to_lm(result, variable_names=var_names)
ZibTranslator
Convert SCIP solver results to LunaModel solutions.
Installation
Basic Usage
Python
from luna_model.translator import ZibTranslator, LpTranslator
from pyscipopt import Model as SCIPModel
# Export LunaModel to LP
lp_translator = LpTranslator()
lp_string = lp_translator.from_lm(model)
# Solve with SCIP
scip = SCIPModel()
scip.readProblem(lp_string)
scip.optimize()
# Get solution
scip_solution = scip.getBestSol()
# Convert to LunaModel
zib_translator = ZibTranslator()
solution = zib_translator.to_lm(scip_solution, model=model)
print(f"Objective value: {solution.obj_values[0]}")
print(f"Solution: {solution.samples[0]}")
Complete Integration Example
Python
from luna_model import Model, Vtype, Sense
from luna_model.utils import quicksum
from luna_model.translator import (
BqmTranslator,
DwaveTranslator,
NumpyTranslator
)
from dimod import SimulatedAnnealingSampler
import numpy as np
# Create optimization model
model = Model(name="Portfolio", sense=Sense.MIN)
n_assets = 5
allocations = [
model.add_variable(f"a_{i}", vtype=Vtype.BINARY)
for i in range(n_assets)
]
# Objective: minimize risk, maximize return
returns = [0.05, 0.08, 0.06, 0.07, 0.09]
risk_matrix = np.random.rand(n_assets, n_assets)
# Quadratic risk term
risk = quicksum(
risk_matrix[i, j] * allocations[i] * allocations[j]
for i in range(n_assets)
for j in range(n_assets)
)
# Linear return term
expected_return = quicksum(returns[i] * allocations[i] for i in range(n_assets))
model.objective = risk - 0.5 * expected_return
# Constraint: select at least 2 assets
model.constraints += quicksum(allocations) >= 2
# Method 1: Solve with D-Wave
bqm_translator = BqmTranslator()
bqm = bqm_translator.from_lm(model)
sampler = SimulatedAnnealingSampler()
sampleset = sampler.sample(bqm, num_reads=100)
dwave_translator = DwaveTranslator()
solution_dwave = dwave_translator.to_lm(sampleset)
print("D-Wave solution:")
print(f" Best: {solution_dwave.best()}")
print(f" Objective: {min(solution_dwave.obj_values)}")
# Method 2: Custom solver returning NumPy
# Simulate custom solver result
result_array = np.random.randint(0, 2, size=(10, n_assets))
obj_values = np.random.rand(10) * 10
numpy_translator = NumpyTranslator()
solution_numpy = numpy_translator.to_lm(
result_array,
variable_names=[f"a_{i}" for i in range(n_assets)],
obj_values=obj_values.tolist()
)
print("\nNumPy solution:")
print(f" Best: {solution_numpy.best()}")
print(f" Objective: {min(solution_numpy.obj_values)}")
Best Practices
Preserve Variable Names
Python
# Extract variable names from model
var_names = [var.name for var in model.variables()]
# Use when converting
solution = translator.to_lm(result, variable_names=var_names)
Validate Conversions
Python
# After conversion, validate
solution = translator.to_lm(result, variable_names=var_names)
# Check all variables present
assert len(solution.samples[0]) == len(var_names)
# Verify against model
for sample in solution.samples:
obj_value = model.objective.eval(sample)
# Compare with reported objective...
Handle Multiple Solutions
Python
# Many solvers return multiple solutions
solution = translator.to_lm(sampleset)
# Sort by objective
sorted_indices = sorted(
range(len(solution.obj_values)),
key=lambda i: solution.obj_values[i]
)
# Get top 10 solutions
top_10 = [solution.samples[i] for i in sorted_indices[:10]]
Error Handling
Python
from luna_model.errors import TranslationError
try:
solution = translator.to_lm(result, variable_names=var_names)
except TranslationError as e:
print(f"Solution translation failed: {e}")
See Also
- Model Translators - Converting models
- Solution API - Working with solutions
- API: Translators - API reference