@@ -23,58 +23,65 @@ import mir.primitives;
2323Lazy interpolation shell with linear complexity.
2424
2525Params:
26- range = sorted range
27- interpolation = interpolation structure with `._grid` and `.opCall(x, interval)` methods.
26+ range = sorted range
27+ interpolation = interpolation structure with `._grid` and `.opCall(x, interval)` methods.
2828Complexity:
29- `O(range.length + interpolation._grid.length)` to evaluate all elements.
29+ `O(range.length + interpolation._grid.length)` to evaluate all elements.
3030Returns:
31- Lazy input range.
31+ Lazy input range.
3232See_also:
33- $(SUBREF linear, linearInterpolation),
34- $(SUBREF pchip, pchip).
33+ $(SUBREF linear, linearInterpolation),
34+ $(SUBREF pchip, pchip).
3535+/
3636auto interp1 (Range , Interpolation)(Range range, Interpolation interpolation, size_t interval = 0 )
3737{
38- return Interp1! (Range , Interpolation)(range, interpolation, interval);
38+ return Interp1! (Range , Interpolation)(range, interpolation, interval);
3939}
4040
4141// / ditto
4242struct Interp1 (Range , Interpolation)
4343{
44- // / Sorted range (descending)
45- Range _range;
46- // / Interpolation structure
47- Interpolation _interpolation;
48- // / Current interpolation interval
49- size_t _interval;
50-
51- static if (hasLength! Range )
52- // / Length (optional)
53- size_t length () @property { return _range.length; }
54- // / Input range primitives
55- bool empty () @property { return _range.empty; }
56- // / ditto
57- void popFront () { _range.popFront; }
58- // / ditto
59- auto front () @property
60-
61- {
62- assert (! empty);
63- auto x = _range.front;
64- while (x > _interpolation._grid[_interval + 1 ] && _interpolation._grid.length > _interval + 2 )
65- _interval++ ;
66- return _interpolation (x, _interval);
67- }
44+ // / Sorted range (descending)
45+ Range _range;
46+ // / Interpolation structure
47+ Interpolation _interpolation;
48+ // / Current interpolation interval
49+ size_t _interval;
50+
51+ static if (hasLength! Range )
52+ // / Length (optional)
53+ size_t length ()() @property { return _range.length; }
54+ // / Save primitive (optional)
55+ auto save ()() @property
56+ {
57+ auto ret = this ;
58+ ret._range = _range.save;
59+ return ret;
60+ }
61+ // / Input range primitives
62+ bool empty ()() @property { return _range.empty; }
63+ // / ditto
64+ void popFront ()() { _range.popFront; }
65+ // / ditto
66+ auto front ()() @property
67+
68+ {
69+ assert (! empty);
70+ auto x = _range.front;
71+ while (x > _interpolation._grid[_interval + 1 ] && _interpolation._grid.length > _interval + 2 )
72+ _interval++ ;
73+ return _interpolation (x, _interval);
74+ }
6875}
6976
7077/+ +
7178PCHIP interpolation.
7279
7380Complexity:
74- `O(x.length + xs.length)`
81+ `O(x.length + xs.length)`
7582
7683See_also:
77- $(MREF mir,_interpolation,pchip)
84+ $(MREF mir,_interpolation,pchip)
7885+/
7986unittest
8087{
@@ -91,9 +98,6 @@ unittest
9198
9299 auto ys = xs.interp1(interpolation);
93100
94- import std.stdio ;
95- writeln(ys);
96-
97101 assert (ys.approxEqual([
98102 5.333333333333334 ,
99103 2.500000000000000 ,
0 commit comments