Skip to content

Commit 4a20d7f

Browse files
committed
clean code and add save primitives
1 parent 81bd108 commit 4a20d7f

File tree

2 files changed

+46
-36
lines changed

2 files changed

+46
-36
lines changed

source/mir/interpolation/package.d

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,58 +23,65 @@ import mir.primitives;
2323
Lazy interpolation shell with linear complexity.
2424
2525
Params:
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.
2828
Complexity:
29-
`O(range.length + interpolation._grid.length)` to evaluate all elements.
29+
`O(range.length + interpolation._grid.length)` to evaluate all elements.
3030
Returns:
31-
Lazy input range.
31+
Lazy input range.
3232
See_also:
33-
$(SUBREF linear, linearInterpolation),
34-
$(SUBREF pchip, pchip).
33+
$(SUBREF linear, linearInterpolation),
34+
$(SUBREF pchip, pchip).
3535
+/
3636
auto 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
4242
struct 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
/++
7178
PCHIP interpolation.
7279
7380
Complexity:
74-
`O(x.length + xs.length)`
81+
`O(x.length + xs.length)`
7582
7683
See_also:
77-
$(MREF mir,_interpolation,pchip)
84+
$(MREF mir,_interpolation,pchip)
7885
+/
7986
unittest
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,

source/mir/timeseries.d

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,12 @@ struct Series(TimeIterator, SliceKind kind, size_t[] packs, Iterator)
348348
return time[slices[0]].moment(data[slices]);
349349
}
350350
}
351+
352+
/// ditto
353+
auto save()() @property
354+
{
355+
return this;
356+
}
351357
}
352358

353359
/// 1-dimensional data

0 commit comments

Comments
 (0)