qci_client.optimization
QCi optimization application v1.
qci_client.optimization.client
Client for QCi’s optimization API.
- class qci_client.optimization.client.OptimizationClient(*, url: str | None = None, api_token: str | None = None, timeout: float | None = None, max_workers: int = 8, compress: bool = False, ssl_verify: bool | None = None)[source]
Bases:
objectUsed to run optimization jobs against QCi hardware.
Provides access to QCi’s public API for running optimization problems on Dirac devices, including file uploads/downloads and submitting/retrieving entire jobs.
- Parameters:
- url – url basepath to API endpoint, including scheme, if None, then falls back to QCI_API_URL environment variable
- api_token – refresh token for authenticating to API, if None, then falls back to QCI_TOKEN environment variable
- timeout – number of seconds before timing out requests, None waits indefinitely
- max_workers – number of threads for concurrent file download calls
- compress – compress file metadata and parts before uploading
- ssl_verify – whether to verify the server’s TLS/SSL certificate, if None, then falls back to QCI_SSL_VERIFY environment variable (defaulting to True). Set to False to allow self-signed certificates (insecure).
- property url: str
- Return API URL.
- property api_token: str
- Return API token.
- property timeout: float | None
- Return timeout setting.
- property max_workers: int
- Return maximum number of concurrent workers for file operations.
- property compress: bool
- Return file compression usage flag.
- property ssl_verify: bool
- Return whether the server’s TLS/SSL certificate is verified.
- property jobs_url
- Get jobs URL.
- get_job_id_url(*, job_id: str) → str[source]
- Get job URL with job ID.
- get_job_status_url(*, job_id: str) → str[source]
- Get job-status URL using job ID.
- get_job_metrics_url(job_id: str) → str[source]
- Get legacy job-metrics URL using job ID.
- get_job_metrics_v1_url(job_id: str) → str[source]
- Get v1 job-metrics URL using job ID.
- get_job_metrics_v2_url(job_id: str) → str[source]
- Get v2 job-metrics URL using job ID.
- get_job_allocations_url() → str[source]
- Get job-allocations URL.
- property files_url
- Get files URL.
- get_file_id_url(*, file_id: str) → str[source]
- Get file URL with file ID.
- get_file_contents_url(*, file_id: str, part_number: int) → str[source]
- Get file contents URL with file ID and file part number.
- upload_file(*, file: dict) → dict[source]
- Upload file (metadata and then parts concurrently). Returns dict with file ID.
- download_file(*, file_id: str) → dict[source]
- Download file (metadata and then parts concurrently).
- submit_job(*, job_body: dict) → dict[source]
Submit a job via a request to QCi’s optimization API.
- Parameters:
- job_body – formatted json body that includes all parameters for the job
- Returns:
- Response from POST call to API (see
get_job_results())
- cancel_job(*, job_id: str) → dict[source]
Cancel a job via a PATCH request to QCi’s optimization API.
Only SUBMITTED, QUEUED, and RUNNING jobs will be successfully cancelled, raising an exception otherwise.
- Parameters:
- job_id – ID of job
- Returns:
- Response from PATCH call to API
- get_job_results(*, job_id: str) → dict[source]
Get job_info, status, and results of a (possibly uncompleted) job by its ID.
- Parameters:
- job_id – ID of job
- Returns:
- Dictionary with latest job_info, status, and results.
- get_job_status(*, job_id: str) → dict[source]
Get the status of a job by its ID.
- Parameters:
- job_id – ID of job
- Returns:
- Response from GET call to API
- get_job_metrics(*, job_id: str) → dict[source]
Get the metrics for a job by its ID. v2 metrics are tried first, then legacy/v1 metrics.
Device metrics are keyed by the specific device name that was submitted, so a job requested on the “dirac-3” alias is keyed by “dirac-3_normalized_qudit” or “dirac-3_qudit”. The “dirac-3” alias is added alongside that key, referring to the same object, so either name reads the same device block.
- Parameters:
- job_id – ID of job
- Returns:
- Response from GET call to API
- get_job_response(*, job_id: str) → dict[source]
Get a response for a job by id, which may/may not be finished.
- Parameters:
- job_id – ID of job
- Return dict:
- json response
- get_allocations() → dict[source]
Get allocations for running jobs on different device classes.
- Return dict:
- json response
- build_job_body(*, job_type: JobType | str, job_params: dict, qubo_file_id: str | None = None, graph_file_id: str | None = None, hamiltonian_file_id: str | None = None, objective_file_id: str | None = None, constraints_file_id: str | None = None, polynomial_file_id: str | None = None, job_name: str | None = None, job_tags: list | None = None) → dict[source]
Constructs body for job submission requests.
- Parameters:
- job_type – an enum.JobType or one of the string values defined in enum.JobType
- job_params – dict of params to be passed to job submission in “params” key, including the required “device_type”, which may be “dirac-3s” and, unlike the “dirac-3” alias, is not remapped to a device-specific name
- qubo_file_id – file id from files API for uploaded qubo
- graph_file_id – file id from files API for uploaded graph
- hamiltonian_file_id – file id from files API for uploaded hamiltonian
- objective_file_id – file id from files API for uploaded objective
- constraints_file_id – file id from files API for uploaded constraints
- polynomial_file_id – file id from files API for uploaded polynomial
- job_name – user specified name for job submission
- job_tags – user specified labels for classifying and filtering user jobs after submission
- Returns:
- The job body dict, whose “job_submission” holds the assembled problem_config and device_config.
- process_job(*, job_body: dict, wait: bool = True, verbose: bool = True) → dict[source]
- Parameters:
- job_body – formatted json dict for body of job submission request
- wait – wait synchronously for job to complete
- verbose – track operations’ progress using timestamped console logs
- Returns:
- if wait is True, then dict with job_info, status, and results and results
- fields (results is None if job is not successfully COMPLETED)
- if wait is False, then response dict from submitted job, which includes
- job_id for subsequent retrieval (see
get_job_results())
- list_files() → dict[source]
List files (metadata only).
- Returns:
- dict containing list of files
qci_client.optimization.data_converter
Functions for data conversion.
- qci_client.optimization.data_converter.data_to_json(*, file: dict) → dict[source]
Converts data in file input into JSON-serializable dictionary that can be passed to Qatalyst REST API
- Parameters:
- file – file dictionary whose data of type numpy.ndarray, scipy.sparse.spmatrix, or networkx.Graph is to be converted
- Returns:
- file dictionary with JSON-serializable data
qci_client.optimization.enum
Enumerations.
- class qci_client.optimization.enum.JobType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]
Bases:
EnumEnumeration of all job types, which are specific to qci-client.
- SAMPLE_QUBO = 'sample-qubo'
- GRAPH_PARTITIONING = 'graph-partitioning'
- SAMPLE_CONTRAINT = 'sample-constraint'
- SAMPLE_HAMILTONIAN = 'sample-hamiltonian'
- SAMPLE_HAMILTONIAN_INTEGER = 'sample-hamiltonian-integer'
- SAMPLE_HAMILTONIAN_ISING = 'sample-hamiltonian-ising'
- class qci_client.optimization.enum.ProblemType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]
Bases:
EnumEnumeration of all problem types, where values match jobs API values.
- GP = 'graph_partitioning'
- IHO = 'ising_hamiltonian_optimization'
- NQHO = 'normalized_qudit_hamiltonian_optimization'
- QHO = 'qudit_hamiltonian_optimization'
- QLCBO = 'quadratic_linearly_constrained_binary_optimization'
- QUBO = 'quadratic_unconstrained_binary_optimization'
- class qci_client.optimization.enum.DeviceType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]
Bases:
EnumEnumeration of all device types, where values match jobs API values.
- DIRAC1 = 'dirac-1'
- DIRAC3 = 'dirac-3'
- DIRAC3_NORMALIZED_QUDIT = 'dirac-3_normalized_qudit'
- DIRAC3_QUDIT = 'dirac-3_qudit'
- DIRAC3S = 'dirac-3s'
- class qci_client.optimization.enum.JobStatus(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]
Bases:
EnumEnumeration of all jobs statuses, where values match jobs API values.
- SUBMITTED = 'SUBMITTED'
- QUEUED = 'QUEUED'
- RUNNING = 'RUNNING'
- COMPLETED = 'COMPLETED'
- ERRORED = 'ERRORED'
- CANCELLED = 'CANCELLED'
- class qci_client.optimization.enum.FileType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]
Bases:
EnumEnumeration of all file types, where values match files API values.
- CONSTRAINTS = 'constraints'
- GRAPH = 'graph'
- HAMILTONIAN = 'hamiltonian'
- OBJECTIVE = 'objective'
- POLYNOMIAL = 'polynomial'
- QUBO = 'qubo'
- GP_RESULTS = 'graph_partitioning_results'
- IHO_RESULTS = 'ising_hamiltonian_optimization_results'
- NQHO_RESULTS = 'normalized_qudit_hamiltonian_optimization_results'
- QHO_RESULTS = 'qudit_hamiltonian_optimization_results'
- QLCBO_RESULTS = 'quadratic_linearly_constrained_binary_optimization_results'
- QUBO_RESULTS = 'quadratic_unconstrained_binary_optimization_results'
qci_client.optimization.utilities
Utilities, especially for creating request bodies.
- qci_client.optimization.utilities.get_file_type(*, file: dict) → FileType[source]
- Get file type from a file.
- qci_client.optimization.utilities.get_file_config(*, file: dict) → Tuple[dict, FileType][source]
- Get file configuration and file type from a file.
- qci_client.optimization.utilities.get_post_request_body(*, file: dict) → MetadataPostRequestBody[source]
- Format metadata body.
- qci_client.optimization.utilities.get_patch_request_body(*, file: dict) → PartPatchRequestBody[source]
- Format part body.
- qci_client.optimization.utilities.zip_payload(*, payload: PartPatchRequestBody) → bytes[source]
- Parameters:
- payload – str - json contents of file to be zipped
- Returns:
- zipped request_body
- qci_client.optimization.utilities.file_part_generator(*, file: dict, compress: bool) → Generator[source]
Break file-to-upload’s data dictionary into chunks, formatting correctly with each returned chunk.
- Parameters:
- file – file to break up into file parts
- compress – whether or not file parts are to be compressed
- Returns:
- generator of (part_body, part_number) tuples
- qci_client.optimization.utilities.add_device_aliases(*, metrics: dict) → dict[source]
Add the “dirac-3” alias to a job’s device metrics, which are keyed by the specific device name that was submitted rather than the alias that may have been requested.
The specific key is retained, and the alias refers to the same object rather than to a copy, so mutating one is visible through the other. Metrics that are missing, that hold no device block, or that are already keyed by the alias are returned unchanged.
- Parameters:
- metrics – response from a job-metrics GET call to API
- Returns:
- The same metrics dict, with device aliases added in place