@@ -37,16 +37,17 @@ Constraints:
3737
3838Returns: $(LREF Linear)
3939+/
40- template linear (T, size_t N = 1 , FirstGridIterator = T * , NextGridIterators = Repeat! (N - 1 , FirstGridIterator))
40+ template linear (T, size_t N = 1 , FirstGridIterator = immutable (T) * , NextGridIterators = Repeat! (N - 1 , FirstGridIterator))
4141 // if (isFloatingPoint!T && is(T == Unqual!T) && N <= 6)
4242{
4343 private alias GridIterators = AliasSeq! (FirstGridIterator, NextGridIterators);
4444 private alias GridVectors = Linear! (T, N, GridIterators).GridVectors;
4545
4646 /+ +
4747 Params:
48- grid = N `x` values for interpolation
49- values = `f(x)` values for interpolation
48+ grid = immutable `x` values for interpolant
49+ values = `f(x)` values for interpolant
50+ forceCopyValues = always copy `values` if set
5051 Constraints:
5152 `grid` and `values` must have the same length >= 2
5253 Returns: $(LREF Spline)
@@ -74,13 +75,13 @@ template linear(T, size_t N = 1, FirstGridIterator = T*, NextGridIterators = Rep
7475
7576// / R -> R: Linear interpolation
7677version (mir_test)
77- @safe unittest
78+ @safe pure unittest
7879{
7980 import mir.ndslice;
8081 import std.math : approxEqual;
8182
82- auto x = [0 , 1 , 2 , 3 , 5.00274 , 7.00274 , 10.0055 , 20.0137 , 30.0192 ];
83- auto y = [0.0011 , 0.0011 , 0.0030 , 0.0064 , 0.0144 , 0.0207 , 0.0261 , 0.0329 , 0.0356 ,];
83+ immutable x = [0 , 1 , 2 , 3 , 5.00274 , 7.00274 , 10.0055 , 20.0137 , 30.0192 ];
84+ immutable y = [0.0011 , 0.0011 , 0.0030 , 0.0064 , 0.0144 , 0.0207 , 0.0261 , 0.0329 , 0.0356 ,];
8485 auto xs = [1 , 2 , 3 , 4.00274 , 5.00274 , 6.00274 , 7.00274 , 8.00548 , 9.00548 , 10.0055 , 11.0055 , 12.0082 , 13.0082 , 14.0082 , 15.0082 , 16.011 , 17.011 , 18.011 , 19.011 , 20.0137 , 21.0137 , 22.0137 , 23.0137 , 24.0164 , 25.0164 , 26.0164 , 27.0164 , 28.0192 , 29.0192 , 30.0192 ];
8586
8687 auto interpolation = linear! double (x.sliced, y.sliced);
@@ -91,7 +92,7 @@ version(mir_test)
9192}
9293
9394// / R^2 -> R: Bilinear interpolaiton
94- unittest
95+ @safe pure unittest
9596{
9697 import std.math : approxEqual;
9798 import mir.ndslice;
@@ -106,11 +107,11 @@ unittest
106107 alias f = (x0, x1) => y_x0 * x0 + y_x1 * x1 + y_x0x1 * x0 * x1 - 11 ;
107108
108109 // /// set interpolant ////
109- auto x0 = [- 1.0 , 2 , 8 , 15 ].sliced;
110- auto x1 = [- 4.0 , 2 , 5 , 10 , 13 ].sliced;
110+ auto x0 = [- 1.0 , 2 , 8 , 15 ].idup. sliced;
111+ auto x1 = [- 4.0 , 2 , 5 , 10 , 13 ].idup. sliced;
111112 auto grid = cartesian(x0, x1);
112113
113- auto interpolant = linear! (double , 2 )(x0, x1, grid.map! f.slice );
114+ auto interpolant = linear! (double , 2 )(x0, x1, grid.map! f);
114115
115116 // /// compute test data ////
116117 auto test_grid = cartesian(x0 + 1.23 , x1 + 3.23 );
@@ -132,7 +133,7 @@ unittest
132133}
133134
134135// / R^3 -> R: Trilinear interpolaiton
135- unittest
136+ @safe pure unittest
136137{
137138 import std.math : approxEqual;
138139 import mir.ndslice;
@@ -150,12 +151,12 @@ unittest
150151 + y_x0x1 * x0 * x1 + y_x0x1x2 * x0 * x1 * x2 - 11 ;
151152
152153 // /// set interpolant ////
153- auto x0 = [- 1.0 , 2 , 8 , 15 ].sliced;
154- auto x1 = [- 4.0 , 2 , 5 , 10 , 13 ].sliced;
155- auto x2 = [3 , 3.7 , 5 ].sliced;
154+ auto x0 = [- 1.0 , 2 , 8 , 15 ].idup. sliced;
155+ auto x1 = [- 4.0 , 2 , 5 , 10 , 13 ].idup. sliced;
156+ auto x2 = [3 , 3.7 , 5 ].idup. sliced;
156157 auto grid = cartesian(x0, x1, x2);
157158
158- auto interpolant = linear! (double , 3 )(x0, x1, x2, grid.map! f.slice );
159+ auto interpolant = linear! (double , 3 )(x0, x1, x2, grid.map! f);
159160
160161 // /// compute test data ////
161162 auto test_grid = cartesian(x0 + 1.23 , x1 + 3.23 , x2 - 3 );
@@ -181,18 +182,16 @@ unittest
181182/+ +
182183Multivariate linear interpolant with nodes on rectilinear grid.
183184+/
184- struct Linear (F, size_t N = 1 , FirstGridIterator = F * , NextGridIterators... )
185+ struct Linear (F, size_t N = 1 , FirstGridIterator = immutable (F) *, NextGridIterators...)
185186 if (N && N <= 6 && NextGridIterators.length == N - 1 )
186187{
187- import mir.ndslice.internal: ConstIfPointer;
188-
189188 package alias GridIterators = AliasSeq! (FirstGridIterator, NextGridIterators);
190- package alias GridVectors = staticMap! (GridVector, staticMap ! (ConstIfPointer, GridIterators) );
189+ package alias GridVectors = staticMap! (GridVector, GridIterators);
191190
192191 // / Aligned buffer allocated with `mir.internal.memory`. $(RED For internal use.)
193192 Slice! (Contiguous, [N], F* ) _data;
194193 // / Grid iterators. $(RED For internal use.)
195- staticMap ! (ConstIfPointer, GridIterators) _grid;
194+ GridIterators _grid;
196195 // /
197196 bool _ownsData;
198197
0 commit comments