Skip to content

Releases: dwavesystems/dwave-cloud-client

0.13.1

20 Sep 16:37
Compare
Choose a tag to compare

New Features

  • Configuration constants like default region and default API endpoints are now available in a new module dwave.cloud.config.constants.

    Configuration-related exceptions are now available in a new module dwave.cloud.config.exceptions.

    dwave.cloud.config module (with submodules) is now free from dependencies on other submodules, and it's safe to be imported in any cloud-client context.

Deprecation Notes

  • Use of dwave.cloud.api.constants to access default configuration constants is deprecated in dwave-cloud-client==0.13.1 in favor of a new config module dwave.cloud.config.constants, and will be disabled in dwave-cloud-client==0.14.0.

Bug Fixes

  • Fix a circular import error. See #669.

0.13.0

19 Aug 09:52
Compare
Choose a tag to compare

New Features

  • Enable QPU problem data compression on upload using deflate content encoding.

    Compression is controlled with a new config option, compress_qpu_problem_data, defaulting to true, and it can be turned off either in config file or via Client() kwarg. See #622.

  • Add long polling as problem status/answer polling strategy.

    We add the following config options: poll_strategy ("backoff" is the current default, "long-polling" is the new strategy), poll_wait_time, and poll_pause. See #648.

  • Add timeout keyword argument to api.resources.Problems.get_problem_status() and api.resources.Problems.get_problem_statuses() methods.

    Use it to enable long polling on problem status API endpoint. The connection is closed (server-side) when at least one problem completes, or the timeout (in seconds) elapses, whatever comes first. See #649.

  • Add support for retrieving filtered solver configuration to dwave.cloud.api.resources.Solvers methods. See #644.
  • Add API response caching support to dwave.cloud.api interface. Cache is validated using a conditional request based on ETag. See #645.
  • Poll for problem-status update using long-polling strategy by default. See #662.

    Long-polling strategy enables faster status-change propagation to the client, especially for longer jobs, or during heavy QPU usage.

  • Speed-up function calls that dispatch events by short-circuiting the dispatch in case no event handlers are registered. See #660.
  • Add timeout keyword argument to api.resources.Problems.get_problem() method.

    Use it to enable long polling on problem fetch API endpoint. The connection is closed (server-side) when the problem completes, or the timeout (in seconds) elapses, whatever comes first. In case problem completed in time, problem answer is returned in addition to problem status (which is always returned). See #657.

  • Enable regions metadata API cache control in dwave.cloud.regions.get_regions() by switching to api.Regions built-in caching session. See #647.
  • Speed-up JSON encoding and decoding by switching to orjson. See #423.
  • Parse Cache-Control header field if present in API response, and use it to guide local caching policy.

    This means dwave.cloud.api.DWaveAPIClient and dwave.cloud.api.resource classes now respect origin server response caching policy. See #646.

  • Cache solver metadata on disk, using conditional requests for cache validation (update).

    Static and dynamic parts of solver metadata are fetched and stored separately, to enable efficient caching.

    See #613.

  • Lazily import Client/Solver/Future in the top-level namespace, dwave.cloud. Direct imports are preferred, e.g. from dwave.cloud.client import Client, but the widely-used way (from dwave.cloud import Client) is still supported for backwards compatibility.

    Similarly we now lazily import old namespaces with client type as submodule, e.g. dwave.cloud.qpu.

    The main benefit of such lazy imports is import performance, as "heavy" symbols are only imported when explicitly needed/asked for. See #643.

  • Speed-up imports by slightly decoupling submodules. See #643.
  • Speed-up dwave.cloud.utils.qubo.active_qubits utility function by ~50%, and dwave.cloud.coders.encode_problem_as_qp by 20-30%. See #661.
  • Speed-up QPU problem sampling when problem submitted as BQM by 40%. For best performance, keep linear and quadratic biases in dicts. See #661.
  • Cache dynamic solver metadata for up to 15 minutes, unless defined differently by API cache control response header. See #663.

Upgrade Notes

  • Short polling with exponential backoff is not used by default anymore, but it is still available. If for some reason you want to use it, set:

    poll_strategy = backoff
    

    configuration parameter in your config file, or the keyword argument in calls to Client() or Client.from_config(). See #662.

  • Config attributes previously available directly on Client instance, deprecated in dwave-cloud-client==0.11.0, are removed in dwave-cloud-client==0.13.0.

    Use config model (dwave.cloud.config.models.ClientConfig) available as Client.config to access client configuration instead.

    Path to most attributes translates directly. For example, Client.region is now available as Client.config.region. One attribute has been renamed (Client.default_solver is now Client.config.solver), and all Client.poll_* config options are consolidated under Client.config.polling_schedule.*. Similarly Client.http_retry_* options are now available under Client.config.request_retry.*. See #664.

Deprecation Notes

  • dwave.cloud.utils.coders.NumpyEncoder is deprecated and will be removed in dwave-cloud-client==0.14.0. Use orjson.dumps() with OPT_SERIALIZE_NUMPY option instead. See #652.
  • Shorthand import paths for specialized Clients (for qpu, sw and hybrid) are deprecated in dwave-cloud-client==0.12.2 and will be removed in dwave-cloud-client==0.14.0. Instead, use the full import path, e.g. from dwave.cloud.client.qpu import Client, instead of from dwave.cloud.qpu import Client. See #643.

Bug Fixes

  • Defer SQLite connect in @cached.ondisk() until actually needed. Also, verify cache thread/process-safety and forking support. See #642.
  • Fix get_cache_dir() to not create the cache directory by default. Creation is now optional and controlled with create argument. This makes it consistent with other config path functions. See #642.
  • Fix possible race condition during cache directory create. See homebase#37, #642.
  • During solver metadata filtering, treat solver status as a dynamic field. This is to handle an edge case when solver is marked offline, but it's still available via API. See #663.

0.12.1

25 Jul 18:48
Compare
Choose a tag to compare

New Features

  • Add some basic benchmarks (use airspeed velocity/asv).

  • Add dwave.cloud.testing.mocks.hybrid_cqm_solver_data(), a mock metadata generator for the CQM hybrid solver.

  • Add dwave.cloud.coders.decode_qp_problem, a decoder of quadratic unconstrained binary problems in SAPI's "qp" format.

  • Add qpu_zephyr_solver_data generator for mock QPU solvers with Zephyr topology.

Bug Fixes

  • Update dwave.cloud.testing.mocks.hybrid_*_solver_data() generators to include the full list of solver properties (albeit with mock/dummy values).

  • Fix a regression bug introduced during utils module refactor and keep using importlib_metadata for entry_points() access. See #631.

0.12.0

14 Jun 15:28
Compare
Choose a tag to compare

Upgrade Notes

  • dwave.cloud.utils module has been split into the following submodules: dwave.cloud.utils.cli, dwave.cloud.utils.coders, dwave.cloud.utils.decorators, dwave.cloud.utils.dist, dwave.cloud.utils.exception, dwave.cloud.utils.http, dwave.cloud.utils.logging, dwave.cloud.utils.qubo, and dwave.cloud.utils.time.

    First reason for doing this was code clean-up (including adding type annotations), but a more important reason is that this will enable import time optimization in the future. And that's why we break backwards compatibility by not importing everything back into the top-level utils namespace.

    The utils module is considered Ocean-internal as is, so this move shouldn't affect user's code.

  • Positional arguments in dwave.cloud.Client constructor, deprecated in 0.10.0, are removed in 0.12.0. Use keyword arguments instead.
  • Alias keys samples and occurrences (for solutions and num_occurrences) in the results dict of dwave.cloud.computation.Future.result(), deprecated in 0.8.0, are now finally removed in 0.12.0. We'll try to keep the result dict as close to raw data returned by SAPI as possible. Postprocessed data is instead available via dwave.cloud.computation.Future properties.

New Features

  • Add support for binary-ref answer encoding format, where answer data is not immediately present in the answer, but on an URI referenced in the answer response.
  • Add dwave.cloud.computation.Future.answer_data property to hold the answer data of a resolved future. A call to .answer_data will block until computation future is resolved.
  • Add dwave.cloud.api.models.UnstructuredProblemAnswerBinaryRef model, a subclass of ProblemAnswer for binary-ref answers, and a method for downloading answer data (resolving binary-ref), dwave.cloud.api.resources.Problems.get_answer_data.
  • Add support for nonlinear unstructured solvers with dwave.cloud.solver.NLSolver.
  • Add request/response logging to AuthFlow/OAuth2Session.
  • Add basic support for structured logs (JSON output).
  • Enable log format control with DWAVE_LOG_FORMAT env variable (set to "json" for structured output.

Bug Fixes

  • Fix a possible race condition when multiple threads try to resolve remote computation results. A special case of this occurs on binary answer download from a reference link. See #624.
  • Log failing request/response details in the low-level API client.
  • Suppress logging output from the cloud-client by default (as recommended for libraries).
  • Format log record date/time according to ISO 8601.

0.12.0.dev0

12 Jun 21:37
Compare
Choose a tag to compare
0.12.0.dev0 Pre-release
Pre-release

New Features

  • Add support for binary-ref answer encoding format, where answer data is not immediately present in the answer, but on an URI referenced in the answer response.
  • Add dwave.cloud.computation.Future.answer_data property to hold the answer data of a resolved future. A call to .answer_data will block until computation future is resolved.
  • Add dwave.cloud.api.models.UnstructuredProblemAnswerBinaryRef model, a subclass of ProblemAnswer for binary-ref answers, and a method for downloading answer data (resolving binary-ref), dwave.cloud.api.resources.Problems.get_answer_data.
  • Add support for nonlinear unstructured solvers with dwave.cloud.solver.NLSolver.
  • Add request/response logging to AuthFlow/OAuth2Session.
  • Add basic support for structured logs (JSON output).
  • Enable log format control with DWAVE_LOG_FORMAT env variable (set to "json" for structured output.

Bug Fixes

  • Fix a possible race condition when multiple threads try to resolve remote computation results. A special case of this occurs on binary answer download from a reference link. See #624.
  • Log failing request/response details in the low-level API client.
  • Suppress logging output from the cloud-client by default (as recommended for libraries).
  • Format log record date/time according to ISO 8601.

0.11.4

17 Apr 14:59
Compare
Choose a tag to compare

New Features

  • Add revoke_token method to dwave.cloud.auth.flow.AuthFlow to enable revocation of OAuth 2.0 refresh/access tokens. See #600.

  • Add dwave auth revoke CLI command to enable revocation of OAuth 2.0 refresh/access tokens from command line. See #600.

Bug Fixes

  • Set correct lower bounds for requests/urllib3, and preemptively set upper bounds on other dependencies to prevent future breaks. See #612.

0.11.3

01 Mar 16:05
Compare
Choose a tag to compare

Bug Fixes

  • Use fixed authorization success URL, without any authorization query parameters appended (to minimize exposure), as they are not needed on the authorization server's success page.
  • Improve CSRF protection on localhost redirect URI during authorization code exchange. Previously, state was verified only if supplied. Now it's mandatory. Please note this is an additional CSRF protection on top of the PKCE, just in case PKCE is not supported (or properly implemented) server-side.
  • Fix PKCE support in dwave.cloud.auth.flow.AuthFlow by properly including code_verifier in fetch token (code exchange) requests. See #605.
  • Remove circular references in dwave.cloud.computation.Future to enable easier garbage collection and lower memory footprint. See #601.
  • Use a consistent User-Agent value for all API and non-API requests made by Client, api.Client and auth.flow client.
  • Speed-up User-Agent string construction significantly (10ms to 5us).

0.11.2

30 Nov 13:30
Compare
Choose a tag to compare

New Features

  • Add Python 3.12 support.

  • Add dwave.cloud.utils.get_distribution as a replacement for pkg_resources.get_distribution unavailable in Python 3.12.

0.11.1

01 Nov 16:53
Compare
Choose a tag to compare

New Features

  • Add optional Leap authorization step to dwave setup CLI. During setup, we now install optional contributed packages, authorize Ocean to access Leap (--auth and --oob flags), and finally create the configuration file, optionally retrieving SAPI token from Leap API (if authorized) for the currently active Leap project, or project specified with --project option. See #591.
  • Add --skip-valid option to dwave auth login CLI. When used, authorization flow will be skipped if Leap access token is valid or if it can be refreshed.
  • Prefer QPU solvers in dwave ping, unless overridden by user/config. See #592
  • Redirect user back to a Leap info page when auth redirect flow successfully completes. Similarly, redirect user to a Leap error page in case of an auth error.

0.11.0

11 Oct 10:44
Compare
Choose a tag to compare

New Features

  • Add Leap authorization-related group of CLI commands under dwave auth: login, get <token-type>, refresh. See #565.
  • Add Leap project CLI commands under new dwave leap project group: ls, token.
  • Add --auto option to dwave config create to attempt SAPI token fetch from Leap API on configuration file create (if access already authorized with dwave auth login).
  • For OAuth 2.0 Authorization Code exchange flow, add support for both the redirect flow and the out-of-band flow. See #564.
  • Add a general-purpose, multi-threaded, WSGI application server, dwave.cloud.auth.server.BackgroundAppServer. This server can handle redirect URIs in the OAuth2 authorization code flow. See #563.
  • Add dwave.cloud.auth.server.SingleRequestAppServer based on dwave.cloud.auth.server.BackgroundAppServer to specifically handle only one (valid) request to the OAuth redirect URI (and self-terminate after that).
  • Add dwave.cloud.auth.creds.Credentials, an on-disk credentials store. See #562.
  • Add configuration options for defining Leap API endpoint: leap_api_endpoint option in configuration file or as keyword argument, and DWAVE_LEAP_API_ENDPOINT environment variable. See #569.
  • Add a configuration option for setting Leap OAuth 2.0 Ocean client id, leap_client_id. Primarily used for testing.
  • Add OAuth 2.0 Authorization Code exchange flow to enable users to authorize Ocean SDK to access Leap API on their behalf. See #564.
  • Add wall time and QPU timing to dwave sample output. See #570.
  • Add a per-call cached value maximum age (maxage_) for functions decorated with @cached.
  • Allow specifying cache key explicitly, instead of using all arguments of a function decorated with @cached.
  • Add cache bypass control via disable() and enable() on the decorated function.
  • Add @cached.disabled context manager (and a function decorator) that temporarily disables cache within the context (i.e. the decorated function). See #503.
  • Add leap_api_endpoint and solver_api_endpoint properties to dwave.cloud.api.models.Region.
  • Move dwave.cloud.Client.get_regions to dwave.cloud.regions.get_regions in a new regions submodule, and refactor for flexibility of use and better caching control. See #577.
  • Add endpoints-from-region resolver, dwave.cloud.regions.resolve_endpoints. Previously, similar resolver was part of the Client class.
  • Add --clique-size/--size/-k options to dwave sample CLI command to help specify problem size (clique size) for random problems generated for unstructured solvers.
  • Add Pydantic-based data model for cloud-client configuration, dwave.cloud.config.models.ClientConfig.
  • Consolidate client runtime configuration options under Client.config, a data model defined with dwave.cloud.config.models.ClientConfig and decouple config parsing from dwave.cloud.Client construction. See #504.
  • Add from_config() family of factories to dwave.cloud.api.client.DWaveAPIClient and subclasses for SolverAPI, MetadataAPI and LeapAPI. from_config() dispatches to from_config_model() or from_config_file(), depending on arguments. See #572.
  • Use full client config for Metadata API access during region/endpoint resolution on dwave.cloud.Client construction. See #505.
  • Add support for specifying connection read timeout separately from connect timeout. Previously, both read and connect timeouts were set to the same value, specified with the request_timeout configuration parameter. We now accept a (read, connect) tuple for the request_timeout parameter. See #440.
  • Add --project option to dwave config create, to be used in conjunction with --auto/--auto-token.

    When project is not specified, the configuration file is initialized with a SAPI token for the currently active Leap project.

    Project can be specified via project name, code or ID.

  • Upgrade dwave.cloud.api.models.* to use Pydantic v2. See #555.

Upgrade Notes

  • Upgrade your python to 3.8+. We no longer support python 3.7 and below.
  • Method from_client_config() is removed from dwave.cloud.api.resources.ResourceBase, (affecting instantiation of its subclasses), in favor of a new method from_config_model() (or alternatively, a more general from_config()). Previously an instance of either dwave.cloud.Client or dwave.cloud.api.DWaveAPIClient was required, and now it's possible to use just the configuration, a dwave.cloud.config.models.ClientConfig object.

    To upgrade, replace {ResourceBase}.from_client_config(cloud_client) with {ResourceBase}.from_config_model(client.config), and {ResourceBase}.from_client_config(dwave_api_client) with {ResourceBase}(dwave_api_client).

  • @dwave.cloud.utils.cached parameter cache has been renamed to store.
  • API models now coerce Numpy types to Python types on validation (model instantiation), instead of holding typing.Any until serialization.
  • Disk cache serialization changed from Python pickle to JSON. Currently, disk cache is used only for the list of Leap regions fetched from the Metadata API on dwave.cloud.Client instantiation. Upgrade should be seamless, as a new on-disk cache database file is created for each dwave-cloud-client version.

Deprecation Notes

  • Client method get_regions is deprecated in favor of dwave.cloud.regions.get_regions.
  • Individual config options exposed as dwave.cloud.Client attributes are deprecated since dwave-cloud-client==0.11.0 and will be removed in dwave-cloud-client==0.12.0. Use Client.config data model instead.

Bug Fixes

  • Fix @cached instances isolation when using a shared storage (e.g. disk cache), via bucket argument (cache key prefix).
  • Fix random problem sampling on hybrid solvers via dwave sample CLI. See #557.
  • Fix region/endpoint resolution during dwave.cloud.Client construction when insecure connection is required (config: permissive_ssl = On) and/or a proxy is used (config: proxy = socks5://...). Previously client construction would fail completely. See #507.
  • Correctly set backoff_max time for retried requests when urllib3>=2.0 is used. See #566.