Skip to content

Commit 8dde2e0

Browse files
authored
fix interpolation perfomance bug (#215)
1 parent 1d92596 commit 8dde2e0

File tree

5 files changed

+29
-6
lines changed

5 files changed

+29
-6
lines changed

source/mir/interpolate/constant.d

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ extern(D):
125125
return _grid[dimension].lightConst.sliced(_data._lengths[dimension]);
126126
}
127127

128+
///
129+
immutable(X)[] gridScopeView(size_t dimension = 0)() scope return const @property @trusted
130+
if (dimension < N)
131+
{
132+
return _grid[dimension]._iterator[0 .. _data._lengths[dimension]];
133+
}
134+
128135
/++
129136
Returns: intervals count.
130137
+/

source/mir/interpolate/linear.d

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,13 @@ struct Linear(F, size_t N = 1, X = F)
225225
return _grid[dimension].lightConst.sliced(_data._lengths[dimension]);
226226
}
227227

228+
///
229+
immutable(X)[] gridScopeView(size_t dimension = 0)() scope return const @property @trusted
230+
if (dimension < N)
231+
{
232+
return _grid[dimension]._iterator[0 .. _data._lengths[dimension]];
233+
}
234+
228235
/++
229236
Returns: intervals count.
230237
+/

source/mir/interpolate/package.d

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ template findInterval(size_t dimension = 0)
6363
static if (dimension)
6464
{
6565
immutable sizediff_t len = interpolant.intervalCount!dimension - 1;
66-
auto grid = interpolant.grid!dimension[1 .. $][0 .. len];
66+
auto grid = interpolant.gridScopeView!dimension[1 .. $][0 .. len];
6767
}
6868
else
6969
{
7070
immutable sizediff_t len = interpolant.intervalCount - 1;
71-
auto grid = interpolant.grid[][1 .. $][0 .. len];
71+
auto grid = interpolant.gridScopeView[1 .. $][0 .. len];
7272
}
7373
assert(len >= 0);
7474
return grid.transitionIndex!"a <= b"(x);
@@ -94,9 +94,9 @@ Lazy interpolation shell with linear complexity.
9494
9595
Params:
9696
range = sorted range
97-
interpolant = interpolant structure with `.grid` method.
97+
interpolant = interpolant structure with `.gridScopeView` method.
9898
Complexity:
99-
`O(range.length + interpolant.grid.length)` to evaluate all elements.
99+
`O(range.length + interpolant.gridScopeView.length)` to evaluate all elements.
100100
Returns:
101101
Lazy input range.
102102
See_also:
@@ -145,7 +145,7 @@ struct Interp1(Range, Interpolant)
145145
assert(!empty);
146146
auto x = _range.front;
147147
return (x) @trusted {
148-
auto points = _interpolant.grid;
148+
auto points = _interpolant.gridScopeView;
149149
sizediff_t len = _interpolant.intervalCount - 1;
150150
assert(len >= 0);
151151
while (x > points[_interval + 1] && _interval < len)
@@ -200,7 +200,7 @@ Optimization utility that can be used with interpolants if
200200
x should be extrapolated at interval given.
201201
202202
By default interpolants uses binary search to find appropriate interval,
203-
it has `O(log(.grid.length))` complexity.
203+
it has `O(log(.gridScopeView.length))` complexity.
204204
If an interval is given, interpolant uses it instead of binary search.
205205
+/
206206
RefTuple!(T, size_t) atInterval(T)(in T value, size_t intervalIndex)

source/mir/interpolate/polynomial.d

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ scope const:
158158
///
159159
ref const(Slice!(RCI!(immutable X))) grid() { return _grid; }
160160
///
161+
immutable(X)[] gridScopeView() scope return const @property @trusted { return _grid.lightScope.field; }
162+
///
161163
ref const(RCArray!(immutable T)) inversedBarycentricWeights() { return _inversedBarycentricWeights; }
162164
///
163165
ref const(RCArray!T)[maxAdditionalFunctions + 1] normalizedValues() { return _normalizedValues; }

source/mir/interpolate/spline.d

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,13 @@ struct Spline(F, size_t N = 1, X = F)
732732
return _grid[dimension].lightConst.sliced(_data._lengths[dimension]);
733733
}
734734

735+
///
736+
immutable(X)[] gridScopeView(size_t dimension = 0)() scope return const @property @trusted
737+
if (dimension < N)
738+
{
739+
return _grid[dimension]._iterator[0 .. _data._lengths[dimension]];
740+
}
741+
735742
/++
736743
Returns: intervals count.
737744
+/

0 commit comments

Comments
 (0)