New Features
- Add `dimod.generators.magic_square()` which allows for the generation of a constrained quadratic model whose feasible solutions are normal magic squares. The function also generates magic squares of squares when passed `power=2` as a keyword argument.
- Implement version 2.0 of constrained quadratic model serialization. See `ConstrainedQuadraticModel.to_file()` for details.
- Improve LP file reading by wrapping [HiGHS](https://github.com/ERGO-Code/HiGHS) LP file parser.
- Add C++ ``ConstrainedQuadraticModel::remove_constraints_if()`` method.
Upgrade Notes
- Remove the `ObjectView.to_file()` method.
- Remove the `ConstraintView.to_file()` method.
- Remove `dimod::lp` C++ namespace.
- Drop support for Python 3.7.
Bug Fixes
- Fix `ConstrainedQuadraticModel.from_discrete_quadratic_model()` incorrectly formulating the discrete constraints. This bug was
introduced in version 0.12.7.
- Fix `dimod.generators.frustrated_loop()` to correctly handle graphs with tuple labels. See [\1342](https://github.com/dwavesystems/dimod/issues/1342).