Commit Graph

2066 Commits

Author SHA1 Message Date
sebcrozet
8bf94f7afb Add matrix/slice conversions.
Fix #687.
2020-03-02 12:45:37 +01:00
Sébastien Crozet
c17b08190a Merge pull request #681 from Aaron1011/fix/more-iter-offset
Fix some out-of-bounds `offset` calls
2020-03-02 12:45:37 +01:00
Avi Weinstock
bd7dd6e345 Add Scalar + Copy bounds in nalgebra-lapack.
```bash
export RELEVANT_SOURCEFILES="$(find nalgebra-lapack -name '*.rs')"
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar,/N\1: Scalar + Copy,/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar>/N\1: Scalar + Copy>/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/\([A-Z]*Scalar\): Scalar {/\1: Scalar + Copy {/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/SVDScalar<R: DimMin<C>, C: Dim>: Scalar/SVDScalar<R: DimMin<C>, C: Dim>: Scalar + Copy/' $f; done
```
2020-03-02 12:45:37 +01:00
Avi Weinstock
774f4da3e2 Add Clone to Scalar, providing a default implementation of inlined_clone. Change Scalar + Clone bounds to just Scalar. 2020-03-02 12:45:37 +01:00
Sébastien Crozet
e0db624031 Merge pull request #662 from Aaron1011/fix/final-offset
Don't call 'offset' on a dangling pointer
2020-03-02 12:45:37 +01:00
Aaron Hill
6bb355f4d0 Fix some out-of-bounds offset calls
After we yield the final element from the iterator, we don't offset
`ptr` agian, to avoid having it go out-of-bounds.

However, `inner_end` may be several elements out-of-bounds, depending on
the value of `size`. Therefore, we use `wrapping_offset` to avoid
undefined behavior.
2020-03-02 12:45:37 +01:00
Avi Weinstock
6c236af696 Add Scalar + Copy bounds to code that's under feature flags.
`./ci/test.sh` now passes locally.

Refactoring done via the following sed commands:
```bash
export RELEVANT_SOURCEFILES="$(find src -name '*.rs') $(find examples -name '*.rs')"
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Arbitrary\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Serialize\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Deserialize\)/N\1: Scalar + Copy + \2/' $f; do
export RELEVANT_SOURCEFILES="$(find nalgebra-glm -name '*.rs')"
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar,/N\1: Scalar + Copy,/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar>/N\1: Scalar + Copy>/' $f; done
for f in algebra-glm/src/traits.rs; do sed -i 's/Scalar + Ring/Scalar + Copy + Ring>/' $f; done # Number trait definition
```
2020-03-02 12:45:37 +01:00
Avi Weinstock
52aac8b975 Add inlined_clone to Scalar, and relax bounds from Scalar + Copy to Scalar + Clone nearly everywhere.
The various nalgebra-lapack FooScalars are still Copy because they make use of uninitialized memory.
nalgebgra-glm Number still uses Copy because upstream `approx` requires it.
2020-03-02 12:45:37 +01:00
Sébastien Crozet
5a0ee23e3b Fix Vector::axpy for noncommutative cases (#648)
Fix Vector::axpy for noncommutative cases
2020-03-02 12:45:37 +01:00
Aaron Hill
e981283500 Switch to wrapping_offset instead of unsafe offset 2020-03-02 12:45:37 +01:00
Avi Weinstock
7d99015473 Move Copy constraint from the definition of Scalar to all its use-sites.
This should semantically be a no-op, but enables refactorings to use non-Copy scalars on a case-by-case basis.
Also, the only instance of a `One + Zero` trait bound was changed into a `Zero + One` bound to match the others.

The following sed scripts were used in the refactoring (with each clause added to reduce the error count of `cargo check`):

```bash
export RELEVANT_SOURCEFILES="$(find src -name '*.rs') $(find examples -name '*.rs')"
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar,/N: Scalar+Copy,/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + Field/N: Scalar + Copy + Field/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + Zero/N: Scalar + Copy + Zero/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + Closed/N: Scalar + Copy + Closed/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + Eq/N: Scalar + Copy + Eq/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + PartialOrd/N: Scalar + Copy + PartialOrd/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: *Scalar + Zero/N: Scalar + Copy + Zero/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + PartialEq/N: Scalar + Copy + PartialEq/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar>/N: Scalar+Copy>/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: Scalar + $bound/N: Scalar + Copy + $bound/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: *Scalar + $bound/N: Scalar + Copy + $bound/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\): *Scalar,/N\1: Scalar+Copy,/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N: *Scalar + $trait/N: Scalar + Copy + $trait/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\): *Scalar + Superset/N\1: Scalar + Copy + Superset/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\): *Scalar + \([a-zA-Z]*Eq\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \([a-zA-Z]*Eq\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(hash::\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar {/N\1: Scalar + Copy {/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Zero\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Bounded\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Lattice\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Meet\|Join\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(fmt::\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Ring\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Hash\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Send\|Sync\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/One + Zero/Zero + One/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \(Zero\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar + \($marker\)/N\1: Scalar + Copy + \2/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/N\([0-9]\?\): *Scalar>/N\1: Scalar + Copy>/' $f; done
for f in $RELEVANT_SOURCEFILES; do sed -i 's/Scalar+Copy/Scalar + Copy/' $f; done
```
2020-03-02 12:45:37 +01:00
Sébastien Crozet
ef3406cc8f Cholupdate (#673)
Cholupdate
2020-03-02 12:45:37 +01:00
Jakub Konka
fe65b1c129 Add Vector::axcpy method
The added method `Vector::axcpy` generalises `Vector::gemv` to
noncommutative cases since it allows us to write for `gemv`
`self.axcpy(alpha, &col2, val, beta)`, instead the usual
`self.axpy(alpha * val, &col2, beta)`. Hence, `axcpy` preserves the
order of scalar multiplication which is important for applications where
commutativity is not guaranteed (e.g., matrices of quaternions, etc.).

This commmit also removes helpers `array_axpy` and `array_ax`, and
replaces them with `array_axcpy` and `array_axc` respectively, which
like above preserve the order of scalar multiplication.

Finally, `Vector::axpy` is preserved, however, now expressed in terms of
`Vector::axcpy` like so:

```
self.axcpy(alpha * val, &col2, beta)
```
2020-03-02 12:45:37 +01:00
Aaron Hill
4e25bd87fb Don't call 'offset' on a dangling pointer
When creating a matrix with only one zero dimension, we end up with a
matrix with a total size of zero, but a non-zero stride for elements.
While such a matrix can never actually have any elements, we need to be
careful with how we use the pointer associated with it.

Since such a pointer will always be dangling, it can never be used with `ptr.offset`,
which requires that the pointer be in-bounds or one passed the end of an
allocation. Violating this results in undefined behavior.

This commit adds in checks before the uses of `ptr.offset`. If we ever
need to offset from a pointer when our actual allocation size is zero,
we skip offsetting, and return the original pointer. This is fine
because any actual use of the original or offsetted pointer would
already be undefined behavior - we shoul never be trying to dereference
the pointer associated with a zero-size matrix.

This issue was caught be running `cargo miri test` on the project.
2020-03-02 12:45:37 +01:00
Jakub Konka
e1c8e1bccf Fix Vector::axpy for noncommutative cases
One example would be performing simple matrix multiplication
over a division algebra such as quaternions.
2020-03-02 12:45:37 +01:00
Sébastien Crozet
8c4bb6f1cb Import IsaacRng from rand_isaac instead of rand. (#678)
Import IsaacRng from rand_isaac instead of rand.
2020-03-02 12:45:36 +01:00
Nestor Demeure
50ad84e4b1 Update cholesky.rs
corrected typo ni doc for `xx_rank_one_update`
2020-03-02 12:45:36 +01:00
Sébastien Crozet
d78309b1fd Merge pull request #669 from daingun/patch-2
Use same algorithm to solve 2x2 eigenvalue problem
2020-03-02 12:45:36 +01:00
Avi Weinstock
8404839233 Import IsaacRng from rand_isaac instead of rand.
The rand crate removed IsaacRng in the 0.5 -> 0.6 transition, so the benchmarks that use it haven't compiled since 9c37c51203.
2020-03-02 12:45:36 +01:00
sebcrozet
cd8fc9285f Add some missing spaces. 2020-03-02 12:45:36 +01:00
daingun
a5b2a4ceb7 Merge pull request #1 from daingun/patch-1
Correct Schur decomposition for 2x2 matrices
2020-03-02 12:45:36 +01:00
sebcrozet
b96159aab3 Fix Cholesky for no-std platforms. 2020-03-02 12:45:36 +01:00
daingun
50417494ec Use same algorithm to solve 2x2 eigenvalue problem
The eigenvalue problem is solved in two different method that use different methods
to calculate the discriminant of the solution to the quadratic equation.
Use the method whose computation is considered more stable.
2020-03-02 12:45:36 +01:00
daingun
667c49d0e1 Correct Schur decomposition for 2x2 matrices
Due to rounding and possible loss of precision the lower left element of the 2x2 matrix
may be different from zero.
2020-03-02 12:45:36 +01:00
Nestor Demeure
59c6a98615 finished cleaning 2020-03-02 12:45:36 +01:00
Nestor Demeure
3d08a80d8d needs faster matrix initialization 2020-03-02 12:45:36 +01:00
Nestor Demeure
f54faedc32 tests pass, needs cleanup 2020-03-02 12:45:36 +01:00
Nestor Demeure
27a2045389 insert does compile 2020-03-02 12:45:36 +01:00
Nestor Demeure
c613360a5c insert does not compile yet 2020-03-02 12:45:36 +01:00
Nestor Demeure
b29231cf7b found uneeded storagemut 2020-03-02 12:45:36 +01:00
Nestor Demeure
cfa7bbdc7c remove column is now working 2020-03-02 12:45:36 +01:00
Nestor Demeure
498c6ef60b added template for remove_column 2020-03-02 12:45:36 +01:00
Nestor Demeure
e583e37d1c finally got the correct type for insert column 2020-03-02 12:45:36 +01:00
Nestor Demeure
2f18aee212 added assertion 2020-03-02 12:45:36 +01:00
Nestor Demeure
3d170e1684 removed useless if 2020-03-02 12:45:36 +01:00
Nestor Demeure
b2a50404b6 code cleaned 2020-03-02 12:45:36 +01:00
Nestor Demeure
516155025a code cleaned 2020-03-02 12:45:36 +01:00
Nestor Demeure
7347d467ae rank update passed tests 2020-03-02 12:45:36 +01:00
Nestor Demeure
96c16af66f updated comment 2020-03-02 12:45:36 +01:00
Nestor Demeure
16154f163a added real constraint on sigma 2020-03-02 12:45:36 +01:00
Nestor Demeure
45e6ac7c2a test is now correct 2020-03-02 12:45:36 +01:00
Nestor Demeure
5942a2a125 got test to compile 2020-03-02 12:45:36 +01:00
Nestor Demeure
cc478c6c6d added test for update 2020-03-02 12:45:36 +01:00
Nestor Demeure
0c9451165d first version of rank one update 2020-03-02 12:45:36 +01:00
Andreas Longva
2f77d73226 Generalize From<_> for MatrixSlice(Mut) to allow different strides 2020-03-02 12:45:35 +01:00
daingun
1103d49b80 Correct Schur decomposition for 2x2 matrices
Due to rounding and possible loss of precision the lower left element of the 2x2 matrix
may be different from zero.
2020-03-02 12:45:35 +01:00
Andreas Longva
a05aa313da Implement From<&Matrix> for MatrixSlice 2020-03-02 12:45:35 +01:00
Nestor Demeure
6f1e924e40 used Storage trait for solve
see issue 667
2020-03-02 12:45:35 +01:00
Nestor Demeure
ffb69d5a6f used Storage trait for solve method
as per issue 667 https://github.com/rustsim/nalgebra/issues/667
2020-03-02 12:45:35 +01:00
Nestor Demeure
456a5a84e7 Used Storage trait for solve method
See issue 667 : https://github.com/rustsim/nalgebra/issues/667
2020-03-02 12:45:35 +01:00