1use runmat_builtins::{
2 BuiltinCompletionPolicy, BuiltinDescriptor, BuiltinErrorDescriptor, BuiltinOutputMode,
3 BuiltinParamArity, BuiltinParamDescriptor, BuiltinParamType, BuiltinSignatureDescriptor,
4};
5
6use crate::builtins::common::spec::{
7 BroadcastSemantics, BuiltinFusionSpec, BuiltinGpuSpec, ConstantStrategy, GpuOpKind,
8 ReductionNaN, ResidencyPolicy, ShapeRequirements,
9};
10use crate::{build_runtime_error, RuntimeError};
11
12use super::TABLE_CLASS;
13
14const ANY_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
15 name: "out",
16 ty: BuiltinParamType::Any,
17 arity: BuiltinParamArity::Required,
18 default: None,
19 description: "Result value.",
20}];
21const NUM_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
22 name: "n",
23 ty: BuiltinParamType::IntegerScalar,
24 arity: BuiltinParamArity::Required,
25 default: None,
26 description: "Count.",
27}];
28const TABLE_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
29 name: "T",
30 ty: BuiltinParamType::Any,
31 arity: BuiltinParamArity::Required,
32 default: None,
33 description: "Table input.",
34}];
35const HEIGHT_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
36 name: "A",
37 ty: BuiltinParamType::Any,
38 arity: BuiltinParamArity::Required,
39 default: None,
40 description: "Table, timetable, or array input.",
41}];
42const HEAD_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
43 name: "A",
44 ty: BuiltinParamType::Any,
45 arity: BuiltinParamArity::Required,
46 default: None,
47 description: "Table, timetable, or array input.",
48}];
49const HEAD_INPUTS_COUNT: [BuiltinParamDescriptor; 2] = [
50 BuiltinParamDescriptor {
51 name: "A",
52 ty: BuiltinParamType::Any,
53 arity: BuiltinParamArity::Required,
54 default: None,
55 description: "Table, timetable, or array input.",
56 },
57 BuiltinParamDescriptor {
58 name: "n",
59 ty: BuiltinParamType::IntegerScalar,
60 arity: BuiltinParamArity::Required,
61 default: None,
62 description: "Positive number of leading rows to select.",
63 },
64];
65const READTABLE_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
66 name: "filename",
67 ty: BuiltinParamType::StringScalar,
68 arity: BuiltinParamArity::Required,
69 default: None,
70 description: "Text or spreadsheet file path.",
71}];
72const READTABLE_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
73 BuiltinParamDescriptor {
74 name: "filename",
75 ty: BuiltinParamType::StringScalar,
76 arity: BuiltinParamArity::Required,
77 default: None,
78 description: "Text or spreadsheet file path.",
79 },
80 BuiltinParamDescriptor {
81 name: "nameValuePairs",
82 ty: BuiltinParamType::Any,
83 arity: BuiltinParamArity::Variadic,
84 default: None,
85 description: "Name-value import options.",
86 },
87];
88const SPREADSHEET_IMPORT_OPTIONS_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
89 name: "opts",
90 ty: BuiltinParamType::Any,
91 arity: BuiltinParamArity::Required,
92 default: None,
93 description: "Spreadsheet import options struct.",
94}];
95const SPREADSHEET_IMPORT_OPTIONS_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 1] =
96 [BuiltinParamDescriptor {
97 name: "nameValuePairs",
98 ty: BuiltinParamType::Any,
99 arity: BuiltinParamArity::Variadic,
100 default: None,
101 description: "Name-value option pairs.",
102 }];
103const DETECT_IMPORT_OPTIONS_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
104 name: "opts",
105 ty: BuiltinParamType::Any,
106 arity: BuiltinParamArity::Required,
107 default: None,
108 description: "Detected import options struct accepted by readtable/readmatrix.",
109}];
110const DETECT_IMPORT_OPTIONS_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] =
111 [BuiltinParamDescriptor {
112 name: "filename",
113 ty: BuiltinParamType::StringScalar,
114 arity: BuiltinParamArity::Required,
115 default: None,
116 description: "Text or spreadsheet file path to inspect.",
117 }];
118const DETECT_IMPORT_OPTIONS_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
119 BuiltinParamDescriptor {
120 name: "filename",
121 ty: BuiltinParamType::StringScalar,
122 arity: BuiltinParamArity::Required,
123 default: None,
124 description: "Text or spreadsheet file path to inspect.",
125 },
126 BuiltinParamDescriptor {
127 name: "nameValuePairs",
128 ty: BuiltinParamType::Any,
129 arity: BuiltinParamArity::Variadic,
130 default: None,
131 description: "Detection overrides such as Delimiter, Range, Sheet, Encoding, or TextType.",
132 },
133];
134const PARQUETREAD_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
135 name: "filename",
136 ty: BuiltinParamType::StringScalar,
137 arity: BuiltinParamArity::Required,
138 default: None,
139 description: "Parquet file path.",
140}];
141const PARQUETREAD_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
142 BuiltinParamDescriptor {
143 name: "filename",
144 ty: BuiltinParamType::StringScalar,
145 arity: BuiltinParamArity::Required,
146 default: None,
147 description: "Parquet file path.",
148 },
149 BuiltinParamDescriptor {
150 name: "nameValuePairs",
151 ty: BuiltinParamType::Any,
152 arity: BuiltinParamArity::Variadic,
153 default: None,
154 description: "Options such as SelectedVariableNames, RowGroups, or OutputType.",
155 },
156];
157const PARQUETINFO_INPUTS: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
158 name: "filename",
159 ty: BuiltinParamType::StringScalar,
160 arity: BuiltinParamArity::Required,
161 default: None,
162 description: "Parquet file path to inspect.",
163}];
164const TABLE_INPUTS_VALUES: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
165 name: "variables",
166 ty: BuiltinParamType::Any,
167 arity: BuiltinParamArity::Variadic,
168 default: None,
169 description: "Variables to assemble as table columns.",
170}];
171const TABLE_INPUTS_PREALLOCATE: [BuiltinParamDescriptor; 4] = [
172 BuiltinParamDescriptor {
173 name: "Size",
174 ty: BuiltinParamType::SizeArg,
175 arity: BuiltinParamArity::Required,
176 default: None,
177 description: "Two-element table size vector [rows variables].",
178 },
179 BuiltinParamDescriptor {
180 name: "VariableTypes",
181 ty: BuiltinParamType::Any,
182 arity: BuiltinParamArity::Required,
183 default: None,
184 description: "String array or cellstr naming each preallocated variable type.",
185 },
186 BuiltinParamDescriptor {
187 name: "VariableNames",
188 ty: BuiltinParamType::Any,
189 arity: BuiltinParamArity::Optional,
190 default: None,
191 description: "Optional names for the preallocated variables.",
192 },
193 BuiltinParamDescriptor {
194 name: "RowNames",
195 ty: BuiltinParamType::Any,
196 arity: BuiltinParamArity::Optional,
197 default: None,
198 description: "Optional names for the preallocated rows.",
199 },
200];
201const GROUPSUMMARY_TABLE_INPUTS: [BuiltinParamDescriptor; 4] = [
202 BuiltinParamDescriptor {
203 name: "T",
204 ty: BuiltinParamType::Any,
205 arity: BuiltinParamArity::Required,
206 default: None,
207 description: "Input table.",
208 },
209 BuiltinParamDescriptor {
210 name: "groupvars",
211 ty: BuiltinParamType::Any,
212 arity: BuiltinParamArity::Required,
213 default: None,
214 description: "Grouping variable name or names.",
215 },
216 BuiltinParamDescriptor {
217 name: "method",
218 ty: BuiltinParamType::Any,
219 arity: BuiltinParamArity::Required,
220 default: None,
221 description: "Summary method name or names.",
222 },
223 BuiltinParamDescriptor {
224 name: "datavars",
225 ty: BuiltinParamType::Any,
226 arity: BuiltinParamArity::Optional,
227 default: None,
228 description: "Data variable name or names.",
229 },
230];
231const GROUPSUMMARY_TABLE_BIN_INPUTS: [BuiltinParamDescriptor; 5] = [
232 BuiltinParamDescriptor {
233 name: "T",
234 ty: BuiltinParamType::Any,
235 arity: BuiltinParamArity::Required,
236 default: None,
237 description: "Input table.",
238 },
239 BuiltinParamDescriptor {
240 name: "groupvars",
241 ty: BuiltinParamType::Any,
242 arity: BuiltinParamArity::Required,
243 default: None,
244 description: "Grouping variable name or names.",
245 },
246 BuiltinParamDescriptor {
247 name: "groupbins",
248 ty: BuiltinParamType::Any,
249 arity: BuiltinParamArity::Required,
250 default: None,
251 description: "Grouping bin specification.",
252 },
253 BuiltinParamDescriptor {
254 name: "method",
255 ty: BuiltinParamType::Any,
256 arity: BuiltinParamArity::Required,
257 default: None,
258 description: "Summary method name or names.",
259 },
260 BuiltinParamDescriptor {
261 name: "datavars",
262 ty: BuiltinParamType::Any,
263 arity: BuiltinParamArity::Optional,
264 default: None,
265 description: "Data variable name or names, optionally followed by name-value pairs.",
266 },
267];
268const GROUPSUMMARY_ARRAY_INPUTS: [BuiltinParamDescriptor; 3] = [
269 BuiltinParamDescriptor {
270 name: "A",
271 ty: BuiltinParamType::Any,
272 arity: BuiltinParamArity::Required,
273 default: None,
274 description: "Numeric array or cell array of numeric arrays.",
275 },
276 BuiltinParamDescriptor {
277 name: "groupvars",
278 ty: BuiltinParamType::Any,
279 arity: BuiltinParamArity::Required,
280 default: None,
281 description: "Grouping array or cell array of grouping arrays.",
282 },
283 BuiltinParamDescriptor {
284 name: "method",
285 ty: BuiltinParamType::Any,
286 arity: BuiltinParamArity::Required,
287 default: None,
288 description: "Summary method name or names.",
289 },
290];
291const GROUPSUMMARY_ARRAY_BIN_INPUTS: [BuiltinParamDescriptor; 5] = [
292 BuiltinParamDescriptor {
293 name: "A",
294 ty: BuiltinParamType::Any,
295 arity: BuiltinParamArity::Required,
296 default: None,
297 description: "Numeric array or cell array of numeric arrays.",
298 },
299 BuiltinParamDescriptor {
300 name: "groupvars",
301 ty: BuiltinParamType::Any,
302 arity: BuiltinParamArity::Required,
303 default: None,
304 description: "Grouping array or cell array of grouping arrays.",
305 },
306 BuiltinParamDescriptor {
307 name: "groupbins",
308 ty: BuiltinParamType::Any,
309 arity: BuiltinParamArity::Required,
310 default: None,
311 description: "Grouping bin specification.",
312 },
313 BuiltinParamDescriptor {
314 name: "method",
315 ty: BuiltinParamType::Any,
316 arity: BuiltinParamArity::Required,
317 default: None,
318 description: "Summary method name or names.",
319 },
320 BuiltinParamDescriptor {
321 name: "nameValuePairs",
322 ty: BuiltinParamType::Any,
323 arity: BuiltinParamArity::Variadic,
324 default: None,
325 description: "Grouping options such as IncludedEdge and IncludeEmptyGroups.",
326 },
327];
328const GROUPSUMMARY_ARRAY_OUTPUTS: [BuiltinParamDescriptor; 3] = [
329 BuiltinParamDescriptor {
330 name: "B",
331 ty: BuiltinParamType::Any,
332 arity: BuiltinParamArity::Required,
333 default: None,
334 description: "Summary values.",
335 },
336 BuiltinParamDescriptor {
337 name: "BG",
338 ty: BuiltinParamType::Any,
339 arity: BuiltinParamArity::Optional,
340 default: None,
341 description: "Grouping values.",
342 },
343 BuiltinParamDescriptor {
344 name: "BC",
345 ty: BuiltinParamType::NumericArray,
346 arity: BuiltinParamArity::Optional,
347 default: None,
348 description: "Group counts.",
349 },
350];
351const GRPSTATS_INPUTS: [BuiltinParamDescriptor; 4] = [
352 BuiltinParamDescriptor {
353 name: "X",
354 ty: BuiltinParamType::Any,
355 arity: BuiltinParamArity::Required,
356 default: None,
357 description: "Input matrix or table.",
358 },
359 BuiltinParamDescriptor {
360 name: "group",
361 ty: BuiltinParamType::Any,
362 arity: BuiltinParamArity::Required,
363 default: None,
364 description: "Grouping variables, variable selectors, or empty grouping.",
365 },
366 BuiltinParamDescriptor {
367 name: "whichstats",
368 ty: BuiltinParamType::Any,
369 arity: BuiltinParamArity::Optional,
370 default: Some("\"mean\""),
371 description: "Summary statistic name or names.",
372 },
373 BuiltinParamDescriptor {
374 name: "nameValuePairs",
375 ty: BuiltinParamType::Any,
376 arity: BuiltinParamArity::Variadic,
377 default: None,
378 description: "Alpha, DataVars, and VarNames options.",
379 },
380];
381const OBJECT_INDEX_INPUTS: [BuiltinParamDescriptor; 3] = [
382 BuiltinParamDescriptor {
383 name: "obj",
384 ty: BuiltinParamType::Any,
385 arity: BuiltinParamArity::Required,
386 default: None,
387 description: "Table object receiver.",
388 },
389 BuiltinParamDescriptor {
390 name: "kind",
391 ty: BuiltinParamType::StringScalar,
392 arity: BuiltinParamArity::Required,
393 default: None,
394 description: "Index kind token.",
395 },
396 BuiltinParamDescriptor {
397 name: "payload",
398 ty: BuiltinParamType::Any,
399 arity: BuiltinParamArity::Required,
400 default: None,
401 description: "Index payload.",
402 },
403];
404const OBJECT_ASSIGN_INPUTS: [BuiltinParamDescriptor; 4] = [
405 BuiltinParamDescriptor {
406 name: "obj",
407 ty: BuiltinParamType::Any,
408 arity: BuiltinParamArity::Required,
409 default: None,
410 description: "Table object receiver.",
411 },
412 BuiltinParamDescriptor {
413 name: "kind",
414 ty: BuiltinParamType::StringScalar,
415 arity: BuiltinParamArity::Required,
416 default: None,
417 description: "Index kind token.",
418 },
419 BuiltinParamDescriptor {
420 name: "payload",
421 ty: BuiltinParamType::Any,
422 arity: BuiltinParamArity::Required,
423 default: None,
424 description: "Index payload.",
425 },
426 BuiltinParamDescriptor {
427 name: "rhs",
428 ty: BuiltinParamType::Any,
429 arity: BuiltinParamArity::Required,
430 default: None,
431 description: "Assigned value.",
432 },
433];
434const VALUE_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
435 name: "A",
436 ty: BuiltinParamType::Any,
437 arity: BuiltinParamArity::Required,
438 default: None,
439 description: "Input value.",
440}];
441const VALUE_AND_ARGS_INPUTS: [BuiltinParamDescriptor; 2] = [
442 BuiltinParamDescriptor {
443 name: "A",
444 ty: BuiltinParamType::Any,
445 arity: BuiltinParamArity::Required,
446 default: None,
447 description: "Input value.",
448 },
449 BuiltinParamDescriptor {
450 name: "args",
451 ty: BuiltinParamType::Any,
452 arity: BuiltinParamArity::Variadic,
453 default: None,
454 description: "Name-value options or conversion arguments.",
455 },
456];
457const ARRAY2TABLE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
458 name: "T",
459 ty: BuiltinParamType::Any,
460 arity: BuiltinParamArity::Required,
461 default: None,
462 description: "Table whose variables are the columns of A.",
463}];
464const ARRAY2TABLE_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
465 name: "A",
466 ty: BuiltinParamType::Any,
467 arity: BuiltinParamArity::Required,
468 default: None,
469 description: "Homogeneous array to split into table variables by column.",
470}];
471const ARRAY2TABLE_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
472 BuiltinParamDescriptor {
473 name: "A",
474 ty: BuiltinParamType::Any,
475 arity: BuiltinParamArity::Required,
476 default: None,
477 description: "Homogeneous array to split into table variables by column.",
478 },
479 BuiltinParamDescriptor {
480 name: "nameValuePairs",
481 ty: BuiltinParamType::Any,
482 arity: BuiltinParamArity::Variadic,
483 default: None,
484 description: "VariableNames, RowNames, or DimensionNames options.",
485 },
486];
487const ARRAY2TIMETABLE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
488 name: "TT",
489 ty: BuiltinParamType::Any,
490 arity: BuiltinParamArity::Required,
491 default: None,
492 description: "Timetable whose variables are the columns of X.",
493}];
494const ARRAY2TIMETABLE_INPUTS_ROW_TIMES: [BuiltinParamDescriptor; 2] = [
495 BuiltinParamDescriptor {
496 name: "X",
497 ty: BuiltinParamType::Any,
498 arity: BuiltinParamArity::Required,
499 default: None,
500 description: "Homogeneous array to split into timetable variables by column.",
501 },
502 BuiltinParamDescriptor {
503 name: "rowTimes",
504 ty: BuiltinParamType::Any,
505 arity: BuiltinParamArity::Required,
506 default: None,
507 description: "Datetime or duration column vector labeling the rows.",
508 },
509];
510const ARRAY2TIMETABLE_INPUTS_SAMPLE_RATE: [BuiltinParamDescriptor; 2] = [
511 BuiltinParamDescriptor {
512 name: "X",
513 ty: BuiltinParamType::Any,
514 arity: BuiltinParamArity::Required,
515 default: None,
516 description: "Homogeneous array to split into timetable variables by column.",
517 },
518 BuiltinParamDescriptor {
519 name: "Fs",
520 ty: BuiltinParamType::NumericScalar,
521 arity: BuiltinParamArity::Required,
522 default: None,
523 description: "Positive sample rate in samples per second.",
524 },
525];
526const ARRAY2TIMETABLE_INPUTS_TIME_STEP: [BuiltinParamDescriptor; 2] = [
527 BuiltinParamDescriptor {
528 name: "X",
529 ty: BuiltinParamType::Any,
530 arity: BuiltinParamArity::Required,
531 default: None,
532 description: "Homogeneous array to split into timetable variables by column.",
533 },
534 BuiltinParamDescriptor {
535 name: "dt",
536 ty: BuiltinParamType::Any,
537 arity: BuiltinParamArity::Required,
538 default: None,
539 description: "Positive duration or calendarDuration scalar time step.",
540 },
541];
542const ARRAY2TIMETABLE_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
543 BuiltinParamDescriptor {
544 name: "X",
545 ty: BuiltinParamType::Any,
546 arity: BuiltinParamArity::Required,
547 default: None,
548 description: "Homogeneous array to split into timetable variables by column.",
549 },
550 BuiltinParamDescriptor {
551 name: "nameValuePairs",
552 ty: BuiltinParamType::Any,
553 arity: BuiltinParamArity::Variadic,
554 default: None,
555 description: "Timing, StartTime, VariableNames, or DimensionNames options.",
556 },
557];
558const ARRAY_DATASTORE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
559 name: "arrds",
560 ty: BuiltinParamType::Any,
561 arity: BuiltinParamArity::Required,
562 default: None,
563 description: "ArrayDatastore object retaining the in-memory data and read properties.",
564}];
565const ARRAY_DATASTORE_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
566 name: "A",
567 ty: BuiltinParamType::Any,
568 arity: BuiltinParamArity::Required,
569 default: None,
570 description: "In-memory array managed by the datastore.",
571}];
572const ARRAY_DATASTORE_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
573 BuiltinParamDescriptor {
574 name: "A",
575 ty: BuiltinParamType::Any,
576 arity: BuiltinParamArity::Required,
577 default: None,
578 description: "In-memory array managed by the datastore.",
579 },
580 BuiltinParamDescriptor {
581 name: "nameValuePairs",
582 ty: BuiltinParamType::Any,
583 arity: BuiltinParamArity::Variadic,
584 default: None,
585 description: "ReadSize, IterationDimension, or OutputType options.",
586 },
587];
588const VARIADIC_INPUTS: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
589 name: "args",
590 ty: BuiltinParamType::Any,
591 arity: BuiltinParamArity::Variadic,
592 default: None,
593 description: "Input values and name-value options.",
594}];
595const PREDICATE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
596 name: "TF",
597 ty: BuiltinParamType::LogicalArray,
598 arity: BuiltinParamArity::Required,
599 default: None,
600 description: "Predicate result.",
601}];
602const WRITE_NO_OUTPUT: [BuiltinParamDescriptor; 0] = [];
603
604const READTABLE_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
605 BuiltinSignatureDescriptor {
606 label: "T = readtable(filename)",
607 inputs: &READTABLE_INPUTS_FILENAME,
608 outputs: &ANY_OUTPUT,
609 },
610 BuiltinSignatureDescriptor {
611 label: "T = readtable(filename, nameValuePairs...)",
612 inputs: &READTABLE_INPUTS_NAME_VALUE,
613 outputs: &ANY_OUTPUT,
614 },
615];
616const SPREADSHEET_IMPORT_OPTIONS_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
617 BuiltinSignatureDescriptor {
618 label: "opts = spreadsheetImportOptions()",
619 inputs: &[],
620 outputs: &SPREADSHEET_IMPORT_OPTIONS_OUTPUT,
621 },
622 BuiltinSignatureDescriptor {
623 label: "opts = spreadsheetImportOptions(nameValuePairs...)",
624 inputs: &SPREADSHEET_IMPORT_OPTIONS_INPUTS_NAME_VALUE,
625 outputs: &SPREADSHEET_IMPORT_OPTIONS_OUTPUT,
626 },
627];
628const DETECT_IMPORT_OPTIONS_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
629 BuiltinSignatureDescriptor {
630 label: "opts = detectImportOptions(filename)",
631 inputs: &DETECT_IMPORT_OPTIONS_INPUTS_FILENAME,
632 outputs: &DETECT_IMPORT_OPTIONS_OUTPUT,
633 },
634 BuiltinSignatureDescriptor {
635 label: "opts = detectImportOptions(filename, nameValuePairs...)",
636 inputs: &DETECT_IMPORT_OPTIONS_INPUTS_NAME_VALUE,
637 outputs: &DETECT_IMPORT_OPTIONS_OUTPUT,
638 },
639];
640const DICTIONARY_KEYS_VALUES_INPUTS: [BuiltinParamDescriptor; 2] = [
641 BuiltinParamDescriptor {
642 name: "keys",
643 ty: BuiltinParamType::Any,
644 arity: BuiltinParamArity::Required,
645 default: None,
646 description: "Uniform or cell-wrapped dictionary keys.",
647 },
648 BuiltinParamDescriptor {
649 name: "values",
650 ty: BuiltinParamType::Any,
651 arity: BuiltinParamArity::Required,
652 default: None,
653 description: "Uniform, scalar-expanded, or cell-wrapped dictionary values.",
654 },
655];
656const DICTIONARY_PAIR_INPUTS: [BuiltinParamDescriptor; 2] = [
657 BuiltinParamDescriptor {
658 name: "keyValuePair1",
659 ty: BuiltinParamType::Any,
660 arity: BuiltinParamArity::Required,
661 default: None,
662 description: "First key/value argument pair.",
663 },
664 BuiltinParamDescriptor {
665 name: "keyValuePairN",
666 ty: BuiltinParamType::Any,
667 arity: BuiltinParamArity::Variadic,
668 default: None,
669 description: "Additional key/value argument pairs.",
670 },
671];
672const DICTIONARY_SIGNATURES: [BuiltinSignatureDescriptor; 3] = [
673 BuiltinSignatureDescriptor {
674 label: "d = dictionary()",
675 inputs: &[],
676 outputs: &ANY_OUTPUT,
677 },
678 BuiltinSignatureDescriptor {
679 label: "d = dictionary(keys, values)",
680 inputs: &DICTIONARY_KEYS_VALUES_INPUTS,
681 outputs: &ANY_OUTPUT,
682 },
683 BuiltinSignatureDescriptor {
684 label: "d = dictionary(k1, v1, ..., kN, vN)",
685 inputs: &DICTIONARY_PAIR_INPUTS,
686 outputs: &ANY_OUTPUT,
687 },
688];
689const PARQUETREAD_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
690 BuiltinSignatureDescriptor {
691 label: "T = parquetread(filename)",
692 inputs: &PARQUETREAD_INPUTS_FILENAME,
693 outputs: &ANY_OUTPUT,
694 },
695 BuiltinSignatureDescriptor {
696 label: "T = parquetread(filename, nameValuePairs...)",
697 inputs: &PARQUETREAD_INPUTS_NAME_VALUE,
698 outputs: &ANY_OUTPUT,
699 },
700];
701const PARQUETINFO_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
702 label: "info = parquetinfo(filename)",
703 inputs: &PARQUETINFO_INPUTS,
704 outputs: &ANY_OUTPUT,
705}];
706const TABLE_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
707 BuiltinSignatureDescriptor {
708 label: "T = table(variables...)",
709 inputs: &TABLE_INPUTS_VALUES,
710 outputs: &ANY_OUTPUT,
711 },
712 BuiltinSignatureDescriptor {
713 label: "T = table(Size=sz, VariableTypes=varTypes, Name=Value...)",
714 inputs: &TABLE_INPUTS_PREALLOCATE,
715 outputs: &ANY_OUTPUT,
716 },
717];
718const ARRAY2TABLE_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
719 BuiltinSignatureDescriptor {
720 label: "T = array2table(A)",
721 inputs: &ARRAY2TABLE_INPUT,
722 outputs: &ARRAY2TABLE_OUTPUT,
723 },
724 BuiltinSignatureDescriptor {
725 label: "T = array2table(A, nameValuePairs...)",
726 inputs: &ARRAY2TABLE_INPUTS_NAME_VALUE,
727 outputs: &ARRAY2TABLE_OUTPUT,
728 },
729];
730const ARRAY2TIMETABLE_SIGNATURES: [BuiltinSignatureDescriptor; 4] = [
731 BuiltinSignatureDescriptor {
732 label: "TT = array2timetable(X, \"RowTimes\", rowTimes)",
733 inputs: &ARRAY2TIMETABLE_INPUTS_ROW_TIMES,
734 outputs: &ARRAY2TIMETABLE_OUTPUT,
735 },
736 BuiltinSignatureDescriptor {
737 label: "TT = array2timetable(X, \"SampleRate\", Fs)",
738 inputs: &ARRAY2TIMETABLE_INPUTS_SAMPLE_RATE,
739 outputs: &ARRAY2TIMETABLE_OUTPUT,
740 },
741 BuiltinSignatureDescriptor {
742 label: "TT = array2timetable(X, \"TimeStep\", dt)",
743 inputs: &ARRAY2TIMETABLE_INPUTS_TIME_STEP,
744 outputs: &ARRAY2TIMETABLE_OUTPUT,
745 },
746 BuiltinSignatureDescriptor {
747 label: "TT = array2timetable(X, nameValuePairs...)",
748 inputs: &ARRAY2TIMETABLE_INPUTS_NAME_VALUE,
749 outputs: &ARRAY2TIMETABLE_OUTPUT,
750 },
751];
752const ARRAY_DATASTORE_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
753 BuiltinSignatureDescriptor {
754 label: "arrds = arrayDatastore(A)",
755 inputs: &ARRAY_DATASTORE_INPUT,
756 outputs: &ARRAY_DATASTORE_OUTPUT,
757 },
758 BuiltinSignatureDescriptor {
759 label: "arrds = arrayDatastore(A, nameValuePairs...)",
760 inputs: &ARRAY_DATASTORE_INPUTS_NAME_VALUE,
761 outputs: &ARRAY_DATASTORE_OUTPUT,
762 },
763];
764const GROUPSUMMARY_SIGNATURES: [BuiltinSignatureDescriptor; 4] = [
765 BuiltinSignatureDescriptor {
766 label: "G = groupsummary(T, groupvars, method, datavars)",
767 inputs: &GROUPSUMMARY_TABLE_INPUTS,
768 outputs: &ANY_OUTPUT,
769 },
770 BuiltinSignatureDescriptor {
771 label: "G = groupsummary(T, groupvars, groupbins, method, datavars)",
772 inputs: &GROUPSUMMARY_TABLE_BIN_INPUTS,
773 outputs: &ANY_OUTPUT,
774 },
775 BuiltinSignatureDescriptor {
776 label: "B = groupsummary(A, groupvars, method)",
777 inputs: &GROUPSUMMARY_ARRAY_INPUTS,
778 outputs: &GROUPSUMMARY_ARRAY_OUTPUTS,
779 },
780 BuiltinSignatureDescriptor {
781 label: "[B, BG, BC] = groupsummary(A, groupvars, groupbins, method)",
782 inputs: &GROUPSUMMARY_ARRAY_BIN_INPUTS,
783 outputs: &GROUPSUMMARY_ARRAY_OUTPUTS,
784 },
785];
786const GRPSTATS_SIGNATURES: [BuiltinSignatureDescriptor; 3] = [
787 BuiltinSignatureDescriptor {
788 label: "tblstats = grpstats(tbl, groupvars)",
789 inputs: &GRPSTATS_INPUTS,
790 outputs: &ANY_OUTPUT,
791 },
792 BuiltinSignatureDescriptor {
793 label: "stats = grpstats(X, group)",
794 inputs: &GRPSTATS_INPUTS,
795 outputs: &ANY_OUTPUT,
796 },
797 BuiltinSignatureDescriptor {
798 label: "[stats1, ..., statsN] = grpstats(X, group, whichstats)",
799 inputs: &GRPSTATS_INPUTS,
800 outputs: &ANY_OUTPUT,
801 },
802];
803const HEIGHT_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
804 label: "n = height(A)",
805 inputs: &HEIGHT_INPUT,
806 outputs: &NUM_OUTPUT,
807}];
808const HEAD_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
809 BuiltinSignatureDescriptor {
810 label: "B = head(A)",
811 inputs: &HEAD_INPUT,
812 outputs: &ANY_OUTPUT,
813 },
814 BuiltinSignatureDescriptor {
815 label: "B = head(A, n)",
816 inputs: &HEAD_INPUTS_COUNT,
817 outputs: &ANY_OUTPUT,
818 },
819];
820const WIDTH_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
821 label: "n = width(T)",
822 inputs: &TABLE_INPUT,
823 outputs: &NUM_OUTPUT,
824}];
825const COMPAT_VALUE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
826 label: "B = tabularBuiltin(A, ...)",
827 inputs: &VALUE_AND_ARGS_INPUTS,
828 outputs: &ANY_OUTPUT,
829}];
830const COMPAT_VARIADIC_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
831 label: "B = tabularBuiltin(args...)",
832 inputs: &VARIADIC_INPUTS,
833 outputs: &ANY_OUTPUT,
834}];
835const PREDICATE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
836 label: "TF = tabularPredicate(A)",
837 inputs: &VALUE_INPUT,
838 outputs: &PREDICATE_OUTPUT,
839}];
840const WRITE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
841 label: "writeTabular(T, filename, ...)",
842 inputs: &VALUE_AND_ARGS_INPUTS,
843 outputs: &WRITE_NO_OUTPUT,
844}];
845const OBJECT_SUBSREF_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
846 label: "out = table.subsref(obj, kind, payload)",
847 inputs: &OBJECT_INDEX_INPUTS,
848 outputs: &ANY_OUTPUT,
849}];
850const OBJECT_SUBSASGN_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
851 label: "obj = table.subsasgn(obj, kind, payload, rhs)",
852 inputs: &OBJECT_ASSIGN_INPUTS,
853 outputs: &ANY_OUTPUT,
854}];
855
856pub(super) const TABLE_ERROR_INVALID_ARGUMENT: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
857 code: "RM.TABLE.INVALID_ARGUMENT",
858 identifier: Some("RunMat:table:InvalidArgument"),
859 when: "Arguments or table metadata are invalid.",
860 message: "table: invalid argument",
861};
862pub(super) const TABLE_ERROR_INVALID_INDEX: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
863 code: "RM.TABLE.INVALID_INDEX",
864 identifier: Some("RunMat:table:InvalidIndex"),
865 when: "Table indexing is invalid.",
866 message: "table: invalid index",
867};
868pub(super) const TABLE_ERROR_INVALID_VARIABLE: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
869 code: "RM.TABLE.INVALID_VARIABLE",
870 identifier: Some("RunMat:table:InvalidVariable"),
871 when: "A table variable name or value is invalid.",
872 message: "table: invalid variable",
873};
874pub(super) const TABLE_ERROR_IO: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
875 code: "RM.READTABLE.IO",
876 identifier: Some("RunMat:readtable:IOError"),
877 when: "readtable cannot open or read the requested file.",
878 message: "readtable: file read failed",
879};
880pub(super) const TABLE_ERROR_UNSUPPORTED_FILE: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
881 code: "RM.READTABLE.UNSUPPORTED_FILE",
882 identifier: Some("RunMat:readtable:UnsupportedFileType"),
883 when: "readtable receives a file type outside the text or spreadsheet import backends.",
884 message: "readtable: unsupported file type",
885};
886const TABLE_ERRORS: [BuiltinErrorDescriptor; 5] = [
887 TABLE_ERROR_INVALID_ARGUMENT,
888 TABLE_ERROR_INVALID_INDEX,
889 TABLE_ERROR_INVALID_VARIABLE,
890 TABLE_ERROR_IO,
891 TABLE_ERROR_UNSUPPORTED_FILE,
892];
893
894pub const READTABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
895 signatures: &READTABLE_SIGNATURES,
896 output_mode: BuiltinOutputMode::Fixed,
897 completion_policy: BuiltinCompletionPolicy::Public,
898 errors: &TABLE_ERRORS,
899};
900pub const SPREADSHEET_IMPORT_OPTIONS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
901 signatures: &SPREADSHEET_IMPORT_OPTIONS_SIGNATURES,
902 output_mode: BuiltinOutputMode::Fixed,
903 completion_policy: BuiltinCompletionPolicy::Public,
904 errors: &TABLE_ERRORS,
905};
906pub const DETECT_IMPORT_OPTIONS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
907 signatures: &DETECT_IMPORT_OPTIONS_SIGNATURES,
908 output_mode: BuiltinOutputMode::Fixed,
909 completion_policy: BuiltinCompletionPolicy::Public,
910 errors: &TABLE_ERRORS,
911};
912pub const DICTIONARY_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
913 signatures: &DICTIONARY_SIGNATURES,
914 output_mode: BuiltinOutputMode::Fixed,
915 completion_policy: BuiltinCompletionPolicy::Public,
916 errors: &TABLE_ERRORS,
917};
918pub const PARQUETREAD_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
919 signatures: &PARQUETREAD_SIGNATURES,
920 output_mode: BuiltinOutputMode::Fixed,
921 completion_policy: BuiltinCompletionPolicy::Public,
922 errors: &TABLE_ERRORS,
923};
924pub const PARQUETINFO_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
925 signatures: &PARQUETINFO_SIGNATURES,
926 output_mode: BuiltinOutputMode::Fixed,
927 completion_policy: BuiltinCompletionPolicy::Public,
928 errors: &TABLE_ERRORS,
929};
930pub const TABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
931 signatures: &TABLE_SIGNATURES,
932 output_mode: BuiltinOutputMode::Fixed,
933 completion_policy: BuiltinCompletionPolicy::Public,
934 errors: &TABLE_ERRORS,
935};
936pub const ARRAY2TABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
937 signatures: &ARRAY2TABLE_SIGNATURES,
938 output_mode: BuiltinOutputMode::Fixed,
939 completion_policy: BuiltinCompletionPolicy::Public,
940 errors: &TABLE_ERRORS,
941};
942pub const ARRAY2TIMETABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
943 signatures: &ARRAY2TIMETABLE_SIGNATURES,
944 output_mode: BuiltinOutputMode::Fixed,
945 completion_policy: BuiltinCompletionPolicy::Public,
946 errors: &TABLE_ERRORS,
947};
948pub const ARRAY_DATASTORE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
949 signatures: &ARRAY_DATASTORE_SIGNATURES,
950 output_mode: BuiltinOutputMode::Fixed,
951 completion_policy: BuiltinCompletionPolicy::Public,
952 errors: &TABLE_ERRORS,
953};
954pub const GROUPSUMMARY_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
955 signatures: &GROUPSUMMARY_SIGNATURES,
956 output_mode: BuiltinOutputMode::ByRequestedOutputCount,
957 completion_policy: BuiltinCompletionPolicy::Public,
958 errors: &TABLE_ERRORS,
959};
960pub const GRPSTATS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
961 signatures: &GRPSTATS_SIGNATURES,
962 output_mode: BuiltinOutputMode::ByRequestedOutputCount,
963 completion_policy: BuiltinCompletionPolicy::Public,
964 errors: &TABLE_ERRORS,
965};
966pub const HEIGHT_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
967 signatures: &HEIGHT_SIGNATURES,
968 output_mode: BuiltinOutputMode::Fixed,
969 completion_policy: BuiltinCompletionPolicy::Public,
970 errors: &TABLE_ERRORS,
971};
972pub const HEAD_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
973 signatures: &HEAD_SIGNATURES,
974 output_mode: BuiltinOutputMode::Fixed,
975 completion_policy: BuiltinCompletionPolicy::Public,
976 errors: &TABLE_ERRORS,
977};
978pub const WIDTH_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
979 signatures: &WIDTH_SIGNATURES,
980 output_mode: BuiltinOutputMode::Fixed,
981 completion_policy: BuiltinCompletionPolicy::Public,
982 errors: &TABLE_ERRORS,
983};
984pub const TABLE_COMPAT_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
985 signatures: &COMPAT_VALUE_SIGNATURES,
986 output_mode: BuiltinOutputMode::Fixed,
987 completion_policy: BuiltinCompletionPolicy::Public,
988 errors: &TABLE_ERRORS,
989};
990pub const TABLE_VARIADIC_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
991 signatures: &COMPAT_VARIADIC_SIGNATURES,
992 output_mode: BuiltinOutputMode::Fixed,
993 completion_policy: BuiltinCompletionPolicy::Public,
994 errors: &TABLE_ERRORS,
995};
996pub const TABLE_PREDICATE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
997 signatures: &PREDICATE_SIGNATURES,
998 output_mode: BuiltinOutputMode::Fixed,
999 completion_policy: BuiltinCompletionPolicy::Public,
1000 errors: &TABLE_ERRORS,
1001};
1002pub const TABLE_WRITE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
1003 signatures: &WRITE_SIGNATURES,
1004 output_mode: BuiltinOutputMode::Fixed,
1005 completion_policy: BuiltinCompletionPolicy::Public,
1006 errors: &TABLE_ERRORS,
1007};
1008pub const TABLE_SUBSREF_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
1009 signatures: &OBJECT_SUBSREF_SIGNATURES,
1010 output_mode: BuiltinOutputMode::Fixed,
1011 completion_policy: BuiltinCompletionPolicy::MethodOnly,
1012 errors: &TABLE_ERRORS,
1013};
1014pub const TABLE_SUBSASGN_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
1015 signatures: &OBJECT_SUBSASGN_SIGNATURES,
1016 output_mode: BuiltinOutputMode::Fixed,
1017 completion_policy: BuiltinCompletionPolicy::MethodOnly,
1018 errors: &TABLE_ERRORS,
1019};
1020
1021#[runmat_macros::register_gpu_spec(builtin_path = "crate::builtins::table")]
1022pub const GPU_SPEC: BuiltinGpuSpec = BuiltinGpuSpec {
1023 name: "table",
1024 op_kind: GpuOpKind::Custom("table"),
1025 supported_precisions: &[],
1026 broadcast: BroadcastSemantics::None,
1027 provider_hooks: &[],
1028 constant_strategy: ConstantStrategy::InlineLiteral,
1029 residency: ResidencyPolicy::GatherImmediately,
1030 nan_mode: ReductionNaN::Include,
1031 two_pass_threshold: None,
1032 workgroup_size: None,
1033 accepts_nan_mode: false,
1034 notes: "Tables are host containers. GPU variables are gathered when tabular algorithms need row-wise access.",
1035};
1036
1037#[runmat_macros::register_fusion_spec(builtin_path = "crate::builtins::table")]
1038pub const FUSION_SPEC: BuiltinFusionSpec = BuiltinFusionSpec {
1039 name: "table",
1040 shape: ShapeRequirements::Any,
1041 constant_strategy: ConstantStrategy::InlineLiteral,
1042 elementwise: None,
1043 reduction: None,
1044 emits_nan: false,
1045 notes: "Tables are structured host containers and are not fusion operands.",
1046};
1047
1048pub(super) fn table_error(
1049 error: &'static BuiltinErrorDescriptor,
1050 message: impl Into<String>,
1051) -> RuntimeError {
1052 let mut builder = build_runtime_error(message).with_builtin(TABLE_CLASS);
1053 if let Some(identifier) = error.identifier {
1054 builder = builder.with_identifier(identifier);
1055 }
1056 builder.build()
1057}
1058
1059pub(super) fn table_error_with_source<E>(
1060 error: &'static BuiltinErrorDescriptor,
1061 message: impl Into<String>,
1062 source: E,
1063) -> RuntimeError
1064where
1065 E: std::error::Error + Send + Sync + 'static,
1066{
1067 let mut builder = build_runtime_error(message)
1068 .with_builtin(TABLE_CLASS)
1069 .with_source(source);
1070 if let Some(identifier) = error.identifier {
1071 builder = builder.with_identifier(identifier);
1072 }
1073 builder.build()
1074}
1075
1076pub(super) fn invalid_argument(message: impl Into<String>) -> RuntimeError {
1077 table_error(&TABLE_ERROR_INVALID_ARGUMENT, message)
1078}
1079
1080pub(super) fn invalid_index(message: impl Into<String>) -> RuntimeError {
1081 table_error(&TABLE_ERROR_INVALID_INDEX, message)
1082}
1083
1084pub(super) fn invalid_variable(message: impl Into<String>) -> RuntimeError {
1085 table_error(&TABLE_ERROR_INVALID_VARIABLE, message)
1086}
1087
1088pub(super) fn map_control_flow(err: RuntimeError) -> RuntimeError {
1089 let identifier = err.identifier().map(ToString::to_string);
1090 let message = err.message().to_string();
1091 let mut builder = build_runtime_error(message)
1092 .with_builtin(TABLE_CLASS)
1093 .with_source(err);
1094 if let Some(identifier) = identifier {
1095 builder = builder.with_identifier(identifier);
1096 }
1097 builder.build()
1098}