@gpa-gemstone/react-graph 1.0.51 → 1.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/AggregatingCircles.d.ts +16 -17
  2. package/lib/AggregatingCircles.js +180 -173
  3. package/lib/Button.d.ts +7 -7
  4. package/lib/Button.js +33 -33
  5. package/lib/Circle.d.ts +19 -20
  6. package/lib/Circle.js +125 -118
  7. package/lib/GraphContext.d.ts +89 -89
  8. package/lib/GraphContext.js +140 -140
  9. package/lib/HeatLegend.d.ts +10 -11
  10. package/lib/HeatLegend.js +109 -106
  11. package/lib/HeatMapChart.d.ts +14 -15
  12. package/lib/HeatMapChart.js +119 -119
  13. package/lib/HorizontalMarker.d.ts +13 -14
  14. package/lib/HorizontalMarker.js +110 -110
  15. package/lib/Infobox.d.ts +17 -17
  16. package/lib/Infobox.js +180 -180
  17. package/lib/InteractiveButtons.d.ts +21 -21
  18. package/lib/InteractiveButtons.js +218 -218
  19. package/lib/Legend.d.ts +14 -14
  20. package/lib/Legend.js +117 -117
  21. package/lib/LegendContext.d.ts +14 -14
  22. package/lib/LegendContext.js +34 -34
  23. package/lib/Line.d.ts +14 -15
  24. package/lib/Line.js +144 -144
  25. package/lib/LineLegend.d.ts +11 -12
  26. package/lib/LineLegend.js +97 -97
  27. package/lib/LineWithThreshold.d.ts +12 -13
  28. package/lib/LineWithThreshold.js +144 -144
  29. package/lib/LogAxis.d.ts +20 -20
  30. package/lib/LogAxis.js +165 -165
  31. package/lib/Plot.d.ts +38 -37
  32. package/lib/Plot.js +802 -802
  33. package/lib/PointNode.d.ts +31 -31
  34. package/lib/PointNode.js +254 -254
  35. package/lib/SymbolicMarker.d.ts +17 -17
  36. package/lib/SymbolicMarker.js +119 -119
  37. package/lib/TimeAxis.d.ts +18 -18
  38. package/lib/TimeAxis.js +433 -433
  39. package/lib/ValueAxis.d.ts +21 -21
  40. package/lib/ValueAxis.js +196 -192
  41. package/lib/VerticalMarker.d.ts +14 -15
  42. package/lib/VerticalMarker.js +111 -111
  43. package/lib/index.d.ts +13 -13
  44. package/lib/index.js +27 -27
  45. package/package.json +4 -4
@@ -1,31 +1,31 @@
1
- /**
2
- *
3
- * Node in a tree.
4
- */
5
- export declare class PointNode {
6
- minT: number;
7
- maxT: number;
8
- minV: number[];
9
- maxV: number[];
10
- avgV: number[];
11
- dim: number;
12
- private children;
13
- private points;
14
- constructor(data: [...number[]][]);
15
- GetData(Tstart: number, Tend: number, IncludeEdges?: boolean): [...number[]][];
16
- GetFullData(): [...number[]][];
17
- GetAllLimits(Tstart: number, Tend: number): [number, number][];
18
- GetLimits(Tstart: number, Tend: number, dimension?: number): [number, number];
19
- /**
20
- * Retrieves a point from the PointNode tree
21
- * @param {number} tVal - The time value of the point to retrieve from the tree.
22
- */
23
- GetPoint(tVal: number): [...number[]];
24
- /**
25
- * Retrieves a specified number of points from the PointNode tree, centered around a point
26
- * @param {number} tVal - The time value of the center point of the point retrieval.
27
- * @param {number} pointsRetrieved - The number of points to retrieve
28
- */
29
- GetPoints(tVal: number, pointsRetrieved?: number): [...number[]][];
30
- private PointBinarySearch;
31
- }
1
+ /**
2
+ *
3
+ * Node in a tree.
4
+ */
5
+ export declare class PointNode {
6
+ minT: number;
7
+ maxT: number;
8
+ minV: number[];
9
+ maxV: number[];
10
+ avgV: number[];
11
+ dim: number;
12
+ private children;
13
+ private points;
14
+ constructor(data: [...number[]][]);
15
+ GetData(Tstart: number, Tend: number, IncludeEdges?: boolean): [...number[]][];
16
+ GetFullData(): [...number[]][];
17
+ GetAllLimits(Tstart: number, Tend: number): [number, number][];
18
+ GetLimits(Tstart: number, Tend: number, dimension?: number): [number, number];
19
+ /**
20
+ * Retrieves a point from the PointNode tree
21
+ * @param {number} tVal - The time value of the point to retrieve from the tree.
22
+ */
23
+ GetPoint(tVal: number): [...number[]];
24
+ /**
25
+ * Retrieves a specified number of points from the PointNode tree, centered around a point
26
+ * @param {number} tVal - The time value of the center point of the point retrieval.
27
+ * @param {number} pointsRetrieved - The number of points to retrieve
28
+ */
29
+ GetPoints(tVal: number, pointsRetrieved?: number): [...number[]][];
30
+ private PointBinarySearch;
31
+ }
package/lib/PointNode.js CHANGED
@@ -1,254 +1,254 @@
1
- "use strict";
2
- // ******************************************************************************************************
3
- // PointNode.tsx - Gbtc
4
- //
5
- // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
- //
7
- // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
- // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
- // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
- // file except in compliance with the License. You may obtain a copy of the License at:
11
- //
12
- // http://opensource.org/licenses/MIT
13
- //
14
- // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
- // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
- // License for the specific language governing permissions and limitations.
17
- //
18
- // Code Modification History:
19
- // ----------------------------------------------------------------------------------------------------
20
- // 03/18/2021 - C Lackner
21
- // Generated original version of source code.
22
- //
23
- // ******************************************************************************************************
24
- var __read = (this && this.__read) || function (o, n) {
25
- var m = typeof Symbol === "function" && o[Symbol.iterator];
26
- if (!m) return o;
27
- var i = m.call(o), r, ar = [], e;
28
- try {
29
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
30
- }
31
- catch (error) { e = { error: error }; }
32
- finally {
33
- try {
34
- if (r && !r.done && (m = i["return"])) m.call(i);
35
- }
36
- finally { if (e) throw e.error; }
37
- }
38
- return ar;
39
- };
40
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
41
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
42
- if (ar || !(i in from)) {
43
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
44
- ar[i] = from[i];
45
- }
46
- }
47
- return to.concat(ar || Array.prototype.slice.call(from));
48
- };
49
- Object.defineProperty(exports, "__esModule", { value: true });
50
- exports.PointNode = void 0;
51
- var MaxPoints = 20;
52
- /**
53
- *
54
- * Node in a tree.
55
- */
56
- var PointNode = /** @class */ (function () {
57
- function PointNode(data) {
58
- var _this = this;
59
- this.dim = data[0].length;
60
- // That minimum time stamp that fits in this bucket
61
- this.minT = data[0][0];
62
- // The maximum time stamp that might fit in this bucket
63
- this.maxT = data[data.length - 1][0];
64
- // Intializing other vars
65
- this.avgV = Array(this.dim - 1).fill(0);
66
- this.minV = Array(this.dim - 1).fill(0);
67
- this.maxV = Array(this.dim - 1).fill(0);
68
- this.children = null;
69
- this.points = null;
70
- if (data.length <= MaxPoints) {
71
- if (data.some(function (point) { return point.length != _this.dim; }))
72
- throw new TypeError("Jagged data passed to PointNode. All points should all be " + this.dim + " dimensions.");
73
- this.points = data;
74
- var _loop_1 = function (index_1) {
75
- this_1.minV[index_1 - 1] = Math.min.apply(Math, __spreadArray([], __read(data.filter(function (pt) { return !isNaN(pt[index_1]); }).map(function (pt) { return pt[index_1]; })), false));
76
- };
77
- var this_1 = this;
78
- for (var index_1 = 1; index_1 < this.dim; index_1++) {
79
- _loop_1(index_1);
80
- }
81
- var _loop_2 = function (index_2) {
82
- this_2.maxV[index_2 - 1] = Math.max.apply(Math, __spreadArray([], __read(data.filter(function (pt) { return !isNaN(pt[index_2]); }).map(function (pt) { return pt[index_2]; })), false));
83
- };
84
- var this_2 = this;
85
- for (var index_2 = 1; index_2 < this.dim; index_2++) {
86
- _loop_2(index_2);
87
- }
88
- return;
89
- }
90
- var nLevel = Math.floor(Math.pow(data.length, 1 / MaxPoints));
91
- var blockSize = nLevel * MaxPoints;
92
- var index = 0;
93
- this.children = [];
94
- while (index < data.length) {
95
- this.children.push(new PointNode(data.slice(index, index + blockSize)));
96
- index = index + blockSize;
97
- }
98
- var _loop_3 = function (index_3) {
99
- this_3.minV[index_3] = Math.min.apply(Math, __spreadArray([], __read(this_3.children.map(function (node) { return node.minV[index_3]; })), false));
100
- };
101
- var this_3 = this;
102
- for (var index_3 = 0; index_3 < this.dim - 1; index_3++) {
103
- _loop_3(index_3);
104
- }
105
- var _loop_4 = function (index_4) {
106
- this_4.maxV[index_4] = Math.max.apply(Math, __spreadArray([], __read(this_4.children.map(function (node) { return node.maxV[index_4]; })), false));
107
- };
108
- var this_4 = this;
109
- for (var index_4 = 0; index_4 < this.dim - 1; index_4++) {
110
- _loop_4(index_4);
111
- }
112
- }
113
- PointNode.prototype.GetData = function (Tstart, Tend, IncludeEdges) {
114
- var _this = this;
115
- if (this.points != null && Tstart <= this.minT && Tend >= this.maxT)
116
- return this.points;
117
- if (this.points != null && IncludeEdges !== undefined && IncludeEdges)
118
- return this.points.filter(function (pt, i) {
119
- var _a, _b;
120
- return (pt[0] >= Tstart && pt[0] <= Tend) ||
121
- i < (((_b = (_a = _this.points) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1) && (_this.points != null ? _this.points[i + 1][0] : 0) >= Tstart ||
122
- i > 0 && (_this.points != null ? _this.points[i - 1][0] : 0) <= Tend;
123
- });
124
- if (this.points != null)
125
- return this.points.filter(function (pt) { return pt[0] >= Tstart && pt[0] <= Tend; });
126
- var result = [];
127
- return result.concat.apply(result, __spreadArray([], __read(this.children.filter(function (node) {
128
- return (node.minT <= Tstart && node.maxT > Tstart) ||
129
- (node.maxT >= Tend && node.minT < Tend) ||
130
- (node.minT >= Tstart && node.maxT <= Tend);
131
- }).map(function (node) { return node.GetData(Tstart, Tend, IncludeEdges); })), false));
132
- };
133
- PointNode.prototype.GetFullData = function () {
134
- return this.GetData(this.minT, this.maxT);
135
- };
136
- PointNode.prototype.GetAllLimits = function (Tstart, Tend) {
137
- var result = Array(this.dim - 1);
138
- for (var index = 0; index < this.dim - 1; index++)
139
- result[index] = this.GetLimits(Tstart, Tend, index);
140
- return result;
141
- };
142
- // Note: Dimension indexing does not include time, I.E. in (x,y), y would be dimension 0;
143
- PointNode.prototype.GetLimits = function (Tstart, Tend, dimension) {
144
- var currentIndex = dimension !== null && dimension !== void 0 ? dimension : 0;
145
- var max = this.maxV[currentIndex];
146
- var min = this.minV[currentIndex];
147
- if (this.points == null && !(Tstart <= this.minT && Tend > this.maxT)) {
148
- // Array represents all limits of buckets
149
- var limits = this.children.filter(function (n) { return n.maxT > Tstart && n.minT < Tend; }).map(function (n) { return n.GetLimits(Tstart, Tend, currentIndex); });
150
- min = Math.min.apply(Math, __spreadArray([], __read(limits.map(function (pt) { return pt[0]; })), false));
151
- max = Math.max.apply(Math, __spreadArray([], __read(limits.map(function (pt) { return pt[1]; })), false));
152
- }
153
- if (this.points != null && !(Tstart <= this.minT && Tend > this.maxT)) {
154
- // Array represents all numbers within this bucket that fall in range
155
- var limits = this.points.filter(function (pt) { return pt[0] > Tstart && pt[0] < Tend; }).map(function (pt) { return pt[currentIndex + 1]; });
156
- min = Math.min.apply(Math, __spreadArray([], __read(limits), false));
157
- max = Math.max.apply(Math, __spreadArray([], __read(limits), false));
158
- }
159
- return [min, max];
160
- };
161
- /**
162
- * Retrieves a point from the PointNode tree
163
- * @param {number} tVal - The time value of the point to retrieve from the tree.
164
- */
165
- PointNode.prototype.GetPoint = function (tVal) {
166
- return this.PointBinarySearch(tVal, 1)[0];
167
- };
168
- /**
169
- * Retrieves a specified number of points from the PointNode tree, centered around a point
170
- * @param {number} tVal - The time value of the center point of the point retrieval.
171
- * @param {number} pointsRetrieved - The number of points to retrieve
172
- */
173
- PointNode.prototype.GetPoints = function (tVal, pointsRetrieved) {
174
- if (pointsRetrieved === void 0) { pointsRetrieved = 1; }
175
- return this.PointBinarySearch(tVal, pointsRetrieved);
176
- };
177
- PointNode.prototype.PointBinarySearch = function (tVal, pointsRetrieved, bucketLowerNeighbor, bucketUpperNeighbor) {
178
- if (pointsRetrieved === void 0) { pointsRetrieved = 1; }
179
- if (pointsRetrieved <= 0)
180
- throw new RangeError("Requested number of points must be positive value.");
181
- // round tVal back to whole integer
182
- if (this.points !== null) {
183
- // if the tVal is less than the minimum value of the subsection, return the first point
184
- if (tVal < this.minT) {
185
- var spillOver = pointsRetrieved - this.points.length;
186
- var spillOverPoints = (spillOver > 0 && bucketUpperNeighbor !== undefined) ? bucketUpperNeighbor.PointBinarySearch(tVal, spillOver, this, undefined) : [];
187
- return this.points.slice(0, pointsRetrieved).concat(spillOverPoints);
188
- }
189
- // if the tVal is greater than the largest value of the subsection, return the last point
190
- if (tVal > this.maxT) {
191
- var spillOver = pointsRetrieved - this.points.length;
192
- var spillOverPoints = (spillOver > 0 && bucketLowerNeighbor !== undefined) ? bucketLowerNeighbor.PointBinarySearch(tVal, spillOver, undefined, this) : [];
193
- return spillOverPoints.concat(this.points.slice(-pointsRetrieved));
194
- }
195
- // Otherwise, perform binary search
196
- var upper = this.points.length - 1;
197
- var lower = 0;
198
- var Tlower = this.minT;
199
- var Tupper = this.maxT;
200
- while (Tupper !== tVal && Tlower !== tVal && upper !== lower && Tupper !== Tlower) {
201
- var center = Math.round((upper + lower) / 2);
202
- var Tcenter = this.points[center][0];
203
- if (center === upper || center === lower)
204
- break;
205
- if (Tcenter <= tVal)
206
- lower = center;
207
- if (Tcenter > tVal)
208
- upper = center;
209
- Tupper = this.points[upper][0];
210
- Tlower = this.points[lower][0];
211
- }
212
- var upperPoints = Math.floor(pointsRetrieved / 2);
213
- var lowerPoints = upperPoints;
214
- // Adjustment for even number of points
215
- var sidingAdjust = pointsRetrieved % 2 === 0 ? 1 : 0;
216
- var centerIndex = void 0;
217
- if (Math.abs(tVal - Tlower) < Math.abs(tVal - Tupper)) {
218
- centerIndex = lower;
219
- lowerPoints -= sidingAdjust;
220
- }
221
- else {
222
- centerIndex = upper;
223
- upperPoints -= sidingAdjust;
224
- }
225
- // Note: If we have spillover and no neighbor on the spillover side, then we discard the idea of spillover, and just return as many as we can on that side
226
- var upperSpillOver = centerIndex + upperPoints + 1 - this.points.length;
227
- var upperNeighborPoints = (upperSpillOver > 0 && bucketUpperNeighbor !== undefined) ? bucketUpperNeighbor.PointBinarySearch(tVal, upperSpillOver, this, undefined) : [];
228
- var lowerSpillOver = lowerPoints - centerIndex;
229
- var lowerNeighborPoints = (lowerSpillOver > 0 && bucketLowerNeighbor !== undefined) ? bucketLowerNeighbor.PointBinarySearch(tVal, lowerSpillOver, undefined, this) : [];
230
- return lowerNeighborPoints.concat(this.points.slice(Math.max(centerIndex - lowerPoints, 0), Math.min(centerIndex + upperPoints + 1, this.points.length))).concat(upperNeighborPoints);
231
- }
232
- else if (this.children !== null) {
233
- var childIndex = -1;
234
- // if the subsection is null, and the tVal is less than the minimum value of the subsection, ??Start over again looking for the point in the first subsection??
235
- if (tVal < this.minT)
236
- childIndex = 0;
237
- else if (tVal > this.maxT)
238
- childIndex = this.children.length - 1;
239
- else
240
- childIndex = this.children.findIndex(function (n) { return n.maxT > tVal; });
241
- if (childIndex === -1)
242
- throw new RangeError("Could not find child bucket with point that has a time value of " + tVal);
243
- // Find neighbors
244
- var upperNeighbor = childIndex !== this.children.length - 1 ? this.children[childIndex + 1] : undefined;
245
- var lowerNeighbor = childIndex !== 0 ? this.children[childIndex - 1] : undefined;
246
- return this.children[childIndex].PointBinarySearch(tVal, pointsRetrieved, lowerNeighbor, upperNeighbor);
247
- }
248
- else
249
- throw new RangeError("Both children and points are null for PointNode, unabled to find point with time value of " + tVal);
250
- };
251
- return PointNode;
252
- }());
253
- exports.PointNode = PointNode;
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9pbnROb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BvaW50Tm9kZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlHQUF5RztBQUN6Ryx3QkFBd0I7QUFDeEIsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4RyxzR0FBc0c7QUFDdEcsd0ZBQXdGO0FBQ3hGLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsd0dBQXdHO0FBQ3hHLDBCQUEwQjtBQUMxQixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHlHQUF5Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6RyxJQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckI7OztHQUdHO0FBQ0g7SUFZSSxtQkFBWSxJQUFxQjtRQUFqQyxpQkFnQ0M7UUEvQkcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzFCLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2Qix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FB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
1
+ "use strict";
2
+ // ******************************************************************************************************
3
+ // PointNode.tsx - Gbtc
4
+ //
5
+ // Copyright © 2020, Grid Protection Alliance. All Rights Reserved.
6
+ //
7
+ // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
+ // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
+ // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
+ // file except in compliance with the License. You may obtain a copy of the License at:
11
+ //
12
+ // http://opensource.org/licenses/MIT
13
+ //
14
+ // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
+ // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
+ // License for the specific language governing permissions and limitations.
17
+ //
18
+ // Code Modification History:
19
+ // ----------------------------------------------------------------------------------------------------
20
+ // 03/18/2021 - C Lackner
21
+ // Generated original version of source code.
22
+ //
23
+ // ******************************************************************************************************
24
+ var __read = (this && this.__read) || function (o, n) {
25
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
26
+ if (!m) return o;
27
+ var i = m.call(o), r, ar = [], e;
28
+ try {
29
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
30
+ }
31
+ catch (error) { e = { error: error }; }
32
+ finally {
33
+ try {
34
+ if (r && !r.done && (m = i["return"])) m.call(i);
35
+ }
36
+ finally { if (e) throw e.error; }
37
+ }
38
+ return ar;
39
+ };
40
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
41
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
42
+ if (ar || !(i in from)) {
43
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
44
+ ar[i] = from[i];
45
+ }
46
+ }
47
+ return to.concat(ar || Array.prototype.slice.call(from));
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.PointNode = void 0;
51
+ var MaxPoints = 20;
52
+ /**
53
+ *
54
+ * Node in a tree.
55
+ */
56
+ var PointNode = /** @class */ (function () {
57
+ function PointNode(data) {
58
+ var _this = this;
59
+ this.dim = data[0].length;
60
+ // That minimum time stamp that fits in this bucket
61
+ this.minT = data[0][0];
62
+ // The maximum time stamp that might fit in this bucket
63
+ this.maxT = data[data.length - 1][0];
64
+ // Intializing other vars
65
+ this.avgV = Array(this.dim - 1).fill(0);
66
+ this.minV = Array(this.dim - 1).fill(0);
67
+ this.maxV = Array(this.dim - 1).fill(0);
68
+ this.children = null;
69
+ this.points = null;
70
+ if (data.length <= MaxPoints) {
71
+ if (data.some(function (point) { return point.length != _this.dim; }))
72
+ throw new TypeError("Jagged data passed to PointNode. All points should all be ".concat(this.dim, " dimensions."));
73
+ this.points = data;
74
+ var _loop_1 = function (index_1) {
75
+ this_1.minV[index_1 - 1] = Math.min.apply(Math, __spreadArray([], __read(data.filter(function (pt) { return !isNaN(pt[index_1]); }).map(function (pt) { return pt[index_1]; })), false));
76
+ };
77
+ var this_1 = this;
78
+ for (var index_1 = 1; index_1 < this.dim; index_1++) {
79
+ _loop_1(index_1);
80
+ }
81
+ var _loop_2 = function (index_2) {
82
+ this_2.maxV[index_2 - 1] = Math.max.apply(Math, __spreadArray([], __read(data.filter(function (pt) { return !isNaN(pt[index_2]); }).map(function (pt) { return pt[index_2]; })), false));
83
+ };
84
+ var this_2 = this;
85
+ for (var index_2 = 1; index_2 < this.dim; index_2++) {
86
+ _loop_2(index_2);
87
+ }
88
+ return;
89
+ }
90
+ var nLevel = Math.floor(Math.pow(data.length, 1 / MaxPoints));
91
+ var blockSize = nLevel * MaxPoints;
92
+ var index = 0;
93
+ this.children = [];
94
+ while (index < data.length) {
95
+ this.children.push(new PointNode(data.slice(index, index + blockSize)));
96
+ index = index + blockSize;
97
+ }
98
+ var _loop_3 = function (index_3) {
99
+ this_3.minV[index_3] = Math.min.apply(Math, __spreadArray([], __read(this_3.children.map(function (node) { return node.minV[index_3]; })), false));
100
+ };
101
+ var this_3 = this;
102
+ for (var index_3 = 0; index_3 < this.dim - 1; index_3++) {
103
+ _loop_3(index_3);
104
+ }
105
+ var _loop_4 = function (index_4) {
106
+ this_4.maxV[index_4] = Math.max.apply(Math, __spreadArray([], __read(this_4.children.map(function (node) { return node.maxV[index_4]; })), false));
107
+ };
108
+ var this_4 = this;
109
+ for (var index_4 = 0; index_4 < this.dim - 1; index_4++) {
110
+ _loop_4(index_4);
111
+ }
112
+ }
113
+ PointNode.prototype.GetData = function (Tstart, Tend, IncludeEdges) {
114
+ var _this = this;
115
+ if (this.points != null && Tstart <= this.minT && Tend >= this.maxT)
116
+ return this.points;
117
+ if (this.points != null && IncludeEdges !== undefined && IncludeEdges)
118
+ return this.points.filter(function (pt, i) {
119
+ var _a, _b;
120
+ return (pt[0] >= Tstart && pt[0] <= Tend) ||
121
+ i < (((_b = (_a = _this.points) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1) && (_this.points != null ? _this.points[i + 1][0] : 0) >= Tstart ||
122
+ i > 0 && (_this.points != null ? _this.points[i - 1][0] : 0) <= Tend;
123
+ });
124
+ if (this.points != null)
125
+ return this.points.filter(function (pt) { return pt[0] >= Tstart && pt[0] <= Tend; });
126
+ var result = [];
127
+ return result.concat.apply(result, __spreadArray([], __read(this.children.filter(function (node) {
128
+ return (node.minT <= Tstart && node.maxT > Tstart) ||
129
+ (node.maxT >= Tend && node.minT < Tend) ||
130
+ (node.minT >= Tstart && node.maxT <= Tend);
131
+ }).map(function (node) { return node.GetData(Tstart, Tend, IncludeEdges); })), false));
132
+ };
133
+ PointNode.prototype.GetFullData = function () {
134
+ return this.GetData(this.minT, this.maxT);
135
+ };
136
+ PointNode.prototype.GetAllLimits = function (Tstart, Tend) {
137
+ var result = Array(this.dim - 1);
138
+ for (var index = 0; index < this.dim - 1; index++)
139
+ result[index] = this.GetLimits(Tstart, Tend, index);
140
+ return result;
141
+ };
142
+ // Note: Dimension indexing does not include time, I.E. in (x,y), y would be dimension 0;
143
+ PointNode.prototype.GetLimits = function (Tstart, Tend, dimension) {
144
+ var currentIndex = dimension !== null && dimension !== void 0 ? dimension : 0;
145
+ var max = this.maxV[currentIndex];
146
+ var min = this.minV[currentIndex];
147
+ if (this.points == null && !(Tstart <= this.minT && Tend > this.maxT)) {
148
+ // Array represents all limits of buckets
149
+ var limits = this.children.filter(function (n) { return n.maxT > Tstart && n.minT < Tend; }).map(function (n) { return n.GetLimits(Tstart, Tend, currentIndex); });
150
+ min = Math.min.apply(Math, __spreadArray([], __read(limits.map(function (pt) { return pt[0]; })), false));
151
+ max = Math.max.apply(Math, __spreadArray([], __read(limits.map(function (pt) { return pt[1]; })), false));
152
+ }
153
+ if (this.points != null && !(Tstart <= this.minT && Tend > this.maxT)) {
154
+ // Array represents all numbers within this bucket that fall in range
155
+ var limits = this.points.filter(function (pt) { return pt[0] > Tstart && pt[0] < Tend; }).map(function (pt) { return pt[currentIndex + 1]; });
156
+ min = Math.min.apply(Math, __spreadArray([], __read(limits), false));
157
+ max = Math.max.apply(Math, __spreadArray([], __read(limits), false));
158
+ }
159
+ return [min, max];
160
+ };
161
+ /**
162
+ * Retrieves a point from the PointNode tree
163
+ * @param {number} tVal - The time value of the point to retrieve from the tree.
164
+ */
165
+ PointNode.prototype.GetPoint = function (tVal) {
166
+ return this.PointBinarySearch(tVal, 1)[0];
167
+ };
168
+ /**
169
+ * Retrieves a specified number of points from the PointNode tree, centered around a point
170
+ * @param {number} tVal - The time value of the center point of the point retrieval.
171
+ * @param {number} pointsRetrieved - The number of points to retrieve
172
+ */
173
+ PointNode.prototype.GetPoints = function (tVal, pointsRetrieved) {
174
+ if (pointsRetrieved === void 0) { pointsRetrieved = 1; }
175
+ return this.PointBinarySearch(tVal, pointsRetrieved);
176
+ };
177
+ PointNode.prototype.PointBinarySearch = function (tVal, pointsRetrieved, bucketLowerNeighbor, bucketUpperNeighbor) {
178
+ if (pointsRetrieved === void 0) { pointsRetrieved = 1; }
179
+ if (pointsRetrieved <= 0)
180
+ throw new RangeError("Requested number of points must be positive value.");
181
+ // round tVal back to whole integer
182
+ if (this.points !== null) {
183
+ // if the tVal is less than the minimum value of the subsection, return the first point
184
+ if (tVal < this.minT) {
185
+ var spillOver = pointsRetrieved - this.points.length;
186
+ var spillOverPoints = (spillOver > 0 && bucketUpperNeighbor !== undefined) ? bucketUpperNeighbor.PointBinarySearch(tVal, spillOver, this, undefined) : [];
187
+ return this.points.slice(0, pointsRetrieved).concat(spillOverPoints);
188
+ }
189
+ // if the tVal is greater than the largest value of the subsection, return the last point
190
+ if (tVal > this.maxT) {
191
+ var spillOver = pointsRetrieved - this.points.length;
192
+ var spillOverPoints = (spillOver > 0 && bucketLowerNeighbor !== undefined) ? bucketLowerNeighbor.PointBinarySearch(tVal, spillOver, undefined, this) : [];
193
+ return spillOverPoints.concat(this.points.slice(-pointsRetrieved));
194
+ }
195
+ // Otherwise, perform binary search
196
+ var upper = this.points.length - 1;
197
+ var lower = 0;
198
+ var Tlower = this.minT;
199
+ var Tupper = this.maxT;
200
+ while (Tupper !== tVal && Tlower !== tVal && upper !== lower && Tupper !== Tlower) {
201
+ var center = Math.round((upper + lower) / 2);
202
+ var Tcenter = this.points[center][0];
203
+ if (center === upper || center === lower)
204
+ break;
205
+ if (Tcenter <= tVal)
206
+ lower = center;
207
+ if (Tcenter > tVal)
208
+ upper = center;
209
+ Tupper = this.points[upper][0];
210
+ Tlower = this.points[lower][0];
211
+ }
212
+ var upperPoints = Math.floor(pointsRetrieved / 2);
213
+ var lowerPoints = upperPoints;
214
+ // Adjustment for even number of points
215
+ var sidingAdjust = pointsRetrieved % 2 === 0 ? 1 : 0;
216
+ var centerIndex = void 0;
217
+ if (Math.abs(tVal - Tlower) < Math.abs(tVal - Tupper)) {
218
+ centerIndex = lower;
219
+ lowerPoints -= sidingAdjust;
220
+ }
221
+ else {
222
+ centerIndex = upper;
223
+ upperPoints -= sidingAdjust;
224
+ }
225
+ // Note: If we have spillover and no neighbor on the spillover side, then we discard the idea of spillover, and just return as many as we can on that side
226
+ var upperSpillOver = centerIndex + upperPoints + 1 - this.points.length;
227
+ var upperNeighborPoints = (upperSpillOver > 0 && bucketUpperNeighbor !== undefined) ? bucketUpperNeighbor.PointBinarySearch(tVal, upperSpillOver, this, undefined) : [];
228
+ var lowerSpillOver = lowerPoints - centerIndex;
229
+ var lowerNeighborPoints = (lowerSpillOver > 0 && bucketLowerNeighbor !== undefined) ? bucketLowerNeighbor.PointBinarySearch(tVal, lowerSpillOver, undefined, this) : [];
230
+ return lowerNeighborPoints.concat(this.points.slice(Math.max(centerIndex - lowerPoints, 0), Math.min(centerIndex + upperPoints + 1, this.points.length))).concat(upperNeighborPoints);
231
+ }
232
+ else if (this.children !== null) {
233
+ var childIndex = -1;
234
+ // if the subsection is null, and the tVal is less than the minimum value of the subsection, ??Start over again looking for the point in the first subsection??
235
+ if (tVal < this.minT)
236
+ childIndex = 0;
237
+ else if (tVal > this.maxT)
238
+ childIndex = this.children.length - 1;
239
+ else
240
+ childIndex = this.children.findIndex(function (n) { return n.maxT > tVal; });
241
+ if (childIndex === -1)
242
+ throw new RangeError("Could not find child bucket with point that has a time value of ".concat(tVal));
243
+ // Find neighbors
244
+ var upperNeighbor = childIndex !== this.children.length - 1 ? this.children[childIndex + 1] : undefined;
245
+ var lowerNeighbor = childIndex !== 0 ? this.children[childIndex - 1] : undefined;
246
+ return this.children[childIndex].PointBinarySearch(tVal, pointsRetrieved, lowerNeighbor, upperNeighbor);
247
+ }
248
+ else
249
+ throw new RangeError("Both children and points are null for PointNode, unabled to find point with time value of ".concat(tVal));
250
+ };
251
+ return PointNode;
252
+ }());
253
+ exports.PointNode = PointNode;
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9pbnROb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BvaW50Tm9kZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlHQUF5RztBQUN6Ryx3QkFBd0I7QUFDeEIsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4RyxzR0FBc0c7QUFDdEcsd0ZBQXdGO0FBQ3hGLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsd0dBQXdHO0FBQ3hHLDBCQUEwQjtBQUMxQixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHlHQUF5Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6RyxJQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckI7OztHQUdHO0FBQ0g7SUFZSSxtQkFBWSxJQUFxQjtRQUFqQyxpQkFnQ0M7UUEvQkcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzFCLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2Qix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FB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LFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQWhDLENBQWdDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsWUFBWSxDQUFDLEVBQXJDLENBQXFDLENBQUMsQ0FBQztZQUM1SCxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBUixJQUFJLDJCQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUwsQ0FBSyxDQUFDLFVBQUMsQ0FBQztZQUMzQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBUixJQUFJLDJCQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUwsQ0FBSyxDQUFDLFVBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RFLHFFQUFxRTtZQUNyRSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxZQUFZLEdBQUMsQ0FBQyxDQUFDLEVBQWxCLENBQWtCLENBQUMsQ0FBQztZQUN2RyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBUixJQUFJLDJCQUFRLE1BQU0s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