Skip to content

Commit 86eae17

Browse files
committed
relax APIs for computations with ndarray input
1 parent 4e8b93d commit 86eae17

File tree

2 files changed

+138
-36
lines changed

2 files changed

+138
-36
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "floccus"
3-
version = "0.4.0-alpha.4"
3+
version = "0.4.0-alpha.5"
44
authors = ["Jakub Lewandowski <[email protected]>"]
55
edition = "2021"
66
description = "Formulae for air thermodynamic calculations"

src/formulas/traits.rs

Lines changed: 137 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
use crate::{errors::InputError, quantities::ThermodynamicQuantity};
44
#[cfg(feature = "array")]
5-
use ndarray::{Array, Dimension, FoldWhile, Zip};
5+
use ndarray::{Array, ArrayView, Dimension, FoldWhile, Zip};
66
#[cfg(feature = "parallel")]
77
use rayon::iter::{IndexedParallelIterator, IntoParallelIterator, ParallelIterator};
88

@@ -62,7 +62,14 @@ pub trait Formula1<O: ThermodynamicQuantity, I1: ThermodynamicQuantity> {
6262
#[cfg(feature = "array")]
6363
#[allow(missing_docs)]
6464
#[allow(clippy::missing_errors_doc)]
65-
fn compute_ndarray<D: Dimension>(i1: &Array<I1, D>) -> Result<Array<O, D>, InputError> {
65+
fn compute_ndarray<'a, D: Dimension + Copy, A: Into<ArrayView<'a, I1, D>>>(
66+
i1: A,
67+
) -> Result<Array<O, D>, InputError>
68+
where
69+
I1: 'a,
70+
{
71+
let i1: ArrayView<I1, D> = i1.into();
72+
6673
Zip::from(i1)
6774
.fold_while(Ok(()), |_, &i1| match Self::validate_inputs(i1) {
6875
Ok(_) => FoldWhile::Continue(Ok(())),
@@ -83,9 +90,14 @@ pub trait Formula1<O: ThermodynamicQuantity, I1: ThermodynamicQuantity> {
8390
#[cfg(feature = "parallel")]
8491
#[allow(missing_docs)]
8592
#[allow(clippy::missing_errors_doc)]
86-
fn compute_ndarray_parallel<D: Dimension>(
87-
i1: &Array<I1, D>,
88-
) -> Result<Array<O, D>, InputError> {
93+
fn compute_ndarray_parallel<'a, D: Dimension + Copy, A: Into<ArrayView<'a, I1, D>>>(
94+
i1: A,
95+
) -> Result<Array<O, D>, InputError>
96+
where
97+
I1: 'a,
98+
{
99+
let i1: ArrayView<I1, D> = i1.into();
100+
89101
Zip::from(i1)
90102
.fold_while(Ok(()), |_, &a| match Self::validate_inputs(a) {
91103
Ok(_) => FoldWhile::Continue(Ok(())),
@@ -157,10 +169,22 @@ pub trait Formula2<O: ThermodynamicQuantity, I1: ThermodynamicQuantity, I2: Ther
157169
#[cfg(feature = "array")]
158170
#[allow(missing_docs)]
159171
#[allow(clippy::missing_errors_doc)]
160-
fn compute_ndarray<D: Dimension>(
161-
i1: &Array<I1, D>,
162-
i2: &Array<I2, D>,
163-
) -> Result<Array<O, D>, InputError> {
172+
fn compute_ndarray<
173+
'a,
174+
D: Dimension + Copy,
175+
A1: Into<ArrayView<'a, I1, D>>,
176+
A2: Into<ArrayView<'a, I2, D>>,
177+
>(
178+
i1: A1,
179+
i2: A2,
180+
) -> Result<Array<O, D>, InputError>
181+
where
182+
I1: 'a,
183+
I2: 'a,
184+
{
185+
let i1: ArrayView<I1, D> = i1.into();
186+
let i2: ArrayView<I2, D> = i2.into();
187+
164188
Zip::from(i1)
165189
.and(i2)
166190
.fold_while(Ok(()), |_, &i1, &i2| match Self::validate_inputs(i1, i2) {
@@ -187,10 +211,22 @@ pub trait Formula2<O: ThermodynamicQuantity, I1: ThermodynamicQuantity, I2: Ther
187211
#[cfg(feature = "parallel")]
188212
#[allow(missing_docs)]
189213
#[allow(clippy::missing_errors_doc)]
190-
fn compute_ndarray_parallel<D: Dimension>(
191-
i1: &Array<I1, D>,
192-
i2: &Array<I2, D>,
193-
) -> Result<Array<O, D>, InputError> {
214+
fn compute_ndarray_parallel<
215+
'a,
216+
D: Dimension + Copy,
217+
A1: Into<ArrayView<'a, I1, D>>,
218+
A2: Into<ArrayView<'a, I2, D>>,
219+
>(
220+
i1: A1,
221+
i2: A2,
222+
) -> Result<Array<O, D>, InputError>
223+
where
224+
I1: 'a,
225+
I2: 'a,
226+
{
227+
let i1: ArrayView<I1, D> = i1.into();
228+
let i2: ArrayView<I2, D> = i2.into();
229+
194230
Zip::from(i1)
195231
.and(i2)
196232
.fold_while(Ok(()), |_, &i1, &i2| match Self::validate_inputs(i1, i2) {
@@ -273,11 +309,26 @@ pub trait Formula3<
273309
#[cfg(feature = "array")]
274310
#[allow(missing_docs)]
275311
#[allow(clippy::missing_errors_doc)]
276-
fn compute_ndarray<D: Dimension>(
277-
i1: &Array<I1, D>,
278-
i2: &Array<I2, D>,
279-
i3: &Array<I3, D>,
280-
) -> Result<Array<O, D>, InputError> {
312+
fn compute_ndarray<
313+
'a,
314+
D: Dimension + Copy,
315+
A1: Into<ArrayView<'a, I1, D>>,
316+
A2: Into<ArrayView<'a, I2, D>>,
317+
A3: Into<ArrayView<'a, I3, D>>,
318+
>(
319+
i1: A1,
320+
i2: A2,
321+
i3: A3,
322+
) -> Result<Array<O, D>, InputError>
323+
where
324+
I1: 'a,
325+
I2: 'a,
326+
I3: 'a,
327+
{
328+
let i1: ArrayView<I1, D> = i1.into();
329+
let i2: ArrayView<I2, D> = i2.into();
330+
let i3: ArrayView<I3, D> = i3.into();
331+
281332
Zip::from(i1)
282333
.and(i2)
283334
.and(i3)
@@ -309,11 +360,26 @@ pub trait Formula3<
309360
#[cfg(feature = "parallel")]
310361
#[allow(missing_docs)]
311362
#[allow(clippy::missing_errors_doc)]
312-
fn compute_ndarray_parallel<D: Dimension>(
313-
i1: &Array<I1, D>,
314-
i2: &Array<I2, D>,
315-
i3: &Array<I3, D>,
316-
) -> Result<Array<O, D>, InputError> {
363+
fn compute_ndarray_parallel<
364+
'a,
365+
D: Dimension + Copy,
366+
A1: Into<ArrayView<'a, I1, D>>,
367+
A2: Into<ArrayView<'a, I2, D>>,
368+
A3: Into<ArrayView<'a, I3, D>>,
369+
>(
370+
i1: A1,
371+
i2: A2,
372+
i3: A3,
373+
) -> Result<Array<O, D>, InputError>
374+
where
375+
I1: 'a,
376+
I2: 'a,
377+
I3: 'a,
378+
{
379+
let i1: ArrayView<I1, D> = i1.into();
380+
let i2: ArrayView<I2, D> = i2.into();
381+
let i3: ArrayView<I3, D> = i3.into();
382+
317383
Zip::from(i1)
318384
.and(i2)
319385
.and(i3)
@@ -403,12 +469,30 @@ pub trait Formula4<
403469
#[cfg(feature = "array")]
404470
#[allow(missing_docs)]
405471
#[allow(clippy::missing_errors_doc)]
406-
fn compute_ndarray<D: Dimension>(
407-
i1: &Array<I1, D>,
408-
i2: &Array<I2, D>,
409-
i3: &Array<I3, D>,
410-
i4: &Array<I4, D>,
411-
) -> Result<Array<O, D>, InputError> {
472+
fn compute_ndarray<
473+
'a,
474+
D: Dimension + Copy,
475+
A1: Into<ArrayView<'a, I1, D>>,
476+
A2: Into<ArrayView<'a, I2, D>>,
477+
A3: Into<ArrayView<'a, I3, D>>,
478+
A4: Into<ArrayView<'a, I4, D>>,
479+
>(
480+
i1: A1,
481+
i2: A2,
482+
i3: A3,
483+
i4: A4,
484+
) -> Result<Array<O, D>, InputError>
485+
where
486+
I1: 'a,
487+
I2: 'a,
488+
I3: 'a,
489+
I4: 'a,
490+
{
491+
let i1: ArrayView<I1, D> = i1.into();
492+
let i2: ArrayView<I2, D> = i2.into();
493+
let i3: ArrayView<I3, D> = i3.into();
494+
let i4: ArrayView<I4, D> = i4.into();
495+
412496
Zip::from(i1)
413497
.and(i2)
414498
.and(i3)
@@ -449,12 +533,30 @@ pub trait Formula4<
449533
#[cfg(feature = "parallel")]
450534
#[allow(missing_docs)]
451535
#[allow(clippy::missing_errors_doc)]
452-
fn compute_ndarray_parallel<D: Dimension>(
453-
i1: &Array<I1, D>,
454-
i2: &Array<I2, D>,
455-
i3: &Array<I3, D>,
456-
i4: &Array<I4, D>,
457-
) -> Result<Array<O, D>, InputError> {
536+
fn compute_ndarray_parallel<
537+
'a,
538+
D: Dimension + Copy,
539+
A1: Into<ArrayView<'a, I1, D>>,
540+
A2: Into<ArrayView<'a, I2, D>>,
541+
A3: Into<ArrayView<'a, I3, D>>,
542+
A4: Into<ArrayView<'a, I4, D>>,
543+
>(
544+
i1: A1,
545+
i2: A2,
546+
i3: A3,
547+
i4: A4,
548+
) -> Result<Array<O, D>, InputError>
549+
where
550+
I1: 'a,
551+
I2: 'a,
552+
I3: 'a,
553+
I4: 'a,
554+
{
555+
let i1: ArrayView<I1, D> = i1.into();
556+
let i2: ArrayView<I2, D> = i2.into();
557+
let i3: ArrayView<I3, D> = i3.into();
558+
let i4: ArrayView<I4, D> = i4.into();
559+
458560
Zip::from(i1)
459561
.and(i2)
460562
.and(i3)

0 commit comments

Comments
 (0)