Skip to content

Commit 9a0f0a5

Browse files
docs and zipped
1 parent ff832b2 commit 9a0f0a5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+953
-700
lines changed

faer-entity/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ pub type Slice<'a, E> = GroupFor<E, &'a [<E as Entity>::Unit]>;
175175
pub type SliceMut<'a, E> = GroupFor<E, &'a mut [<E as Entity>::Unit]>;
176176
pub type UninitSliceMut<'a, E> = GroupFor<E, &'a mut [core::mem::MaybeUninit<<E as Entity>::Unit>]>;
177177

178+
extern crate alloc;
179+
pub type Vector<E> = GroupFor<E, alloc::vec::Vec<<E as Entity>::Unit>>;
180+
178181
pub type GroupFor<E, T> = <<E as Entity>::Group as ForType>::FaerOf<T>;
179182
pub type GroupCopyFor<E, T> = <<E as Entity>::Group as ForCopyType>::FaerOfCopy<T>;
180183
pub type GroupDebugFor<E, T> = <<E as Entity>::Group as ForDebugType>::FaerOfDebug<T>;

src/col/colmut.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ impl<'a, E: Entity, R: Shape> ColMut<'a, E, R> {
542542
this: ColMut<'_, E, R>,
543543
other: ColRef<'_, ViewE, R>,
544544
) {
545-
zipped!(this.as_2d_mut(), other.as_2d())
545+
zipped!(__rw, this, other)
546546
.for_each(|unzipped!(mut dst, src)| dst.write(src.read().canonicalize()));
547547
}
548548
implementation(self.rb_mut(), other.as_col_ref())
@@ -554,7 +554,7 @@ impl<'a, E: Entity, R: Shape> ColMut<'a, E, R> {
554554
where
555555
E: ComplexField,
556556
{
557-
zipped!(self.rb_mut().as_2d_mut()).for_each(
557+
zipped!(__rw, self.rb_mut()).for_each(
558558
#[inline(always)]
559559
|unzipped!(mut x)| x.write(E::faer_zero()),
560560
);
@@ -563,7 +563,7 @@ impl<'a, E: Entity, R: Shape> ColMut<'a, E, R> {
563563
/// Fills the elements of `self` with copies of `constant`.
564564
#[track_caller]
565565
pub fn fill(&mut self, constant: E) {
566-
zipped!((*self).rb_mut().as_2d_mut()).for_each(
566+
zipped!(__rw, (*self).rb_mut()).for_each(
567567
#[inline(always)]
568568
|unzipped!(mut x)| x.write(constant),
569569
);

src/col/colown.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,7 @@ impl<E: Entity, R: Shape> Clone for Col<E, R> {
11631163
}
11641164
fn clone_from(&mut self, other: &Self) {
11651165
if self.nrows() == other.nrows() {
1166-
crate::zipped!(self, other)
1166+
crate::zipped!(__rw, self, other)
11671167
.for_each(|crate::unzipped!(mut dst, src)| dst.write(src.read()));
11681168
} else {
11691169
if !R::IS_BOUND {

src/lib.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,7 @@ impl Conj {
374374
/// let mut sum = Mat::<f64>::zeros(nrows, ncols);
375375
///
376376
/// zipped!(sum.as_mut(), a.as_ref(), b.as_ref()).for_each(|unzipped!(mut sum, a, b)| {
377-
/// let a = a.read();
378-
/// let b = b.read();
379-
/// sum.write(a + b);
377+
/// *sum = a + b;
380378
/// });
381379
///
382380
/// for i in 0..nrows {
@@ -387,12 +385,20 @@ impl Conj {
387385
/// ```
388386
#[macro_export]
389387
macro_rules! zipped {
390-
($head: expr $(,)?) => {
388+
(__rw, $head: expr $(,)?) => {
391389
$crate::linalg::zip::LastEq($crate::linalg::zip::ViewMut::view_mut(&mut { $head }))
392390
};
393391

392+
(__rw, $head: expr, $($tail: expr),* $(,)?) => {
393+
$crate::linalg::zip::ZipEq::new($crate::linalg::zip::ViewMut::view_mut(&mut { $head }), $crate::zipped!(__rw, $($tail,)*))
394+
};
395+
396+
($head: expr $(,)?) => {
397+
$crate::linalg::zip::LastEq($crate::linalg::zip::RefWrapper($crate::linalg::zip::ViewMut::view_mut(&mut { $head })))
398+
};
399+
394400
($head: expr, $($tail: expr),* $(,)?) => {
395-
$crate::linalg::zip::ZipEq::new($crate::linalg::zip::ViewMut::view_mut(&mut { $head }), $crate::zipped!($($tail,)*))
401+
$crate::linalg::zip::ZipEq::new($crate::linalg::zip::RefWrapper($crate::linalg::zip::ViewMut::view_mut(&mut { $head })), $crate::zipped!($($tail,)*))
396402
};
397403
}
398404

@@ -410,9 +416,7 @@ macro_rules! zipped {
410416
/// let mut sum = Mat::<f64>::zeros(nrows, ncols);
411417
///
412418
/// zipped!(sum.as_mut(), a.as_ref(), b.as_ref()).for_each(|unzipped!(mut sum, a, b)| {
413-
/// let a = a.read();
414-
/// let b = b.read();
415-
/// sum.write(a + b);
419+
/// *sum = a + b;
416420
/// });
417421
///
418422
/// for i in 0..nrows {

src/linalg/cholesky/bunch_kaufman/mod.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ pub mod compute {
236236
kp = k;
237237
} else {
238238
zipped!(
239+
__rw,
239240
w.rb_mut().subrows_mut(k, imax - k).col_mut(k + 1),
240241
a.rb().row(imax).subcols(k, imax - k).transpose(),
241242
)
@@ -325,8 +326,9 @@ pub mod compute {
325326
let d11 = d11.faer_inv();
326327

327328
let x = a.rb_mut().subrows_mut(k + 1, n - k - 1).col_mut(k);
328-
zipped!(x).for_each(|unzipped!(mut x)| x.write(x.read().faer_scale_real(d11)));
329-
zipped!(w.rb_mut().subrows_mut(k + 1, n - k - 1).col_mut(k))
329+
zipped!(__rw, x)
330+
.for_each(|unzipped!(mut x)| x.write(x.read().faer_scale_real(d11)));
331+
zipped!(__rw, w.rb_mut().subrows_mut(k + 1, n - k - 1).col_mut(k))
330332
.for_each(|unzipped!(mut x)| x.write(x.read().faer_conj()));
331333
} else {
332334
let dd = w.read(k + 1, k).faer_abs();
@@ -404,10 +406,13 @@ pub mod compute {
404406
a.write(j, k + 1, wkp1);
405407
}
406408

407-
zipped!(w.rb_mut().subrows_mut(k + 1, n - k - 1).col_mut(k))
408-
.for_each(|unzipped!(mut x)| x.write(x.read().faer_conj()));
409-
zipped!(w.rb_mut().subrows_mut(k + 2, n - k - 2).col_mut(k + 1))
409+
zipped!(__rw, w.rb_mut().subrows_mut(k + 1, n - k - 1).col_mut(k))
410410
.for_each(|unzipped!(mut x)| x.write(x.read().faer_conj()));
411+
zipped!(
412+
__rw,
413+
w.rb_mut().subrows_mut(k + 2, n - k - 2).col_mut(k + 1)
414+
)
415+
.for_each(|unzipped!(mut x)| x.write(x.read().faer_conj()));
411416
}
412417
}
413418

@@ -434,7 +439,7 @@ pub mod compute {
434439
parallelism,
435440
);
436441

437-
zipped!(a_right.diagonal_mut().column_vector_mut())
442+
zipped!(__rw, a_right.diagonal_mut().column_vector_mut())
438443
.for_each(|unzipped!(mut x)| x.write(E::faer_from_real(x.read().faer_real())));
439444

440445
let mut j = k - 1;
@@ -591,7 +596,8 @@ pub mod compute {
591596
}
592597
make_real(trailing.rb_mut(), j, j);
593598
}
594-
zipped!(x).for_each(|unzipped!(mut x)| x.write(x.read().faer_scale_real(d11)));
599+
zipped!(__rw, x)
600+
.for_each(|unzipped!(mut x)| x.write(x.read().faer_scale_real(d11)));
595601
} else {
596602
let d21 = a.read(k + 1, k).faer_abs();
597603
let d21_inv = d21.faer_inv();
@@ -1036,7 +1042,7 @@ mod tests {
10361042

10371043
let err = &a * &x - &rhs;
10381044
let mut max = 0.0;
1039-
zipped!(err.as_ref()).for_each(|unzipped!(err)| {
1045+
zipped!(__rw, err.as_ref()).for_each(|unzipped!(err)| {
10401046
let err = err.read().abs();
10411047
if err > max {
10421048
max = err
@@ -1093,7 +1099,7 @@ mod tests {
10931099

10941100
let err = a.conjugate() * &x - &rhs;
10951101
let mut max = 0.0;
1096-
zipped!(err.as_ref()).for_each(|unzipped!(err)| {
1102+
zipped!(__rw, err.as_ref()).for_each(|unzipped!(err)| {
10971103
let err = err.read().abs();
10981104
if err > max {
10991105
max = err

src/linalg/cholesky/ldlt_diagonal/compute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ fn cholesky_in_place_impl<E: ComplexField>(
14261426
let a10_col = a10.rb_mut().col_mut(j);
14271427
let d0_elem = d0.read(j).faer_real().faer_inv();
14281428

1429-
zipped!(l10xd0_col, a10_col).for_each(
1429+
zipped!(__rw, l10xd0_col, a10_col).for_each(
14301430
|unzipped!(mut l10xd0_elem, mut a10_elem)| {
14311431
let a10_elem_read = a10_elem.read();
14321432
a10_elem.write(a10_elem_read.faer_scale_real(d0_elem));

src/linalg/cholesky/ldlt_diagonal/solve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ pub fn solve_transpose_with_conj<E: ComplexField>(
184184
stack: &mut PodStack,
185185
) {
186186
let mut dst = dst;
187-
zipped!(dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
187+
zipped!(__rw, dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
188188
solve_transpose_in_place_with_conj(cholesky_factors, conj_lhs, dst, parallelism, stack)
189189
}
190190

@@ -216,6 +216,6 @@ pub fn solve_with_conj<E: ComplexField>(
216216
stack: &mut PodStack,
217217
) {
218218
let mut dst = dst;
219-
zipped!(dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
219+
zipped!(__rw, dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
220220
solve_in_place_with_conj(cholesky_factors, conj_lhs, dst, parallelism, stack)
221221
}

src/linalg/cholesky/ldlt_diagonal/update.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ fn rank_update_step_impl4<E: ComplexField>(
422422
let [p0, p1, p2, p3] = p_array;
423423
let [beta0, beta1, beta2, beta3] = beta_array;
424424

425-
zipped!(l_col, w0, w1, w2, w3).for_each(
425+
zipped!(__rw, l_col, w0, w1, w2, w3).for_each(
426426
|unzipped!(mut l, mut w0, mut w1, mut w2, mut w3)| {
427427
let mut local_l = l.read();
428428
let mut local_w0 = w0.read();
@@ -482,7 +482,7 @@ fn rank_update_step_impl3<E: ComplexField>(
482482
let [p0, p1, p2] = p_array;
483483
let [beta0, beta1, beta2] = beta_array;
484484

485-
zipped!(l_col, w0, w1, w2).for_each(|unzipped!(mut l, mut w0, mut w1, mut w2)| {
485+
zipped!(__rw, l_col, w0, w1, w2).for_each(|unzipped!(mut l, mut w0, mut w1, mut w2)| {
486486
let mut local_l = l.read();
487487
let mut local_w0 = w0.read();
488488
let mut local_w1 = w1.read();
@@ -532,7 +532,7 @@ fn rank_update_step_impl2<E: ComplexField>(
532532
let [p0, p1] = p_array;
533533
let [beta0, beta1] = beta_array;
534534

535-
zipped!(l_col, w0, w1).for_each(|unzipped!(mut l, mut w0, mut w1)| {
535+
zipped!(__rw, l_col, w0, w1).for_each(|unzipped!(mut l, mut w0, mut w1)| {
536536
let mut local_l = l.read();
537537
let mut local_w0 = w0.read();
538538
let mut local_w1 = w1.read();
@@ -574,7 +574,7 @@ fn rank_update_step_impl1<E: ComplexField>(
574574
let [p0] = p_array;
575575
let [beta0] = beta_array;
576576

577-
zipped!(l_col, w0).for_each(|unzipped!(mut l, mut w0)| {
577+
zipped!(__rw, l_col, w0).for_each(|unzipped!(mut l, mut w0)| {
578578
let mut local_l = l.read();
579579
let mut local_w0 = w0.read();
580580

src/linalg/cholesky/llt/reconstruct.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub fn reconstruct_lower_in_place<E: ComplexField>(
7878
let (mut tmp, stack) = temp_mat_uninit::<E>(n, n, stack);
7979
let mut tmp = tmp.as_mut();
8080
reconstruct_lower(tmp.rb_mut(), cholesky_factor.rb(), parallelism, stack);
81-
zipped!(cholesky_factor, tmp.rb())
81+
zipped!(__rw, cholesky_factor, tmp.rb())
8282
.for_each_triangular_lower(Diag::Include, |unzipped!(mut dst, src)| {
8383
dst.write(src.read())
8484
});

src/linalg/cholesky/llt/solve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub fn solve_with_conj<E: ComplexField>(
135135
stack: &mut PodStack,
136136
) {
137137
let mut dst = dst;
138-
zipped!(dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
138+
zipped!(__rw, dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
139139
solve_in_place_with_conj(cholesky_factor, conj_lhs, dst, parallelism, stack)
140140
}
141141

@@ -202,6 +202,6 @@ pub fn solve_transpose_with_conj<E: ComplexField>(
202202
stack: &mut PodStack,
203203
) {
204204
let mut dst = dst;
205-
zipped!(dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
205+
zipped!(__rw, dst.rb_mut(), rhs).for_each(|unzipped!(mut dst, src)| dst.write(src.read()));
206206
solve_transpose_in_place_with_conj(cholesky_factor, conj_lhs, dst, parallelism, stack)
207207
}

0 commit comments

Comments
 (0)