Skip to content

v0.5.0

Choose a tag to compare

@Shiro-Raven Shiro-Raven released this 12 Dec 11:20
cdf4295

0.5.0 (2025-12-12)

✨ Added

  • BinaryQuadraticModel support in QAOA: added support for dimod.BinaryQuadraticModel as a QUBO problem input type, replacing the removed qiskit-optimization.QuadraticProgram support. QAOA now accepts BinaryQuadraticModel objects directly, with automatic conversion to matrix format for Hamiltonian generation. Includes comprehensive test coverage and updated tutorial (tutorials/qaoa_binary_quadratic_model.py)
  • Checkpointing support for variational quantum algorithms: added comprehensive checkpointing functionality with CheckpointConfig class (including with_timestamped_dir() method) using Pydantic for JSON validation, enabling state saving and resuming of optimization runs. Includes save_state() and load_state() methods on optimizer classes, comprehensive user guide (docs/source/user_guide/checkpointing.rst), and tutorial example (tutorials/checkpointing.py)
  • ExecutionResult dataclass: added a unified return type for CircuitRunner.submit_circuits() that handles both synchronous and asynchronous execution results. This provides a consistent interface for accessing results or job IDs across different backends
  • precision parameter to VariationalQuantumAlgorithm: added configurable precision for QASM parameter formatting (defaults to 8 decimal places). The precision parameter controls the number of decimal places used when converting circuit parameters to QASM strings, affecting the size of QASM circuits sent to cloud backends. Higher precision values result in longer QASM strings and increased data transfer overhead
  • Job cancellation support in QoroService: added cancel_job() method to cancel pending or running jobs on the Qoro Service API. The method returns a requests.Response object containing cancellation details (status, job_id, circuits_cancelled). Includes comprehensive test coverage for successful cancellation, permission errors (403), and conflict errors (409) when attempting to cancel non-cancellable jobs
  • Cloud job cancellation integration in ProgramBatch: added automatic cloud job cancellation when local batch execution is interrupted. When a ProgramBatch is cancelled (e.g., via KeyboardInterrupt), unstoppable futures now trigger cancel_unfinished_job() on their associated programs to cancel remote cloud jobs, allowing polling loops to exit gracefully. Includes _current_execution_result tracking in QuantumProgram, proper error handling for race conditions (409 Conflict) when jobs complete before cancellation, and graceful termination via _CancelledError exception. Includes comprehensive test coverage

🔄 Changed

  • Refactored CircuitRunner interface: updated submit_circuits() to return ExecutionResult instead of a raw job ID or result list. This change standardizes the interface for both synchronous (e.g., ParallelSimulator) and asynchronous (e.g., QoroService) backends
  • Improved ParallelSimulator runtime estimation: enhanced the runtime estimation logic in ParallelSimulator to better account for instruction durations and parallel execution scheduling using a Longest Processing Time (LPT) algorithm
  • Refactored type hints to use numpy.typing for improved type safety: updated type annotations across the codebase to use numpy's typing module for better type checking and IDE support
  • Adapted ProgramBatch workflows to support stateful optimizers: updated workflow classes (GraphPartitioningQAOA, QUBOPartitioningQAOA, VQEHyperparameterSweep) to properly handle optimizer state persistence
  • Thread-safe QuantumScript creation: refactored circuit creation to avoid using make_qscript for improved thread safety in parallel execution scenarios
  • Refactored logging infrastructure to use Rich library: replaced custom OverwriteStreamHandler with RichHandler from the Rich library for improved log formatting and colorization. LoggingProgressReporter now uses Rich's Console.status() for message overwriting with spinners, providing better visual feedback during job polling and iteration updates. Removed ANSI escape sequence handling in favor of Rich's markup system
  • Upgraded to Qiskit v2.2: updated Qiskit dependency from <2.0 to ^2.2 with corresponding updates to qiskit-aer (unconstrained) and qiskit-ibm-runtime (updated to >0.42 for Qiskit v2 compatibility)
  • Refactored CMA-ES implementation: migrated PymooOptimizer CMA-ES method from pymoo's CMAES to the dedicated cma library for improved performance and better algorithm support. The optimizer now uses cma.CMAEvolutionStrategy for CMA-ES while maintaining pymoo's DE (Differential Evolution) implementation. This change improves checkpointing reliability and algorithm behavior
  • Updated dependency constraints: relaxed version constraints for numpy, pymoo (updated to ^0.6), black, and isort to allow latest compatible versions
  • Refactored QoroService.poll_job_status(): replaced repetitive if-statements for terminal statuses (COMPLETED, FAILED, CANCELLED) with a set-based check for cleaner, more maintainable code
  • Moved reporter initialization to QuantumProgram base class: reporter initialization logic moved from VariationalQuantumAlgorithm to QuantumProgram to provide consistent progress reporting across all program types. This eliminates code duplication and ensures all QuantumProgram subclasses have reporter support
  • Renamed job_id kwarg to program_id in QuantumProgram: changed the kwarg name from job_id to program_id to avoid confusion with ExecutionResult.job_id (backend job identifier). The program_id is used for progress tracking in batch operations, while ExecutionResult.job_id represents the actual backend job identifier. Updated all workflow implementations and tests accordingly
  • Updated progress bar labels: changed progress bar job name display from "Job {id}" to "Program {id}" for consistency with the program_id naming change
  • Added docstring to ProgramBatch.aggregate_results(): added comprehensive docstring documenting the method's purpose, validation checks, and expected subclass behavior

🗑️ Removed

  • Removed QuadraticProgram support from QAOA: removed support for qiskit-optimization.QuadraticProgram as a QUBO problem input type, along with the qiskit-optimization dependency. Replaced with dimod.BinaryQuadraticModel support for better compatibility with the broader quantum optimization ecosystem. The qiskit-optimization dependency and related converter (QuadraticProgramToQubo) have been removed from the codebase
  • Removed unused mode parameter from progress bar: removed unused mode field from ProgramBatch progress bar task creation. The field was set but never used in any progress bar rendering logic
  • Removed unused _is_local attribute from ProgramBatch: removed _is_local attribute that was only set but never referenced anywhere in the codebase

🐛 Fixed

  • Fixed overflow issue with batched expectation values: corrected numerical overflow problem in expectation value calculations when processing large batches
  • Fixed documentation issues: corrected various documentation hiccups and formatting problems
  • Fixed _raise_with_details() to preserve response object: updated error handling to attach the HTTP response object to HTTPError exceptions, enabling proper error inspection in tests and error handling code
  • Fixed Qiskit v2 compatibility issues: added stevedore error suppression in ParallelSimulator and test configuration to handle harmless plugin loading failures caused by ProviderV1 removal in Qiskit v2. The errors occur when IBM backend plugins attempt to load deprecated interfaces but don't affect functionality