Skip to main content

runmat_runtime/builtins/table/
metadata.rs

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}