- Add infix sugar for `ewise_plus`, `ewise_mult`, `mxm`, `apply`, etc! For example:
- `C << op(A | B) ewise_plus`
- `C << op(A & B) ewise_mult`
- `C << op(A B) mxm, vxm, mxv`
- `C << op(A) apply unary`
- `C << op(A, 1) apply binary, right=1`
- `C << op(1, A) apply binary, left=1`
- Operators:
- Add `grblas.op` namespace that has all unary, binary, and semiring objects.
- Automatically convert binaryop to monoid or vice versa where appropriate if possible.
- Hence, one can use a binaryop from `grblas.op` namespace as a monoid.
- Add attributes such as `binop.monoid`, `monoid.identity`, and `semiring.binaryop` to operators.
- Don't allow a semiring where a monoid or binaryop is expected (do e.g. `semiring.monoid` instead).
- Renamed `grblas.ops` to `grblas.operator`, which defines the base classes of operators.
- Add `my_matrix.ss.head(n)` and `my_vector.ss.head(n)` that returns the indices and values of n elements.
- Improve repr of very sparse Vector and Matrix objects by using the new `C.ss.head()` methods.
- Add `grblas.replace` singleton, so one can do e.g. `C(mask, replace) << A.mxm(V)`.
- Add ability to read and write Matrix Market files with `grblas.io.mmread` and `grblas.io.mmwrite`.
- Allow Scalar, Vector, and Matrix objects to be serialized with pickle.
- Added `__slots__` to all the things.