# Changelog ## v1.7.2 (Sep. 10, 2026) ### New features and support * Add {py:func}`~amplify.where` function. * Add {py:func}`~amplify.set_printoptions` to set the number of terms and significant digits shown. * Add the `alpha` parameter to {py:class}`~amplify.QAOA` and {py:class}`~amplify.RQAOA`, which makes the cost the Conditional Value-at-Risk (CVaR) of the measured energies. * Add {py:attr}`~amplify.FixstarsClient.objective_format` to {py:class}`~amplify.FixstarsClient`, {py:class}`~amplify.AmplifyAEClient`, and {py:class}`~amplify.ToshibaSQBM2Client`. The default {py:class}`~amplify.ObjectiveFormat.Auto` sends whichever of a dense matrix and a list of terms is smaller. Give {py:class}`~amplify.ObjectiveFormat.Dense` to keep the earlier behavior. * Add `__repr__` and `__str__` to {py:class}`~amplify.AcceptableDegrees`, {py:class}`~amplify.VariableGenerator`, {py:attr}`~amplify.Result.split`, and the key, value, and item views of {py:class}`~amplify.Values` and of the intermediate mapping. Each of them showed only its address before. * Support OQTOPUS Cloud with {py:class}`~amplify.OqtopusClient`. * Support Pyodide with a WebAssembly wheel that `micropip` installs and a browser runs. Only the formulation API and {py:class}`~amplify.AmplifyAEClient` work there, and each wheel fits one version of Pyodide. * Support the dense coupling mode of Amplify AE for a dense quadratic {py:class}`~amplify.Poly`, which needed a {py:class}`~amplify.Matrix` before. * Support file output for a model whose objective function is a {py:class}`~amplify.Matrix`. ### Changes of behavior * Change {py:attr}`~amplify.Model.objective` to always return a {py:class}`~amplify.Poly`. A model now copies the {py:class}`~amplify.Matrix` that you give it, and it accepts the addition or the subtraction of a {py:class}`~amplify.Poly`. * Change a model to drop the variables that a {py:class}`~amplify.Matrix` only declares. {py:attr}`~amplify.Model.variables` lists fewer variables, and the problem that the client sends becomes smaller. * Change {py:attr}`~amplify.QuadraticModel.input_matrix` and {py:attr}`~amplify.QuadraticModel.logical_matrix` to raise a {py:exc}`NotImplementedError`. Use {py:attr}`~amplify.QuadraticModel.input_poly` and {py:attr}`~amplify.QuadraticModel.logical_model_poly` instead. * Change {py:class}`~amplify.AmplifyAEClient` to warn when you give a weight to a constraint and solve with the default {py:class}`~amplify.AmplifyAEClient.Solver.Constraint` solver. Amplify AE sets the weight itself, so the tutorials and the examples no longer give one. * Change a bound that narrows a Binary or an Ising variable to raise a {py:exc}`ValueError`. Amplify dropped such a bound before, so it solved another model than the one you described. Use {py:func}`~amplify.equal_to` to fix a variable to one value. * Change a lower bound of positive infinity, or an upper bound of negative infinity, to raise a {py:exc}`ValueError`, because such a bound leaves no value. Amplify read it as "no bound" before, which widened the variable. * Change {py:func}`~amplify.load_lp` and {py:func}`~amplify.load_qplib` to give a constraint for a bound that narrows a Binary variable, such as `x <= 0`. Amplify dropped such a bound in silence before. Give the constraint enough weight, because a solver turns it into a penalty. * Change {py:func}`~amplify.load_qplib` to read an integer variable whose bounds are 0 and 1 as a {py:class}`~amplify.VariableType.Binary` variable, because QPLIB writes a binary variable in that form. Such a model held integer variables and no binary variable before. * Change {py:func}`~amplify.save_qplib` to warn when a variable bound or a constraint bound reaches an absolute value of 1e+20. QPLIB reads that value as infinity, so loading the file back drops the bound, or fails when the sign of the bound leaves nothing that satisfies it. * Change {py:func}`~amplify.save_lp` and {py:func}`~amplify.save_qplib` to raise a {py:exc}`ValueError` for a coefficient or a constraint bound that is NaN or infinity. Amplify wrote `nan` or `inf` into the file before, and neither format gives those a spelling. * Change {py:func}`~amplify.load_lp` and {py:func}`~amplify.load_qplib` to raise a {py:exc}`RuntimeError` for a value that is not a number, such as `nan`. {py:func}`~amplify.load_qplib` read such a value as zero in silence before, and {py:func}`~amplify.load_lp` gave a model that no solver accepts. * Change an integer parameter to raise a {py:exc}`TypeError` for a value that loses precision, such as `numpy.float64(3.0)`. It truncated such a value in silence before, and a NumPy integer, such as `numpy.int64(3)`, still works. * Change {py:func}`~amplify.set_num_threads` to limit the logical cores that Amplify uses, the parallel formulation included. Amplify caps a value that is larger than the number of the cores of the hardware. * Change {py:func}`~amplify.set_num_threads` and {py:func}`~amplify.set_seed` to take a named argument, `num_threads` and `seed`. A positional call still works. * Change `amplify.Dim0` through `amplify.Dim4` from classes to aliases of `tuple`, and add {py:class}`~amplify.N` for one axis. `PolyArray[Dim2]` still works, and only `isinstance` with one of these names stops. * Change the type stub to give the dimension of the result of an index, of a matrix product, and of an elementwise operation. A {py:class}`~amplify.PolyArray` that you build from a NumPy array or a list takes `PolyArray[Dim]`, which no `PolyArray[Dim2]` accepts. * Change the D-Wave solver names to agree with the D-Wave API. A solver name no longer holds the system revision, so Advantage_system4.1 is now Advantage_system4. * Remove `amplify.NECVA2Client` and `amplify.client.NECClient`. NEC Vector Annealing (VA) Service 2.0 ended on April 1, 2025, so the client reaches no machine. * Raise a {py:exc}`ValueError` when you solve a model whose objective function holds no variable. ### Performance * Improve performance of model formulation, including {py:func}`~amplify.einsum`, {py:func}`~amplify.one_hot`, and {py:meth}`~amplify.Model.to_unconstrained_poly`. The TSP formulation is now up to 30 times faster than v1.0. See [](benchmark.md). * Improve memory usage of model formulation. The TSP formulation now needs approximately one-fourth to one-fifth of the memory of v1.0 for a problem with more than 10,000 variables. * Improve performance of {py:meth}`~amplify.Model.to_intermediate_model` for a model with many integer or real variables, or with many higher-order terms. * Improve performance of {py:func}`~amplify.load_qplib`. A QPLIB file of 230 thousand terms now loads about 1.2 times faster. * Update {py:func}`~amplify.save_lp` and {py:func}`~amplify.save_qplib` to raise a {py:exc}`RuntimeError` for invalid variable names or constraint labels, and emit warnings for ignored constraint weights or duplicate variable names. ### Platform and dependencies * Update the D-Wave solver graphs for Advantage_system4, Advantage_system6, and Advantage2_system1. * Change supported macOS to Sonoma or later. * Update the required version of `typing_extensions` to `>= 4.16.0`, and of `amplify-quantum` to `>= 1.3.0`. ### Documentation * Publish the documentation in Markdown for AI agents. Every page has a Markdown copy next to it, and each language also carries `llms.txt` and `llms-full.txt`. * Add an English version of [](amplify_ae/summary.md), which introduces the latest Amplify AE. * Add a description of every operator of {py:class}`~amplify.Poly`, {py:class}`~amplify.PolyArray`, and {py:class}`~amplify.ConstraintList` to the API reference and to {py:func}`help`, and remove the signatures of a {py:class}`~amplify.PolyArray` operation that no call could reach. * Add a description of the settings that every client carries, such as {py:attr}`~amplify.FixstarsClient.url`, {py:attr}`~amplify.FixstarsClient.token`, and {py:attr}`~amplify.FixstarsClient.parameters`, and of each member of {py:class}`~amplify.PenaltyFormulation`. ### Fixes * Fix: {py:attr}`~amplify.Model.variables` and {py:meth}`~amplify.Model.get_variables` now list every variable of a {py:class}`~amplify.Matrix` objective whose first variable index is not zero. * Fix: {py:func}`~amplify.load_lp` and {py:func}`~amplify.save_lp` now support non-ASCII characters, such as Japanese, and a variable name of up to 255 characters, the indices included. * Fix: {py:func}`~amplify.load_lp` now reads a file that has no objective section, and gives a model whose objective is 0. It raised an error before. * Fix: {py:func}`~amplify.load_lp` now takes the type of a variable from the last variable type section that names it, as the LP format defines. A variable in both `Binary` and `Generals` became Binary before. * Fix: {py:func}`~amplify.load_lp` now reads a variable name that starts with the spelling of a number, such as `info` or `nano`. Such a file failed to load before. * Fix: {py:func}`~amplify.load_lp` now reads a bound that fixes a variable to one value, such as `x = 3`. Such a file failed to load before. * Fix: {py:func}`~amplify.load_lp` now reads a file that has no `End` line, which the LP format allows. Such a file failed to load before. * Fix: {py:func}`~amplify.save_lp` now raises a {py:exc}`RuntimeError` for a variable named `inf`, `infinity`, or `nan`. It wrote a file that no reader can load before. * Fix: {py:func}`~amplify.save_lp` now keeps the exact value of every coefficient and bound. It wrote 10 significant digits before, so `0.1234567890123456` came back as `0.123456789`. * Fix: {py:func}`~amplify.save_lp` now writes `-inf` for a variable that has no lower bound. The LP default of a lower bound is 0, so `x <= 3` alone gave the file another variable than the one you saved. * Fix: {py:func}`~amplify.save_lp` now writes the bound of a Binary variable as `0 <= q <= 1`. It wrote `q free` before, so the file gave a variable with no bound instead of a Binary one. * Fix: {py:func}`~amplify.save_lp` now writes a constraint that holds a constant with the right sign. `x + 5 <= 10` became `x <= 15` in the file, which is another constraint than the one you gave. * Fix: {py:func}`~amplify.save_lp` now writes every line within the 999 characters that the LP format allows, and it never breaks a bound over two lines. A file that held a long name failed to load. * Fix: {py:func}`~amplify.load_qplib` now drops a constraint bound that reaches the infinity value of the file, as the QPLIB format defines. Such a bound became a real constraint before. A bound whose sign leaves nothing that satisfies the constraint now raises. * Fix: {py:func}`~amplify.save_qplib` now keeps the exact value of every coefficient and bound. It wrote 6 significant digits before, so `0.1234567890123456` came back as `0.123457`. * Fix: {py:func}`~amplify.save_qplib` now writes a two-sided constraint that holds a constant with the right value on each side. `1 <= x + 5 <= 10` became `1 <= x <= 5` in the file, which is another constraint than the one you gave. * Fix: {py:func}`~amplify.save_qplib` now writes the two indices of a quadratic term in the lower triangle, as the QPLIB format defines. Another reader could not load the file before. * Fix: {py:func}`~amplify.save_qplib` now accepts a name that holds `!`, `%`, or `#` after its first character. It raised a {py:exc}`RuntimeError` for every such name before. * Fix: A model with an integer variable whose range exceeds 2147483647 now converts to the correct binary encoding. The solution of such a model did not solve the model that you gave before. A range that no encoding can build now raises an {py:exc}`OverflowError`. * Fix: {py:meth}`~amplify.Model.to_intermediate_model` now gives a solution that is optimal for the input model when the quadratization method is `IshikawaKZFD` and the objective function holds Ising variables of degree three or higher. * Fix: {py:meth}`~amplify.Model.to_intermediate_model` now raises a {py:exc}`ValueError` when the objective function and the constraints need different variable types. It returned a model of the forbidden variable type before. * Fix: An inequality constraint now gives a penalty function when Amplify cannot estimate the range of its left side, such as a left side that holds an unbounded variable. The penalty held NaN coefficients before, or it was 0, which removed the constraint from the model. * Fix: A constraint whose left side holds a squared term, such as `a * a <= 3` with `a` in `[-5, 5]`, now stays in the model. Amplify squared the two ends of the range only, so the constraint looked infeasible and its penalty became 0, or negative for an equality. * Fix: `&=`, `|=`, and `^=` now update a {py:class}`~amplify.PolyArray` in place. The name became `None` before when the right side was a {py:class}`~amplify.PolyArray`, and it took a copy otherwise. * Fix: {py:meth}`~amplify.PolyArray.roll` now returns a copy of an array that holds no element. It ended the process before. * Fix: The display of a {py:class}`~amplify.PolyArray` no longer puts a space at the end of a wrapped line. * Fix: `amplify` no longer gives the names that its own implementation imports, such as `amplify.sys` and `amplify.Never`. `from amplify import *` gave them away, and none of them was ever documented. * Fix: The type stub of {py:func}`~amplify.sum` and {py:meth}`~amplify.PolyArray.sum` now accepts `axis` for a zero-dimensional {py:class}`~amplify.PolyArray`. The call always worked, and only the stub rejected it. * Fix: The type stub of {py:func}`~amplify.clamp` now names the second parameter `bounds` when you give `axis` for a {py:class}`~amplify.PolyArray`. A call with that keyword failed the type check although it always worked. * Fix: The type stub of the `type` parameter of {py:class}`~amplify.HitachiClient` no longer accepts `None`. The parameter never took `None`, and such an assignment raised a {py:exc}`TypeError`. * Fix: {py:func}`repr` of a {py:class}`~amplify.Result` that holds no solution now names the class, as it does for a result that holds one. It gave a text that began with `{` and ended with an unmatched `)` before. ## v1.6.0 (May. 21, 2026) * Support quantum computers via the Amplify Quantum extension. * Support Ubuntu 26.04. * Support D-Wave Advantage2_system1. * Fix: Correct response data not being written to file with {py:attr}`~amplify.AmplifyAEClient.write_response_data` enabled in specific cases. ```{dropdown} v1.6.1 (Jun. 09, 2026) * Add `dwave`, `quantum`, and `full` installation options, replacing the `extra` option with `full`. * Fix: {py:func}`~amplify.embed` now works without raising a {py:exc}`ValueError` in all environments. ``` ```{dropdown} v1.6.2 (Jul. 10, 2026) * Deprecate `amplify.NECVA2Client`. NEC Vector Annealing (VA) Service 2.0 ended on April 1, 2025, so the client reaches no machine. * Improve performance of {py:meth}`~amplify.Model.to_unconstrained_poly`. * Fix: Work around a potential dependency resolution error when installing Amplify Quantum. * Fix: {py:func}`~amplify.parallel_solve` now works correctly with multiple client arguments. * Fix: {py:meth}`~amplify.PolyArray.__getitem__` now works correctly when a slice results in zero length. ``` ```{dropdown} v1.6.3 (Aug. 20, 2026) * Support Amplify Quantum v1.3. * Improve performance of {py:meth}`~amplify.Model.get_variables`. * General security hardening and robustness improvements. * Fix: {py:meth}`~amplify.Model.to_unconstrained_poly` now works correctly with inequality constraints. ``` ## v1.5.0 (Apr. 05, 2026) * Overhaul the docstrings. * Support `dense_objective` endpoint of Amplify AE v1.1. * Support Gurobi Optimizer 12.0.3 on {py:class}`~amplify.GurobiClient`. * Change default degree reduction algorithm to {py:class}`~amplify.QuadratizationMethod.Substitute` from {py:class}`~amplify.QuadratizationMethod.IshikawaKZFD`. ## v1.4.0 (Sep. 19, 2025) * Support Amplify Annealing Engine v1.0 on {py:class}`~amplify.AmplifyAEClient`. * Support D-Wave Advantage2_system1.6. * Deprecate D-Wave Advantage2_prototype2.6. * Rename `AmplifyClient` to {py:class}`~amplify.BaseClient`. * Support [D-Wave solver identification updates](https://docs.dwavequantum.com/projects/leap_sapi/en/latest/release_notes.html#solver-identification-update-deprecated-sapi-field) and update the dependent dwave-system package to v1.33.0. * Update type hints for {py:attr}`~amplify.PolyArray` and {py:func}`~amplify.PolyArray.sum`. * Fix: Substitute method for high-order polynomials now correctly reduces the degree to 2. * Fix: {py:func}`~amplify.einsum` now correctly handles integer NumPy arrays. * Fix: {py:class}`~amplify.FujitsuDA4Client` now correctly handles inequality constraints without constants. ```{dropdown} v1.4.1 (Oct 16, 2025) * Support Python 3.14, and Python 3.9 is no longer supported. * Fix: Resolved error of {py:attr}`~amplify.PolyArray.transpose` operation on an unassigned {py:class}`~amplify.PolyArray` class instance. ``` ```{dropdown} v1.4.2 (Feb. 14, 2026) * Support Gurobi Optimizer 12.0.3 on {py:class}`~amplify.GurobiClient`. * Support D-Wave Advantage2_system1.11. * Fix: Update type hints for {py:func}`~amplify.sum`. ``` ## v1.3.0 (Nov. 01, 2024) * Improve support for type annotations. * Improve accuracy of [upper and lower bounds estimates](#penalty-function-auto-generation) in constraint construction. * Change advanced parameters of {py:func}`~amplify.solve`, {py:func}`~amplify.parallel_solve`, {py:func}`~amplify.equal_to`, {py:func}`~amplify.less_equal`, {py:func}`~amplify.greater_equal` and {py:func}`~amplify.clamp` functions to keyword-only arguments for usability. * Support [Hitachi CMOS annealing](https://annealing-cloud.com/) on {py:class}`~amplify.HitachiClient`. * Support D-Wave Advantage2_prototype2.5. * Support conversion from {py:class}`~amplify.Variable` to {py:class}`~amplify.Poly`. * Support input/output of models with [LP](https://docs.gurobi.com/projects/optimizer/en/current/reference/fileformats/modelformats.html#lp-format) and [QPLIB](https://doi.org/10.1007/s12532-018-0147-4) format files. * {py:class}`~amplify.Variable` can be used as a mapping key for {py:func}`~amplify.Poly.substitute`, {py:func}`~amplify.PolyArray.substitute` and {py:func}`~amplify.Constraint.is_satisfied`. * Support conversion from real variables to binary variables. * Add `compress_qpu_problem_data` attribute to {py:class}`~amplify.DWaveSamplerClient`, {py:class}`~amplify.LeapHybridSamplerClient` and {py:class}`~amplify.LeapHybridCQMSamplerClient`. * Add support for Python 3.13, and Python 3.8 is no longer supported. ```{dropdown} v1.3.1 (Nov. 18, 2024) * Fix: Prevent segmentation fault when accessing variables through {py:meth}`~amplify.Model.get_variables` or {py:attr}`~amplify.Model.variables` property on empty models. * Fix: Correct `total_elapsed_time` in {py:class}`~amplify.FujitsuDA4Client.SolverTiming` to reference the proper timing value. * Fix: Update type hints for {py:func}`~amplify.domain_wall` and {py:attr}`~amplify.VariableGenerator.array`. ``` ## v1.2.0 (July 23, 2024) * Support TOSHIBA SQBM+ v2.0.3 on {py:class}`~amplify.ToshibaSQBM2Client`. ```{dropdown} v1.2.1 (Aug. 06, 2024) * Change supported macOS to Monterey or later. ``` ## v1.1.0 (May 13, 2024) * Support NEC Vector Annealing Service 2.0 on `amplify.NECVA2Client`. * Improve the efficiency of the {py:class}`~amplify.QuadratizationMethod.Substitute` quadratization method and significantly reduce the number of auxiliary variables. * Add support for Linux ARM64. ```{dropdown} v1.1.1 (May 28, 2024) * Fix type hints for `Result` class. ``` ## v1.0.0 (Jan. 27, 2024) * Release version 1.0. ```{dropdown} v1.0.2 (Feb. 20, 2024) * Add documents in English. * Fix redundant deprecation warnings. * Add `client.ocean` namespace for legacy compatibility. ``` ```{dropdown} v1.0.3 (Mar. 01, 2024) * Support D-Wave Advantage_system6.4. * Support D-Wave Advantage2_prototype2.2. ``` ```{dropdown} v1.0.4 (Mar. 15, 2024) * Fix a problem where SQBM request data is not sent correctly on Windows. ``` ```{dropdown} v1.0.5 (Mar. 19, 2024) * Support D-Wave Advantage2_prototype2.3. ```