Source code for eqc_models.solvers.eqcdirect
- import logging
- from typing import Dict
- try:
- from eqc_direct.client import EqcClient
- except ModuleNotFoundError:
-
- logging.warning("eqc-direct package not available")
- class EqcClient:
- """This is a stub for unsupported EqcClient."""
- def __init__(*_, **__) -> None:
- """Raise exception when client cannot be created."""
- raise ModuleNotFoundError(
- "eqc-direct package not available, likely because Python version is 3.11+"
- )
- from eqc_models.base.base import EqcModel, ModelSolver
- from eqc_models.base.results import SolutionResults
- log = logging.getLogger(name=__name__)
- [docs]
- class Dirac3DirectSolver(ModelSolver):
- ip_addr: str = "localhost"
- port: str = "50051"
- cert_file: str = None
- [docs]
- def solve(
- self,
- model,
- sum_constraint,
- relaxation_schedule=1,
- num_samples=1,
- mean_photon_number=None,
- quantum_fluctuation_coefficient=None,
- ):
- polynomial = model.polynomial
- coefficients = polynomial.coefficients
- indices = polynomial.indices
- num_variables = 0
- for i in range(len(indices)):
- if max(indices[i]) > num_variables:
- num_variables = max(indices[i])
-
- num_variables += model.machine_slacks
- print("Num variables:", num_variables)
- client = self.client
- lock_id, startts, endts = client.wait_for_lock()
-
-
- response = None
- try:
- response = client.solve_sum_constrained(
- coefficients,
- indices,
- num_variables,
- num_samples=num_samples,
- lock_id=lock_id,
- relaxation_schedule=relaxation_schedule,
- sum_constraint=sum_constraint,
- mean_photon_number=mean_photon_number,
- quantum_fluctuation_coefficient=quantum_fluctuation_coefficient,
- )
- finally:
- client.release_lock(lock_id=lock_id)
- return response
- [docs]
- def connect(self, ip_addr: str, port: str, cert_file: str = None):
- self.ip_addr = ip_addr
- self.port = port
- self.cert_file = cert_file
- client = self.client
- return client.system_status()
- @property
- def client(self) -> EqcClient:
- """Return a new client from eqc-direct based on class config."""
- return EqcClient(self.ip_addr, self.port, cert_file=self.cert_file)
- [docs]
- def makeResults(self, model : EqcModel, response : Dict):
- """ Builds the results object """
- return SolutionResults.from_eqcdirect_response(model, response, self)