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](https://github.com/dwavesystems/dwave-cloud-client/issues/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](https://github.com/dwavesystems/dwave-cloud-client/issues/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](https://github.com/dwavesystems/dwave-cloud-client/pull/649).
- Add support for retrieving filtered solver configuration to `dwave.cloud.api.resources.Solvers` methods. See [\644](https://github.com/dwavesystems/dwave-cloud-client/pull/644).
- Add API response caching support to `dwave.cloud.api` interface. Cache is validated using a conditional request based on `ETag`. See [\645](https://github.com/dwavesystems/dwave-cloud-client/pull/645).
- Poll for problem-status update using long-polling strategy by default. See [\662](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/657).
- Enable regions metadata API cache control in `dwave.cloud.regions.get_regions()` by switching to `api.Regions` built-in caching session. See [\647](https://github.com/dwavesystems/dwave-cloud-client/issues/647).
- Speed-up JSON encoding and decoding by switching to `orjson`. See [\423](https://github.com/dwavesystems/dwave-cloud-client/issues/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](https://github.com/dwavesystems/dwave-cloud-client/issues/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](https://github.com/dwavesystems/dwave-cloud-client/issues/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](https://github.com/dwavesystems/dwave-cloud-client/pull/643).
- Speed-up imports by slightly decoupling submodules. See [\643](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/661).
- Speed-up QPU problem sampling when problem submitted as BQM by 40%. For best performance, keep linear and quadratic biases in `dict`s. See [\661](https://github.com/dwavesystems/dwave-cloud-client/pull/661).
- Cache dynamic solver metadata for up to 15 minutes, unless defined differently by API cache control response header. See [\663](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/643).
Bug Fixes
- Defer SQLite connect in `cached.ondisk()` until actually needed. Also, verify cache thread/process-safety and forking support. See [\642](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/642).
- Fix possible race condition during cache directory create. See [homebase\37](https://github.com/dwavesystems/homebase/issues/37), [\#642](https://github.com/dwavesystems/dwave-cloud-client/pull/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](https://github.com/dwavesystems/dwave-cloud-client/pull/663).