Lots of big changes and new additions this release!
- Expressions can be used as values
- `expr.new()` is no longer necessary (but is still recommended)
- Methods like `expr.apply(op)` also work
- Indexing `expr[indices]` does not yet work, nor do methods that mutate values
- For example, `A.ewise_mult(A.mxm(A.T).new()).new().reduce_scalar().new()` can now be written as `A.ewise_mult(A.mxm(A.T)).reduce_scalar()`
- Add aggregators to `grblas.agg` that can be used in reductions!
- For example, `matrix.reduce_rows(agg.argmin)`
- Current aggregators: `L0norm, L1norm, L2norm, Linfnorm, all, any, any_value, argmax, argmin, bitwise_all, bitwise_any, count, count_nonzero, count_zero, exists, first, first_index, geometric_mean, harmonic_mean, hypot, last, last_index, logaddexp, logaddexp2, max, mean, min, peak_to_peak, prod, root_mean_square, stdp, stds, sum, sum_of_inverses, sum_of_squares, varp, vars`
- Add prefix scan (such as cumsum and cumprod) that works with any monoid
- `vector.scan(monoid)`
- `matrix.scan_rows(monoid)`
- `matrix.scan_columns(monoid)`
- Add `operator.get_semiring(monoid, binaryop)` convenience function
- Add `x.ss.build_scalar(...)` for Vector and Matrix objects
- Add "coo" as import/export option
- Updated/fixed `to_pygraphblas` and `from_pygraphblas`