Skip to main content

Variational optimization with Haiqu SDK

Use haiqu.variational_optimization() to minimize the expectation value of an observable for a parameterized ansatz circuit.
1

Define the variational problem

from qiskit.circuit.library import EfficientSU2
from qiskit.quantum_info import SparsePauliOp
from haiqu.sdk.qml import VariationalProblem

#Build a parameterized QuantumCircuit (ansatz)
num_qubits = 3
ansatz = EfficientSU2(num_qubits=num_qubits, reps=1)

#Define the cost observable as SparsePauliOp
observable = SparsePauliOp.from_list([("Z" * num_qubits, 1.0)])

# Wrap both in VariationalProblem
problem = VariationalProblem(ansatz, observable)
VariationalProblem requires a parameterized ansatz circuit and a SparsePauliOp observable.
2

Configure optimizer and submit the job

from haiqu.sdk import haiqu
from haiqu.sdk.qml import NFTOptimizerOptions

optimizer_options = NFTOptimizerOptions(
    maxiter=100,
    maxfev=2048,
    reset_interval=32,
    randomized_order=False,
)

job = haiqu.variational_optimization(
    problem=problem,
    device_id="aer_simulator",
    shots=1000,
    seed=42,
    optimizer_options=optimizer_options,
    use_mitigation=False,
    use_session=False,
)

NFT optimizer notes

  • Haiqu uses the NFT (Nakanishi-Fujii-Todo) gradient-free optimizer.
  • If ansatz parameters are reused across multiple gates, SDK raises a warning because NFT assumes independent parameters.
  • Stopping is controlled by optimizer limits such as maxfev and maxiter.
  • Use either seed or initial_parameters, but not both.
3

Track progress and fetch results

job.progress()
result = job.result()

print("Minimum loss:", result.min_loss)
print("Optimal parameters:", result.optimal_parameters)
print("Iterations:", len(result.loss_history))
job.result() returns a VariationalResult with min_loss, optimal_parameters, and loss_history.

API details

The variational optimisation function is defined as:
haiqu.variational_optimization(
    problem,
    shots=1000,
    device=None,
    device_id=None,
    options=None,
    initial_parameters=None,
    seed=None,
    optimizer_options=None,
    use_mitigation=False,
    use_session=False,
)
ArgumentDescription
problemVariationalProblem(ansatz, observable)
device / device_idTarget backend. At least one must be provided.
shotsNumber of shots per circuit evaluation.
seedReproducible random initialization in [-0.1π, 0.1π].
initial_parametersExplicit initial values (length must match ansatz parameters).
optimizer_optionsOptimizer configuration, typically NFTOptimizerOptions(...).
use_mitigationEnables mitigation pipeline in backend execution.
use_sessionEnables Qiskit Runtime Session mode.