@hoox-sh/pynets 0.2.0 → 0.3.0
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.
- package/CHANGELOG.md +39 -0
- package/README.md +17 -8
- package/dist/browser.js +89 -84
- package/dist/index.js +19482 -12937
- package/package.json +1 -1
- package/src/ast/builder.ts +235 -12
- package/src/ast/nodes.ts +114 -4
- package/src/ast/unparse.ts +192 -17
- package/src/cli/rich.ts +1 -1
- package/src/generated/PinescriptLexer.interp +5 -1
- package/src/generated/PinescriptLexer.tokens +97 -95
- package/src/generated/PinescriptLexer.ts +512 -502
- package/src/generated/PinescriptParser.interp +8 -1
- package/src/generated/PinescriptParser.tokens +97 -95
- package/src/generated/PinescriptParser.ts +1907 -1287
- package/src/generated/PinescriptParserVisitor.ts +36 -1
- package/src/index.ts +1 -0
- package/src/runtime/array.ts +238 -68
- package/src/runtime/compile/collections.ts +187 -34
- package/src/runtime/compile/emit.ts +266 -9
- package/src/runtime/compile/emit_call.ts +425 -35
- package/src/runtime/compile/runtime.ts +62 -2
- package/src/runtime/compile/strategy.ts +87 -6
- package/src/runtime/compile/types.ts +2 -0
- package/src/runtime/drawings.ts +405 -8
- package/src/runtime/interpret.ts +2201 -277
- package/src/runtime/matrix.ts +371 -42
- package/src/runtime/strategy.ts +695 -33
- package/src/runtime/ta.ts +654 -20
- package/src/runtime/timeframe.ts +199 -0
|
@@ -19,6 +19,32 @@ function cell(v: unknown): number | null {
|
|
|
19
19
|
return naNum(v);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/** Keep UDT/string/bool slots; only coerce non-finite numbers to `na`. */
|
|
23
|
+
function store(v: unknown): unknown {
|
|
24
|
+
if (v == null) return null;
|
|
25
|
+
if (typeof v === "number") return Number.isFinite(v) ? v : null;
|
|
26
|
+
return v;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function parseSortArgs(order?: unknown, sortField?: unknown): { order: "asc" | "desc"; field: unknown } {
|
|
30
|
+
if (sortField !== undefined && sortField !== null) {
|
|
31
|
+
return { order: sortOrder(order), field: sortField };
|
|
32
|
+
}
|
|
33
|
+
if (order == null) return { order: "asc", field: null };
|
|
34
|
+
if (typeof order === "string") {
|
|
35
|
+
const low = order.toLowerCase();
|
|
36
|
+
if (low === "ascending" || low === "descending" || low === "asc" || low === "desc" || low.includes("desc") || low.includes("asc")) {
|
|
37
|
+
return { order: sortOrder(order), field: null };
|
|
38
|
+
}
|
|
39
|
+
return { order: "asc", field: order };
|
|
40
|
+
}
|
|
41
|
+
if (typeof order === "number" && Number.isFinite(order)) {
|
|
42
|
+
if (order === 1 || order === -1) return { order: sortOrder(order), field: null };
|
|
43
|
+
return { order: "asc", field: order };
|
|
44
|
+
}
|
|
45
|
+
return { order: sortOrder(order), field: null };
|
|
46
|
+
}
|
|
47
|
+
|
|
22
48
|
function asArray(id: unknown): PineArray | null {
|
|
23
49
|
return id instanceof PineArray ? id : null;
|
|
24
50
|
}
|
|
@@ -32,58 +58,65 @@ function asMatrix(id: unknown): PineMatrix | null {
|
|
|
32
58
|
}
|
|
33
59
|
|
|
34
60
|
function sortOrder(order: unknown): "asc" | "desc" {
|
|
61
|
+
if (typeof order === "number") return order < 0 ? "desc" : "asc";
|
|
35
62
|
return String(order ?? "asc").toLowerCase().includes("desc") ? "desc" : "asc";
|
|
36
63
|
}
|
|
37
64
|
|
|
38
|
-
function wrapCells(cells: ReadonlyArray<
|
|
65
|
+
function wrapCells(cells: ReadonlyArray<unknown> | null | undefined): PineArray | null {
|
|
39
66
|
if (cells == null) return null;
|
|
40
67
|
const out = new PineArray();
|
|
41
|
-
for (const v of cells) out.push(v);
|
|
68
|
+
for (const v of cells) out.push(store(v));
|
|
42
69
|
return out;
|
|
43
70
|
}
|
|
44
71
|
|
|
72
|
+
function storedArrayValues(id: unknown): unknown[] | undefined {
|
|
73
|
+
const a = asArray(id);
|
|
74
|
+
if (a == null) return undefined;
|
|
75
|
+
return a.toValues().map(store);
|
|
76
|
+
}
|
|
77
|
+
|
|
45
78
|
export const compileArray = {
|
|
46
79
|
new(size?: unknown, initial?: unknown): PineArray {
|
|
47
|
-
return new PineArray(n(size, 0),
|
|
80
|
+
return new PineArray(n(size, 0), store(initial));
|
|
48
81
|
},
|
|
49
|
-
get(id: unknown, index?: unknown):
|
|
82
|
+
get(id: unknown, index?: unknown): unknown {
|
|
50
83
|
return asArray(id)?.get(n(index, 0)) ?? null;
|
|
51
84
|
},
|
|
52
85
|
set(id: unknown, index?: unknown, value?: unknown): unknown {
|
|
53
|
-
asArray(id)?.set(n(index, 0),
|
|
86
|
+
asArray(id)?.set(n(index, 0), store(value));
|
|
54
87
|
return id ?? null;
|
|
55
88
|
},
|
|
56
89
|
push(id: unknown, value?: unknown): unknown {
|
|
57
|
-
asArray(id)?.push(
|
|
90
|
+
asArray(id)?.push(store(value));
|
|
58
91
|
return id ?? null;
|
|
59
92
|
},
|
|
60
|
-
pop(id: unknown):
|
|
93
|
+
pop(id: unknown): unknown {
|
|
61
94
|
return asArray(id)?.pop() ?? null;
|
|
62
95
|
},
|
|
63
96
|
unshift(id: unknown, value?: unknown): unknown {
|
|
64
|
-
asArray(id)?.unshift(
|
|
97
|
+
asArray(id)?.unshift(store(value));
|
|
65
98
|
return id ?? null;
|
|
66
99
|
},
|
|
67
|
-
shift(id: unknown):
|
|
100
|
+
shift(id: unknown): unknown {
|
|
68
101
|
return asArray(id)?.shift() ?? null;
|
|
69
102
|
},
|
|
70
103
|
size(id: unknown): number {
|
|
71
104
|
return asArray(id)?.size() ?? 0;
|
|
72
105
|
},
|
|
73
106
|
includes(id: unknown, value?: unknown): boolean {
|
|
74
|
-
return asArray(id)?.includes(
|
|
107
|
+
return asArray(id)?.includes(store(value)) ?? false;
|
|
75
108
|
},
|
|
76
|
-
first(id: unknown):
|
|
109
|
+
first(id: unknown): unknown {
|
|
77
110
|
return asArray(id)?.first() ?? null;
|
|
78
111
|
},
|
|
79
|
-
last(id: unknown):
|
|
112
|
+
last(id: unknown): unknown {
|
|
80
113
|
return asArray(id)?.last() ?? null;
|
|
81
114
|
},
|
|
82
115
|
insert(id: unknown, index?: unknown, value?: unknown): unknown {
|
|
83
|
-
asArray(id)?.insert(n(index, 0),
|
|
116
|
+
asArray(id)?.insert(n(index, 0), store(value));
|
|
84
117
|
return id ?? null;
|
|
85
118
|
},
|
|
86
|
-
remove(id: unknown, index?: unknown):
|
|
119
|
+
remove(id: unknown, index?: unknown): unknown {
|
|
87
120
|
return asArray(id)?.remove(n(index, 0)) ?? null;
|
|
88
121
|
},
|
|
89
122
|
clear(id: unknown): unknown {
|
|
@@ -91,7 +124,7 @@ export const compileArray = {
|
|
|
91
124
|
return id ?? null;
|
|
92
125
|
},
|
|
93
126
|
fill(id: unknown, value?: unknown): unknown {
|
|
94
|
-
asArray(id)?.fill(
|
|
127
|
+
asArray(id)?.fill(store(value));
|
|
95
128
|
return id ?? null;
|
|
96
129
|
},
|
|
97
130
|
copy(id: unknown): PineArray | null {
|
|
@@ -101,9 +134,9 @@ export const compileArray = {
|
|
|
101
134
|
asArray(id)?.reverse();
|
|
102
135
|
return id ?? null;
|
|
103
136
|
},
|
|
104
|
-
sort(id: unknown, order?: unknown): unknown {
|
|
105
|
-
const
|
|
106
|
-
asArray(id)?.sort(
|
|
137
|
+
sort(id: unknown, order?: unknown, sortField?: unknown): unknown {
|
|
138
|
+
const parsed = parseSortArgs(order, sortField);
|
|
139
|
+
asArray(id)?.sort(parsed.order, parsed.field);
|
|
107
140
|
return id ?? null;
|
|
108
141
|
},
|
|
109
142
|
concat(id: unknown, other?: unknown): PineArray | null {
|
|
@@ -117,10 +150,10 @@ export const compileArray = {
|
|
|
117
150
|
return asArray(id)?.slice(n(from, 0), to == null ? undefined : n(to, 0)) ?? null;
|
|
118
151
|
},
|
|
119
152
|
indexof(id: unknown, value?: unknown): number | null {
|
|
120
|
-
return asArray(id)?.indexof(
|
|
153
|
+
return asArray(id)?.indexof(store(value)) ?? null;
|
|
121
154
|
},
|
|
122
155
|
lastindexof(id: unknown, value?: unknown): number | null {
|
|
123
|
-
return asArray(id)?.lastIndexOf(
|
|
156
|
+
return asArray(id)?.lastIndexOf(store(value)) ?? null;
|
|
124
157
|
},
|
|
125
158
|
avg(id: unknown): number | null {
|
|
126
159
|
return asArray(id)?.avg() ?? null;
|
|
@@ -174,17 +207,18 @@ export const compileArray = {
|
|
|
174
207
|
percentrank(id: unknown, value?: unknown): number | null {
|
|
175
208
|
return asArray(id)?.percentrank(cell(value)) ?? null;
|
|
176
209
|
},
|
|
177
|
-
binary_search(id: unknown, value?: unknown): number | null {
|
|
178
|
-
return asArray(id)?.binarySearch(
|
|
210
|
+
binary_search(id: unknown, value?: unknown, sortField?: unknown): number | null {
|
|
211
|
+
return asArray(id)?.binarySearch(store(value), sortField) ?? null;
|
|
179
212
|
},
|
|
180
|
-
binary_search_leftmost(id: unknown, value?: unknown): number | null {
|
|
181
|
-
return asArray(id)?.binarySearchLeftmost(
|
|
213
|
+
binary_search_leftmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
|
|
214
|
+
return asArray(id)?.binarySearchLeftmost(store(value), sortField) ?? null;
|
|
182
215
|
},
|
|
183
|
-
binary_search_rightmost(id: unknown, value?: unknown): number | null {
|
|
184
|
-
return asArray(id)?.binarySearchRightmost(
|
|
216
|
+
binary_search_rightmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
|
|
217
|
+
return asArray(id)?.binarySearchRightmost(store(value), sortField) ?? null;
|
|
185
218
|
},
|
|
186
|
-
sort_indices(id: unknown, order?: unknown): PineArray | null {
|
|
187
|
-
const
|
|
219
|
+
sort_indices(id: unknown, order?: unknown, sortField?: unknown): PineArray | null {
|
|
220
|
+
const parsed = parseSortArgs(order, sortField);
|
|
221
|
+
const idx = asArray(id)?.sortIndices(parsed.order, parsed.field);
|
|
188
222
|
return wrapCells(idx);
|
|
189
223
|
},
|
|
190
224
|
};
|
|
@@ -232,13 +266,13 @@ export const compileMap = {
|
|
|
232
266
|
|
|
233
267
|
export const compileMatrix = {
|
|
234
268
|
new(rows?: unknown, cols?: unknown, initial?: unknown): PineMatrix {
|
|
235
|
-
return new PineMatrix(n(rows, 0), n(cols, 0),
|
|
269
|
+
return new PineMatrix(n(rows, 0), n(cols, 0), store(initial));
|
|
236
270
|
},
|
|
237
|
-
get(id: unknown, row?: unknown, col?: unknown):
|
|
271
|
+
get(id: unknown, row?: unknown, col?: unknown): unknown {
|
|
238
272
|
return asMatrix(id)?.get(n(row, 0), n(col, 0)) ?? null;
|
|
239
273
|
},
|
|
240
274
|
set(id: unknown, row?: unknown, col?: unknown, value?: unknown): unknown {
|
|
241
|
-
asMatrix(id)?.set(n(row, 0), n(col, 0),
|
|
275
|
+
asMatrix(id)?.set(n(row, 0), n(col, 0), store(value));
|
|
242
276
|
return id ?? null;
|
|
243
277
|
},
|
|
244
278
|
rows(id: unknown): number {
|
|
@@ -248,7 +282,17 @@ export const compileMatrix = {
|
|
|
248
282
|
return asMatrix(id)?.columns() ?? 0;
|
|
249
283
|
},
|
|
250
284
|
fill(id: unknown, value?: unknown): unknown {
|
|
251
|
-
asMatrix(id)?.fill(
|
|
285
|
+
asMatrix(id)?.fill(store(value));
|
|
286
|
+
return id ?? null;
|
|
287
|
+
},
|
|
288
|
+
add_row(id: unknown, index?: unknown, array?: unknown): unknown {
|
|
289
|
+
const idx = naNum(index);
|
|
290
|
+
asMatrix(id)?.addRow(idx ?? undefined, storedArrayValues(array));
|
|
291
|
+
return id ?? null;
|
|
292
|
+
},
|
|
293
|
+
add_col(id: unknown, index?: unknown, array?: unknown): unknown {
|
|
294
|
+
const idx = naNum(index);
|
|
295
|
+
asMatrix(id)?.addCol(idx ?? undefined, storedArrayValues(array));
|
|
252
296
|
return id ?? null;
|
|
253
297
|
},
|
|
254
298
|
transpose(id: unknown): PineMatrix | null {
|
|
@@ -326,14 +370,123 @@ export const compileMatrix = {
|
|
|
326
370
|
asMatrix(id)?.reverse();
|
|
327
371
|
return id ?? null;
|
|
328
372
|
},
|
|
329
|
-
sort(id: unknown, column?: unknown, order?: unknown): unknown {
|
|
330
|
-
asMatrix(id)?.sort(n(column, 0), sortOrder(order));
|
|
373
|
+
sort(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): unknown {
|
|
374
|
+
asMatrix(id)?.sort(n(column, 0), sortOrder(order), sortField);
|
|
331
375
|
return id ?? null;
|
|
332
376
|
},
|
|
377
|
+
sort_indices(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): PineArray | null {
|
|
378
|
+
const m = asMatrix(id);
|
|
379
|
+
if (m == null) return null;
|
|
380
|
+
return wrapCells(m.sortIndices(n(column, 0), sortOrder(order), sortField));
|
|
381
|
+
},
|
|
333
382
|
eigenvalues(id: unknown): PineArray | null {
|
|
334
383
|
return wrapCells(asMatrix(id)?.eigenvalues());
|
|
335
384
|
},
|
|
336
385
|
eigenvectors(id: unknown): PineMatrix | null {
|
|
337
386
|
return asMatrix(id)?.eigenvectors() ?? null;
|
|
338
387
|
},
|
|
388
|
+
sum_row(id: unknown, index?: unknown): number | null {
|
|
389
|
+
const m = asMatrix(id);
|
|
390
|
+
const i = naNum(index);
|
|
391
|
+
if (m == null || i == null) return null;
|
|
392
|
+
return m.sumRow(i);
|
|
393
|
+
},
|
|
394
|
+
avg_row(id: unknown, index?: unknown): number | null {
|
|
395
|
+
const m = asMatrix(id);
|
|
396
|
+
const i = naNum(index);
|
|
397
|
+
if (m == null || i == null) return null;
|
|
398
|
+
return m.avgRow(i);
|
|
399
|
+
},
|
|
400
|
+
min_row(id: unknown, index?: unknown): number | null {
|
|
401
|
+
const m = asMatrix(id);
|
|
402
|
+
const i = naNum(index);
|
|
403
|
+
if (m == null || i == null) return null;
|
|
404
|
+
return m.minRow(i);
|
|
405
|
+
},
|
|
406
|
+
max_row(id: unknown, index?: unknown): number | null {
|
|
407
|
+
const m = asMatrix(id);
|
|
408
|
+
const i = naNum(index);
|
|
409
|
+
if (m == null || i == null) return null;
|
|
410
|
+
return m.maxRow(i);
|
|
411
|
+
},
|
|
412
|
+
mode_row(id: unknown, index?: unknown): unknown {
|
|
413
|
+
const m = asMatrix(id);
|
|
414
|
+
const i = naNum(index);
|
|
415
|
+
if (m == null || i == null) return null;
|
|
416
|
+
return m.modeRow(i);
|
|
417
|
+
},
|
|
418
|
+
sum_col(id: unknown, index?: unknown): number | null {
|
|
419
|
+
const m = asMatrix(id);
|
|
420
|
+
const i = naNum(index);
|
|
421
|
+
if (m == null || i == null) return null;
|
|
422
|
+
return m.sumCol(i);
|
|
423
|
+
},
|
|
424
|
+
avg_col(id: unknown, index?: unknown): number | null {
|
|
425
|
+
const m = asMatrix(id);
|
|
426
|
+
const i = naNum(index);
|
|
427
|
+
if (m == null || i == null) return null;
|
|
428
|
+
return m.avgCol(i);
|
|
429
|
+
},
|
|
430
|
+
min_col(id: unknown, index?: unknown): number | null {
|
|
431
|
+
const m = asMatrix(id);
|
|
432
|
+
const i = naNum(index);
|
|
433
|
+
if (m == null || i == null) return null;
|
|
434
|
+
return m.minCol(i);
|
|
435
|
+
},
|
|
436
|
+
max_col(id: unknown, index?: unknown): number | null {
|
|
437
|
+
const m = asMatrix(id);
|
|
438
|
+
const i = naNum(index);
|
|
439
|
+
if (m == null || i == null) return null;
|
|
440
|
+
return m.maxCol(i);
|
|
441
|
+
},
|
|
442
|
+
mode_col(id: unknown, index?: unknown): unknown {
|
|
443
|
+
const m = asMatrix(id);
|
|
444
|
+
const i = naNum(index);
|
|
445
|
+
if (m == null || i == null) return null;
|
|
446
|
+
return m.modeCol(i);
|
|
447
|
+
},
|
|
448
|
+
copy_row(id: unknown, index?: unknown): PineArray | null {
|
|
449
|
+
const m = asMatrix(id);
|
|
450
|
+
const i = naNum(index);
|
|
451
|
+
if (m == null || i == null) return null;
|
|
452
|
+
return wrapCells(m.copyRow(i));
|
|
453
|
+
},
|
|
454
|
+
copy_col(id: unknown, index?: unknown): PineArray | null {
|
|
455
|
+
const m = asMatrix(id);
|
|
456
|
+
const i = naNum(index);
|
|
457
|
+
if (m == null || i == null) return null;
|
|
458
|
+
return wrapCells(m.copyCol(i));
|
|
459
|
+
},
|
|
460
|
+
fill_row(id: unknown, index?: unknown, value?: unknown): unknown {
|
|
461
|
+
const i = naNum(index);
|
|
462
|
+
if (i != null) asMatrix(id)?.fillRow(i, store(value));
|
|
463
|
+
return id ?? null;
|
|
464
|
+
},
|
|
465
|
+
fill_col(id: unknown, index?: unknown, value?: unknown): unknown {
|
|
466
|
+
const i = naNum(index);
|
|
467
|
+
if (i != null) asMatrix(id)?.fillCol(i, store(value));
|
|
468
|
+
return id ?? null;
|
|
469
|
+
},
|
|
470
|
+
fill_diagonal(id: unknown, value?: unknown): unknown {
|
|
471
|
+
asMatrix(id)?.fillDiagonal(store(value));
|
|
472
|
+
return id ?? null;
|
|
473
|
+
},
|
|
474
|
+
reverse_rows(id: unknown): unknown {
|
|
475
|
+
asMatrix(id)?.reverseRows();
|
|
476
|
+
return id ?? null;
|
|
477
|
+
},
|
|
478
|
+
reverse_cols(id: unknown): unknown {
|
|
479
|
+
asMatrix(id)?.reverseCols();
|
|
480
|
+
return id ?? null;
|
|
481
|
+
},
|
|
482
|
+
stdev(id: unknown): number | null {
|
|
483
|
+
return asMatrix(id)?.stdev() ?? null;
|
|
484
|
+
},
|
|
485
|
+
variance(id: unknown): number | null {
|
|
486
|
+
return asMatrix(id)?.variance() ?? null;
|
|
487
|
+
},
|
|
488
|
+
mode_all(id: unknown): unknown {
|
|
489
|
+
const m = asMatrix(id);
|
|
490
|
+
return m == null ? null : m.modeAll();
|
|
491
|
+
},
|
|
339
492
|
};
|