Prelude
Add `QuadraticModel` implementation to Python, Cython and C++. Quadratic models can be represented by a degree 2 polynomial over binary, spin and integer variables.
New Features
- `gnm_random_bqm` generator [808](https://github.com/dwavesystems/dimod/pull/808)
- Allow sample methods decorated by nonblocking_sample_method to
return sample sets that can indicate their doneness. This allows
ScaleComposite to be properly non-blocking even when there is
a vartype change [805](https://github.com/dwavesystems/dimod/pull/805)
- `DiscreteQuadraticModel.degree()` method
- Support PEP518 for building the package [814](https://github.com/dwavesystems/dimod/pull/814)
- Add `cyVariables.size()` and `.at(..)` to improve cython access to the `Variables` object
- Add new `QuadraticModelBase` and `BinaryQuadraticModel` implementation in c++ [818](https://github.com/dwavesystems/dimod/pull/818), [#819](https://github.com/dwavesystems/dimod/pull/819)
- Add `add_bqm` method to C++ BinaryQuadraticModel [821](https://github.com/dwavesystems/dimod/pull/821), [#823](https://github.com/dwavesystems/dimod/pull/823)
- Add `Structured.valid_bqm_graph` method for verifying input problem structure [832](https://github.com/dwavesystems/dimod/pull/832)
- Reimplement `BinaryQuadraticModel` to use new C++ code [828](https://github.com/dwavesystems/dimod/pull/828)
- `BinaryQuadraticModel` can now be manipulated symbolically [834](https://github.com/dwavesystems/dimod/pull/834)
- `load` function can now load all model types [841](https://github.com/dwavesystems/dimod/pull/841), [#843](https://github.com/dwavesystems/dimod/pull/843)
- `DiscreteQuadraticModel` now has an `.offset` attribute [838](https://github.com/dwavesystems/dimod/pull/838)
- Add `ConstrainedQuadraticModel` class [839](https://github.com/dwavesystems/dimod/pull/839)
- Add `make_header`, `read_header` and `write_header` utility functions [842](https://github.com/dwavesystems/dimod/pull/842)
- Add `ExactDQMSampler` [820](https://github.com/dwavesystems/dimod/pull/820)
- Add `ConstrainedQuadraticModel.add_discrete` method. This allows users to create a discrete variable via a one-hot constraint. A disjoint set of discrete variables are tracked by the `CQM` and serialized.
- Add support for quadratic model objectives and constraints in constrained quadratic models. Previously CQMs only supported binary quadratic models.
- Add new `QuadraticModel` class for creating quadratic models.
- Add `CaseLabelDQM` class. Provides means of labeling cases of discrete variables.
- Begin using reno for changelog.
- Add `BinaryQuadraticModel.add_linear_inequality_constraint` and `DiscreteQuadraticModel.add_linear_inequality_constraint` methods.
- Create `dimod/libcpp.pxd` Cython header file. This allows user to `cimport` C++ classes and functions defined in `dimod/include/`
- Use C++ `BinaryQuadraticModel` rather than `AdjVectorBQM` as the underlying object in `cyDiscreteQuadraticModel`. This means that the underlying implementation is now version controlled.
- Add new `Vartype.INTEGER` variable type.
- Add `QuadraticModelBase::scale` method. Scales offset, linear biases, and quadratic biases by a provided scale factor.
- Add bin\_packing, knapsack and multi\_knapsack constrained quadratic model generators.
- Add `BinaryQuadraticModel.is_almost_equal` method for testing approximate equality to other binary quadratic models.
- Add `Variables.copy` method, implemented as a `cpdef` method for Cython and Python access.
- Support specifying lower and upper bounds for integer variables in quadratic models:
- Add `lower_bound` and `upper_bound` keyword arguments to `QuadraticModel.add_variable`.
- Add `QuadraticModel.lower_bound` and `QuadraticModel.upper_bound` methods.
- Add `num_quadratic_variables` to the header of the file created by `ConstrainedQuadraticModel.to_file`. This increments the version to 1.1.
- You can now install preprocessing as part of the dimod install with `pip install dimod[preprocessing]`
- Add an optional `label` keyword argument to `ConstrainedQuadraticModel.add_discrete`. The method also now returns the assigned label, whether supplied or generated. This is consistent with `ConstrainedQuadraticModel.add_constraint`.
- `cyBQM` and `cyQM` fused types can now be cimported from the `dimod` namespace.
- Add `.data()` method to `cyQM_template` and `cyBQM_template` that returns a const pointer to the underlying C++ `QuadraticModel` and `BinaryQuadraticModel` respectively.
- Add `QuadraticModel.change_vartype()` method.
- Add C++ `dimod::QuadraticModel::change_vartype()` method. Also add non-const versions of `dimod::QuadraticModel::vartype()`, `dimod::QuadraticModel::lower_bound()`, and `dimod::QuadraticModel::upper_bound()`.
- Add `QuadraticModel.set_upper_bound` and `QuadraticModel.set_lower_bound` methods.
- Add `Binaries`, `Spins` and `Integers` functions. See [\918](https://github.com/dwavesystems/dimod/issues/918).
- Add `DiscreteQuadraticModel.get_cases` method to match `CaseLabelDQM.get_cases`.
- Implement `QuadraticModel.remove_interaction` method, previously it raised a `NotImplementedError` error.
- Add `linear` option as a new `slack_method` for `DiscreteQuadraticModel.add_linear_inequality_constraint` method. This will add only one discrete variable to an inequality constraint with linear number of cases, according to right hand side value of the constraint.
- Add `quicksum` function for faster summation of `QuadraticModel` and `BinaryQuadraticModel`. Python's built-in `sum` continues to work, but `quicksum` will generally be faster when adding many objects.
- Add a generator, `dimod.generators.binary_encoding`, to create a binary quadratic model that encodes an integer.
- Add methods to construct a constrained quadratic model from other model types:
- `ConstrainedQuadraticModel.from_discrete_quadratic_model` with an alias `ConstrainedQuadraticModel.from_dqm`
- `ConstrainedQuadraticModel.from_quadratic_model` with two aliases `ConstrainedQuadraticModel.from_qm` and `ConstrainedQuadraticModel.from_bqm`
See [\866](https://github.com/dwavesystems/dimod/issues/866).
- Add `QuadraticModel.add_quadratic_from()` method.
- Add `QuadraticModel.add_linear_from()` method.
- Add `ConstrainedQuadraticModel.lower_bound()` and `ConstrainedQuadraticModel.upper_bound()` methods.
- Add `cqm_to_bqm` function.
- Add `ConstrainedQuadraticModel.substitute_self_loops` method that replaces integer self-loops by introducing a new variable and adding a constraint.
- Add `copy_always` parameter to `Initialized.parse_initial_states`.
- Add new binary quadratic model generators for simple logic gates:
- `dimod.generators.and_gate`
- `dimod.generators.fulladder_gate`
- `dimod.generators.halfadder_gate`
- `dimod.generators.or_gate`
- `dimod.generators.xor_gate`
See [\951](https://github.com/dwavesystems/dimod/issues/951).
- `QuadraticModel.energies`, `QuadraticModel.energy`, `BinaryQuadraticModel.energies`, and `BinaryQuadraticModel.energy` now all support samples containing a superset of the variables in the model. Any variables not in the model are ignored when calculating the energy.
- Labels for `dimod.Spin`, `dimod.Binary`, and `dimod.Integer` are no longer required positional arguments. By default, unique labels are applied via the [uuid](https://docs.python.org/3/library/uuid.html) module.
Upgrade Notes
- Drop `AdjMapBQM` and `AdjArrayBQM` [788](https://github.com/dwavesystems/dimod/pull/788)
- Promote `dimod.binary.binary_quadratic_model.BinaryQuadraticModek` to the top-level `dimod` namespace and remove `dimod.binary_quadratic_model.BinaryQuadraticModel` [847](https://github.com/dwavesystems/dimod/pull/847)
- Symbolically multiplying, subtracting and adding `BinaryQuadraticModel`\`s with different vartypes now creates a `QuadraticModel` rather than raising an error.
- Use C++ `BinaryQuadraticModel` rather than `AdjVectorBQM` as the underlying object in `cyDiscreteQuadraticModel`. Any code that relied on the old `AdjVectorBQM` implementation will need to be upgraded.
- Make `dimod.vartypes.ExtendedVartype` an alias for `dimod.vartypes.Vartype`. Also remove `ExtendedVartypeLike` from `dimod.vartypes` and `dimod.typing`.
- Remove `dimod.utils.LockableDict` and `dimod.decorators.lockable_method`. Also `SampleSet.is_writeable` can no longer be set to `False`.
- `BinaryQuadraticModel.data.vartype()` is now accessed as a method rather than as an attribute. This is consistent with `QuadraticModel.data.vartype()`.
- `from dimod cimport cyBQM` now is a fused type containing `cyBQM_float32` and `cyBQM_float64`. You can use the `cyBQM` containing `cyAdjVectorBQM` with `from dimod.bqm cimport cyBQM`.
- `QuadraticModel.objective` is now always a `QuadraticModel`. Previously it could either be a `BinaryQuadraticModel` or a `QuadraticModel`.
- `QuadraticModel.objective` now contains all variables in the constrained quadratic model. Previously it could contain a subset of the variables.
Deprecation Notes
- `AdjVectorBQM` and `AdjDictBQM` are deprecated and will be removed in dimod 0.11.0. Use `BinaryQuadraticModel` with `dtype=np.float64` and `dtype=object` respectively.
- `SampleSet.is_writeable` is deprecated and now always returns True.
- Some composites have been migrated to `dwave-preprocessing`. The affected composites:
- `ClipComposite`
- `ConnectedComponentsComposite`
- `FixedVariableComposite`
- `RoofDualityComposite`
- `ScaleComposite`
- `SpinReversalTransformComposite`
you no longer can use the composites without having `dwave-preprocessing` installed. Using them with it installed results in a deprecation warning.
- The `preprocessing` extra install argument has been removed.
- Remove `dimod.meta` namespace. Its functionality, `SamplerABCMeta` and `samplemixinmethod`, has been migrated to the `dimod.core.sampler` namespace.
- Deprecate `ConstrainedQuadraticModel.variables.vartypes`, `ConstrainedQuadraticModel.variables.lower_bounds`, and `ConstrainedQuadraticModel.variables.upper_bounds` attributes.
- Deprecate `ConstrainedQuadraticModel.variables.vartype()` method.
Bug Fixes
- Windows wheels now correctly include `.pxd` files.
- Fix broken documentation links [815](https://github.com/dwavesystems/dimod/pull/815)
- `DiscreteQuadraticModel.adj` is no longer constructed each time on the fly [807](https://github.com/dwavesystems/dimod/pull/807)
- Cython implementation of the `Variables` object [812](https://github.com/dwavesystems/dimod/pull/812)
- Windows wheels now correctly include `.pxd` files. [826](https://github.com/dwavesystems/dimod/pull/826)
- Fix type promotions in binary quadratic models with object biases [836](https://github.com/dwavesystems/dimod/pull/836)
- Fix issue where `Variables._relabel` mislabeled other variables [a0791b0](https://github.com/dwavesystems/dimod/commit/a0791b0045892d383ad37a53da1bf0ff6c0a2bdb)
- Fix subtracting a `BinaryQuadraticModel` from a number. Before it would return `bqm - 1` rather than correctly returning `1 - bqm`.
- Stop using deprecated numpy aliases like `np.int`, `np.float`, and `np.complex.
- Add support for AdjVectorBQM and AdjDictBQM in ConstrainedQuadraticModel.
- Fix shallow copies of `Variables` objects when using `copy.copy`.
- Implement rule of five for `dimod::NeighborhoodIterator`, `dimod::ConstNeighborhoodIterator`, and `dimod::ConstQuadraticIterator`. This fixes double frees caused by the default copy constructor copying information that is not intended to be shared.
- Fix shallow copies of `BinaryQuadraticModel` with `object` dtype when using `copy.copy`.
- Fix wrong behaviour when the lower bound (lb) equals the upper bound (lb) in `add_linear_equality_constraint`. Correct behaviour is to add constraint as eqaulity when lb is equal ub.
- Fix case where adding linear and quadratic biases whose class requires arguments on construction to a `BinaryQuadraticModel` with `object` dtype could fail.
- Fix `QuadraticModel.spin_to_binary` not correctly updating the variable type of the changed variables.
- Fix `QuadraticModel.energies` when given samples with values greater than the maximum value representable by an 8 bit integer. Previously samples were incorrectly cast to 8 bit integers.
- Fix energy calculation when the lower bound (lb) equals the upper bound (lb) in `DiscreteQuadraticModel.add_linear_inequality_constraint` and `BinaryQuadraticModel.add_linear_inequality_constraint`.
- When a `QuadraticModel` already has an integer variable, adding it with `QuadraticModel.add_variable` with different lower or upper bounds now correctly raises an exception. Likewise, adding or multiplying the same variable symbolically with different bounds will also raise an exception.
- When a `ConstrainedQuadraticModel` already has an integer variable, adding it as part of a constraint or objective with different lower or upper bounds now correctly raises an exception.
- Make `dimod.INTEGER` correctly deepcopy-able.
- Fix (deprecated) `AdjVectorBQM.to_file` and `AdjVectorBQM.from_file`. See [\898](https://github.com/dwavesystems/dimod/issues/898).
- Fix `BinaryQuadraticModel.energies` for a `BQM` with `dtype=object` and a single variable with an integer bias. Previously it would raise a `numpy.core._exceptions._UFuncOutputCastingError`.
- Promote dwave-preprocessing to a full dependency of dimod to avoid issues that occur when dimod is a required package but dwave-preprocessing is not.
- `dimod::QuadraticModelBase.remove_interaction` now correctly returns `true` when removing a self-loop.
- Return `bool` rather than `numpy.bool_` from `QuadraticModel.is_equal` and `BinaryQuadraticModel.is_equal` when comparing empty models to numbers.
- Fix `as_samples` and `Initialized.parse_initial_states` by ensuring that the `copy` argument is not ignored in `as_samples` and `Initialized.parse_initial_states` does not modify any input data. See [\861](https://github.com/dwavesystems/dimod/issues/861).
- Remove unused `ConstrainedQuadraticModel.labels` instance variable.
- Fix adding constraints with integer variables via `ConstrainedQuadraticModel.add_constraint_from_iterable` when those integer variables have pre-existing lower or upper bounds. See [\943](https://github.com/dwavesystems/dimod/issues/943).
- Correctly account for the offset when multiplying binary quadratic models
- `BinaryQuadraticModel.energies` now has consistent behaviour accross all data types when given samples containing a superset of the variables in the model. Previously binary quadratic models with `object` data type would allow a superset of variables, while `float64` and `float32` would not.