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 READTABLE_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
36    name: "filename",
37    ty: BuiltinParamType::StringScalar,
38    arity: BuiltinParamArity::Required,
39    default: None,
40    description: "Text or spreadsheet file path.",
41}];
42const READTABLE_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
43    BuiltinParamDescriptor {
44        name: "filename",
45        ty: BuiltinParamType::StringScalar,
46        arity: BuiltinParamArity::Required,
47        default: None,
48        description: "Text or spreadsheet file path.",
49    },
50    BuiltinParamDescriptor {
51        name: "nameValuePairs",
52        ty: BuiltinParamType::Any,
53        arity: BuiltinParamArity::Variadic,
54        default: None,
55        description: "Name-value import options.",
56    },
57];
58const SPREADSHEET_IMPORT_OPTIONS_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
59    name: "opts",
60    ty: BuiltinParamType::Any,
61    arity: BuiltinParamArity::Required,
62    default: None,
63    description: "Spreadsheet import options struct.",
64}];
65const SPREADSHEET_IMPORT_OPTIONS_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 1] =
66    [BuiltinParamDescriptor {
67        name: "nameValuePairs",
68        ty: BuiltinParamType::Any,
69        arity: BuiltinParamArity::Variadic,
70        default: None,
71        description: "Name-value option pairs.",
72    }];
73const DETECT_IMPORT_OPTIONS_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
74    name: "opts",
75    ty: BuiltinParamType::Any,
76    arity: BuiltinParamArity::Required,
77    default: None,
78    description: "Detected import options struct accepted by readtable/readmatrix.",
79}];
80const DETECT_IMPORT_OPTIONS_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] =
81    [BuiltinParamDescriptor {
82        name: "filename",
83        ty: BuiltinParamType::StringScalar,
84        arity: BuiltinParamArity::Required,
85        default: None,
86        description: "Text or spreadsheet file path to inspect.",
87    }];
88const DETECT_IMPORT_OPTIONS_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
89    BuiltinParamDescriptor {
90        name: "filename",
91        ty: BuiltinParamType::StringScalar,
92        arity: BuiltinParamArity::Required,
93        default: None,
94        description: "Text or spreadsheet file path to inspect.",
95    },
96    BuiltinParamDescriptor {
97        name: "nameValuePairs",
98        ty: BuiltinParamType::Any,
99        arity: BuiltinParamArity::Variadic,
100        default: None,
101        description: "Detection overrides such as Delimiter, Range, Sheet, Encoding, or TextType.",
102    },
103];
104const PARQUETREAD_INPUTS_FILENAME: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
105    name: "filename",
106    ty: BuiltinParamType::StringScalar,
107    arity: BuiltinParamArity::Required,
108    default: None,
109    description: "Parquet file path.",
110}];
111const PARQUETREAD_INPUTS_NAME_VALUE: [BuiltinParamDescriptor; 2] = [
112    BuiltinParamDescriptor {
113        name: "filename",
114        ty: BuiltinParamType::StringScalar,
115        arity: BuiltinParamArity::Required,
116        default: None,
117        description: "Parquet file path.",
118    },
119    BuiltinParamDescriptor {
120        name: "nameValuePairs",
121        ty: BuiltinParamType::Any,
122        arity: BuiltinParamArity::Variadic,
123        default: None,
124        description: "Options such as SelectedVariableNames, RowGroups, or OutputType.",
125    },
126];
127const PARQUETINFO_INPUTS: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
128    name: "filename",
129    ty: BuiltinParamType::StringScalar,
130    arity: BuiltinParamArity::Required,
131    default: None,
132    description: "Parquet file path to inspect.",
133}];
134const TABLE_INPUTS_VALUES: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
135    name: "variables",
136    ty: BuiltinParamType::Any,
137    arity: BuiltinParamArity::Variadic,
138    default: None,
139    description: "Variables to assemble as table columns.",
140}];
141const GROUPSUMMARY_INPUTS: [BuiltinParamDescriptor; 4] = [
142    BuiltinParamDescriptor {
143        name: "T",
144        ty: BuiltinParamType::Any,
145        arity: BuiltinParamArity::Required,
146        default: None,
147        description: "Input table.",
148    },
149    BuiltinParamDescriptor {
150        name: "groupvars",
151        ty: BuiltinParamType::Any,
152        arity: BuiltinParamArity::Required,
153        default: None,
154        description: "Grouping variable name or names.",
155    },
156    BuiltinParamDescriptor {
157        name: "method",
158        ty: BuiltinParamType::Any,
159        arity: BuiltinParamArity::Required,
160        default: None,
161        description: "Summary method name or names.",
162    },
163    BuiltinParamDescriptor {
164        name: "datavars",
165        ty: BuiltinParamType::Any,
166        arity: BuiltinParamArity::Optional,
167        default: None,
168        description: "Data variable name or names.",
169    },
170];
171const GRPSTATS_INPUTS: [BuiltinParamDescriptor; 4] = [
172    BuiltinParamDescriptor {
173        name: "X",
174        ty: BuiltinParamType::Any,
175        arity: BuiltinParamArity::Required,
176        default: None,
177        description: "Input matrix or table.",
178    },
179    BuiltinParamDescriptor {
180        name: "group",
181        ty: BuiltinParamType::Any,
182        arity: BuiltinParamArity::Required,
183        default: None,
184        description: "Grouping variables, variable selectors, or empty grouping.",
185    },
186    BuiltinParamDescriptor {
187        name: "whichstats",
188        ty: BuiltinParamType::Any,
189        arity: BuiltinParamArity::Optional,
190        default: Some("\"mean\""),
191        description: "Summary statistic name or names.",
192    },
193    BuiltinParamDescriptor {
194        name: "nameValuePairs",
195        ty: BuiltinParamType::Any,
196        arity: BuiltinParamArity::Variadic,
197        default: None,
198        description: "Alpha, DataVars, and VarNames options.",
199    },
200];
201const OBJECT_INDEX_INPUTS: [BuiltinParamDescriptor; 3] = [
202    BuiltinParamDescriptor {
203        name: "obj",
204        ty: BuiltinParamType::Any,
205        arity: BuiltinParamArity::Required,
206        default: None,
207        description: "Table object receiver.",
208    },
209    BuiltinParamDescriptor {
210        name: "kind",
211        ty: BuiltinParamType::StringScalar,
212        arity: BuiltinParamArity::Required,
213        default: None,
214        description: "Index kind token.",
215    },
216    BuiltinParamDescriptor {
217        name: "payload",
218        ty: BuiltinParamType::Any,
219        arity: BuiltinParamArity::Required,
220        default: None,
221        description: "Index payload.",
222    },
223];
224const OBJECT_ASSIGN_INPUTS: [BuiltinParamDescriptor; 4] = [
225    BuiltinParamDescriptor {
226        name: "obj",
227        ty: BuiltinParamType::Any,
228        arity: BuiltinParamArity::Required,
229        default: None,
230        description: "Table object receiver.",
231    },
232    BuiltinParamDescriptor {
233        name: "kind",
234        ty: BuiltinParamType::StringScalar,
235        arity: BuiltinParamArity::Required,
236        default: None,
237        description: "Index kind token.",
238    },
239    BuiltinParamDescriptor {
240        name: "payload",
241        ty: BuiltinParamType::Any,
242        arity: BuiltinParamArity::Required,
243        default: None,
244        description: "Index payload.",
245    },
246    BuiltinParamDescriptor {
247        name: "rhs",
248        ty: BuiltinParamType::Any,
249        arity: BuiltinParamArity::Required,
250        default: None,
251        description: "Assigned value.",
252    },
253];
254const VALUE_INPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
255    name: "A",
256    ty: BuiltinParamType::Any,
257    arity: BuiltinParamArity::Required,
258    default: None,
259    description: "Input value.",
260}];
261const VALUE_AND_ARGS_INPUTS: [BuiltinParamDescriptor; 2] = [
262    BuiltinParamDescriptor {
263        name: "A",
264        ty: BuiltinParamType::Any,
265        arity: BuiltinParamArity::Required,
266        default: None,
267        description: "Input value.",
268    },
269    BuiltinParamDescriptor {
270        name: "args",
271        ty: BuiltinParamType::Any,
272        arity: BuiltinParamArity::Variadic,
273        default: None,
274        description: "Name-value options or conversion arguments.",
275    },
276];
277const VARIADIC_INPUTS: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
278    name: "args",
279    ty: BuiltinParamType::Any,
280    arity: BuiltinParamArity::Variadic,
281    default: None,
282    description: "Input values and name-value options.",
283}];
284const PREDICATE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
285    name: "TF",
286    ty: BuiltinParamType::LogicalArray,
287    arity: BuiltinParamArity::Required,
288    default: None,
289    description: "Predicate result.",
290}];
291const WRITE_OUTPUT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
292    name: "bytesWritten",
293    ty: BuiltinParamType::NumericScalar,
294    arity: BuiltinParamArity::Required,
295    default: None,
296    description: "Number of bytes written.",
297}];
298
299const READTABLE_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
300    BuiltinSignatureDescriptor {
301        label: "T = readtable(filename)",
302        inputs: &READTABLE_INPUTS_FILENAME,
303        outputs: &ANY_OUTPUT,
304    },
305    BuiltinSignatureDescriptor {
306        label: "T = readtable(filename, nameValuePairs...)",
307        inputs: &READTABLE_INPUTS_NAME_VALUE,
308        outputs: &ANY_OUTPUT,
309    },
310];
311const SPREADSHEET_IMPORT_OPTIONS_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
312    BuiltinSignatureDescriptor {
313        label: "opts = spreadsheetImportOptions()",
314        inputs: &[],
315        outputs: &SPREADSHEET_IMPORT_OPTIONS_OUTPUT,
316    },
317    BuiltinSignatureDescriptor {
318        label: "opts = spreadsheetImportOptions(nameValuePairs...)",
319        inputs: &SPREADSHEET_IMPORT_OPTIONS_INPUTS_NAME_VALUE,
320        outputs: &SPREADSHEET_IMPORT_OPTIONS_OUTPUT,
321    },
322];
323const DETECT_IMPORT_OPTIONS_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
324    BuiltinSignatureDescriptor {
325        label: "opts = detectImportOptions(filename)",
326        inputs: &DETECT_IMPORT_OPTIONS_INPUTS_FILENAME,
327        outputs: &DETECT_IMPORT_OPTIONS_OUTPUT,
328    },
329    BuiltinSignatureDescriptor {
330        label: "opts = detectImportOptions(filename, nameValuePairs...)",
331        inputs: &DETECT_IMPORT_OPTIONS_INPUTS_NAME_VALUE,
332        outputs: &DETECT_IMPORT_OPTIONS_OUTPUT,
333    },
334];
335const PARQUETREAD_SIGNATURES: [BuiltinSignatureDescriptor; 2] = [
336    BuiltinSignatureDescriptor {
337        label: "T = parquetread(filename)",
338        inputs: &PARQUETREAD_INPUTS_FILENAME,
339        outputs: &ANY_OUTPUT,
340    },
341    BuiltinSignatureDescriptor {
342        label: "T = parquetread(filename, nameValuePairs...)",
343        inputs: &PARQUETREAD_INPUTS_NAME_VALUE,
344        outputs: &ANY_OUTPUT,
345    },
346];
347const PARQUETINFO_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
348    label: "info = parquetinfo(filename)",
349    inputs: &PARQUETINFO_INPUTS,
350    outputs: &ANY_OUTPUT,
351}];
352const TABLE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
353    label: "T = table(variables...)",
354    inputs: &TABLE_INPUTS_VALUES,
355    outputs: &ANY_OUTPUT,
356}];
357const GROUPSUMMARY_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
358    label: "G = groupsummary(T, groupvars, method, datavars)",
359    inputs: &GROUPSUMMARY_INPUTS,
360    outputs: &ANY_OUTPUT,
361}];
362const GRPSTATS_SIGNATURES: [BuiltinSignatureDescriptor; 3] = [
363    BuiltinSignatureDescriptor {
364        label: "tblstats = grpstats(tbl, groupvars)",
365        inputs: &GRPSTATS_INPUTS,
366        outputs: &ANY_OUTPUT,
367    },
368    BuiltinSignatureDescriptor {
369        label: "stats = grpstats(X, group)",
370        inputs: &GRPSTATS_INPUTS,
371        outputs: &ANY_OUTPUT,
372    },
373    BuiltinSignatureDescriptor {
374        label: "[stats1, ..., statsN] = grpstats(X, group, whichstats)",
375        inputs: &GRPSTATS_INPUTS,
376        outputs: &ANY_OUTPUT,
377    },
378];
379const HEIGHT_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
380    label: "n = height(T)",
381    inputs: &TABLE_INPUT,
382    outputs: &NUM_OUTPUT,
383}];
384const WIDTH_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
385    label: "n = width(T)",
386    inputs: &TABLE_INPUT,
387    outputs: &NUM_OUTPUT,
388}];
389const COMPAT_VALUE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
390    label: "B = tabularBuiltin(A, ...)",
391    inputs: &VALUE_AND_ARGS_INPUTS,
392    outputs: &ANY_OUTPUT,
393}];
394const COMPAT_VARIADIC_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
395    label: "B = tabularBuiltin(args...)",
396    inputs: &VARIADIC_INPUTS,
397    outputs: &ANY_OUTPUT,
398}];
399const PREDICATE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
400    label: "TF = tabularPredicate(A)",
401    inputs: &VALUE_INPUT,
402    outputs: &PREDICATE_OUTPUT,
403}];
404const WRITE_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
405    label: "bytesWritten = writeTabular(T, filename, ...)",
406    inputs: &VALUE_AND_ARGS_INPUTS,
407    outputs: &WRITE_OUTPUT,
408}];
409const OBJECT_SUBSREF_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
410    label: "out = table.subsref(obj, kind, payload)",
411    inputs: &OBJECT_INDEX_INPUTS,
412    outputs: &ANY_OUTPUT,
413}];
414const OBJECT_SUBSASGN_SIGNATURES: [BuiltinSignatureDescriptor; 1] = [BuiltinSignatureDescriptor {
415    label: "obj = table.subsasgn(obj, kind, payload, rhs)",
416    inputs: &OBJECT_ASSIGN_INPUTS,
417    outputs: &ANY_OUTPUT,
418}];
419
420pub(super) const TABLE_ERROR_INVALID_ARGUMENT: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
421    code: "RM.TABLE.INVALID_ARGUMENT",
422    identifier: Some("RunMat:table:InvalidArgument"),
423    when: "Arguments or table metadata are invalid.",
424    message: "table: invalid argument",
425};
426pub(super) const TABLE_ERROR_INVALID_INDEX: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
427    code: "RM.TABLE.INVALID_INDEX",
428    identifier: Some("RunMat:table:InvalidIndex"),
429    when: "Table indexing is invalid.",
430    message: "table: invalid index",
431};
432pub(super) const TABLE_ERROR_INVALID_VARIABLE: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
433    code: "RM.TABLE.INVALID_VARIABLE",
434    identifier: Some("RunMat:table:InvalidVariable"),
435    when: "A table variable name or value is invalid.",
436    message: "table: invalid variable",
437};
438pub(super) const TABLE_ERROR_IO: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
439    code: "RM.READTABLE.IO",
440    identifier: Some("RunMat:readtable:IOError"),
441    when: "readtable cannot open or read the requested file.",
442    message: "readtable: file read failed",
443};
444pub(super) const TABLE_ERROR_UNSUPPORTED_FILE: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
445    code: "RM.READTABLE.UNSUPPORTED_FILE",
446    identifier: Some("RunMat:readtable:UnsupportedFileType"),
447    when: "readtable receives a file type outside the text or spreadsheet import backends.",
448    message: "readtable: unsupported file type",
449};
450const TABLE_ERRORS: [BuiltinErrorDescriptor; 5] = [
451    TABLE_ERROR_INVALID_ARGUMENT,
452    TABLE_ERROR_INVALID_INDEX,
453    TABLE_ERROR_INVALID_VARIABLE,
454    TABLE_ERROR_IO,
455    TABLE_ERROR_UNSUPPORTED_FILE,
456];
457
458pub const READTABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
459    signatures: &READTABLE_SIGNATURES,
460    output_mode: BuiltinOutputMode::Fixed,
461    completion_policy: BuiltinCompletionPolicy::Public,
462    errors: &TABLE_ERRORS,
463};
464pub const SPREADSHEET_IMPORT_OPTIONS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
465    signatures: &SPREADSHEET_IMPORT_OPTIONS_SIGNATURES,
466    output_mode: BuiltinOutputMode::Fixed,
467    completion_policy: BuiltinCompletionPolicy::Public,
468    errors: &TABLE_ERRORS,
469};
470pub const DETECT_IMPORT_OPTIONS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
471    signatures: &DETECT_IMPORT_OPTIONS_SIGNATURES,
472    output_mode: BuiltinOutputMode::Fixed,
473    completion_policy: BuiltinCompletionPolicy::Public,
474    errors: &TABLE_ERRORS,
475};
476pub const PARQUETREAD_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
477    signatures: &PARQUETREAD_SIGNATURES,
478    output_mode: BuiltinOutputMode::Fixed,
479    completion_policy: BuiltinCompletionPolicy::Public,
480    errors: &TABLE_ERRORS,
481};
482pub const PARQUETINFO_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
483    signatures: &PARQUETINFO_SIGNATURES,
484    output_mode: BuiltinOutputMode::Fixed,
485    completion_policy: BuiltinCompletionPolicy::Public,
486    errors: &TABLE_ERRORS,
487};
488pub const TABLE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
489    signatures: &TABLE_SIGNATURES,
490    output_mode: BuiltinOutputMode::Fixed,
491    completion_policy: BuiltinCompletionPolicy::Public,
492    errors: &TABLE_ERRORS,
493};
494pub const GROUPSUMMARY_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
495    signatures: &GROUPSUMMARY_SIGNATURES,
496    output_mode: BuiltinOutputMode::Fixed,
497    completion_policy: BuiltinCompletionPolicy::Public,
498    errors: &TABLE_ERRORS,
499};
500pub const GRPSTATS_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
501    signatures: &GRPSTATS_SIGNATURES,
502    output_mode: BuiltinOutputMode::ByRequestedOutputCount,
503    completion_policy: BuiltinCompletionPolicy::Public,
504    errors: &TABLE_ERRORS,
505};
506pub const HEIGHT_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
507    signatures: &HEIGHT_SIGNATURES,
508    output_mode: BuiltinOutputMode::Fixed,
509    completion_policy: BuiltinCompletionPolicy::Public,
510    errors: &TABLE_ERRORS,
511};
512pub const WIDTH_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
513    signatures: &WIDTH_SIGNATURES,
514    output_mode: BuiltinOutputMode::Fixed,
515    completion_policy: BuiltinCompletionPolicy::Public,
516    errors: &TABLE_ERRORS,
517};
518pub const TABLE_COMPAT_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
519    signatures: &COMPAT_VALUE_SIGNATURES,
520    output_mode: BuiltinOutputMode::Fixed,
521    completion_policy: BuiltinCompletionPolicy::Public,
522    errors: &TABLE_ERRORS,
523};
524pub const TABLE_VARIADIC_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
525    signatures: &COMPAT_VARIADIC_SIGNATURES,
526    output_mode: BuiltinOutputMode::Fixed,
527    completion_policy: BuiltinCompletionPolicy::Public,
528    errors: &TABLE_ERRORS,
529};
530pub const TABLE_PREDICATE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
531    signatures: &PREDICATE_SIGNATURES,
532    output_mode: BuiltinOutputMode::Fixed,
533    completion_policy: BuiltinCompletionPolicy::Public,
534    errors: &TABLE_ERRORS,
535};
536pub const TABLE_WRITE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
537    signatures: &WRITE_SIGNATURES,
538    output_mode: BuiltinOutputMode::Fixed,
539    completion_policy: BuiltinCompletionPolicy::Public,
540    errors: &TABLE_ERRORS,
541};
542pub const TABLE_SUBSREF_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
543    signatures: &OBJECT_SUBSREF_SIGNATURES,
544    output_mode: BuiltinOutputMode::Fixed,
545    completion_policy: BuiltinCompletionPolicy::MethodOnly,
546    errors: &TABLE_ERRORS,
547};
548pub const TABLE_SUBSASGN_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
549    signatures: &OBJECT_SUBSASGN_SIGNATURES,
550    output_mode: BuiltinOutputMode::Fixed,
551    completion_policy: BuiltinCompletionPolicy::MethodOnly,
552    errors: &TABLE_ERRORS,
553};
554
555#[runmat_macros::register_gpu_spec(builtin_path = "crate::builtins::table")]
556pub const GPU_SPEC: BuiltinGpuSpec = BuiltinGpuSpec {
557    name: "table",
558    op_kind: GpuOpKind::Custom("table"),
559    supported_precisions: &[],
560    broadcast: BroadcastSemantics::None,
561    provider_hooks: &[],
562    constant_strategy: ConstantStrategy::InlineLiteral,
563    residency: ResidencyPolicy::GatherImmediately,
564    nan_mode: ReductionNaN::Include,
565    two_pass_threshold: None,
566    workgroup_size: None,
567    accepts_nan_mode: false,
568    notes: "Tables are host containers. GPU variables are gathered when tabular algorithms need row-wise access.",
569};
570
571#[runmat_macros::register_fusion_spec(builtin_path = "crate::builtins::table")]
572pub const FUSION_SPEC: BuiltinFusionSpec = BuiltinFusionSpec {
573    name: "table",
574    shape: ShapeRequirements::Any,
575    constant_strategy: ConstantStrategy::InlineLiteral,
576    elementwise: None,
577    reduction: None,
578    emits_nan: false,
579    notes: "Tables are structured host containers and are not fusion operands.",
580};
581
582pub(super) fn table_error(
583    error: &'static BuiltinErrorDescriptor,
584    message: impl Into<String>,
585) -> RuntimeError {
586    let mut builder = build_runtime_error(message).with_builtin(TABLE_CLASS);
587    if let Some(identifier) = error.identifier {
588        builder = builder.with_identifier(identifier);
589    }
590    builder.build()
591}
592
593pub(super) fn table_error_with_source<E>(
594    error: &'static BuiltinErrorDescriptor,
595    message: impl Into<String>,
596    source: E,
597) -> RuntimeError
598where
599    E: std::error::Error + Send + Sync + 'static,
600{
601    let mut builder = build_runtime_error(message)
602        .with_builtin(TABLE_CLASS)
603        .with_source(source);
604    if let Some(identifier) = error.identifier {
605        builder = builder.with_identifier(identifier);
606    }
607    builder.build()
608}
609
610pub(super) fn invalid_argument(message: impl Into<String>) -> RuntimeError {
611    table_error(&TABLE_ERROR_INVALID_ARGUMENT, message)
612}
613
614pub(super) fn invalid_index(message: impl Into<String>) -> RuntimeError {
615    table_error(&TABLE_ERROR_INVALID_INDEX, message)
616}
617
618pub(super) fn invalid_variable(message: impl Into<String>) -> RuntimeError {
619    table_error(&TABLE_ERROR_INVALID_VARIABLE, message)
620}
621
622pub(super) fn map_control_flow(err: RuntimeError) -> RuntimeError {
623    let identifier = err.identifier().map(ToString::to_string);
624    let message = err.message().to_string();
625    let mut builder = build_runtime_error(message)
626        .with_builtin(TABLE_CLASS)
627        .with_source(err);
628    if let Some(identifier) = identifier {
629        builder = builder.with_identifier(identifier);
630    }
631    builder.build()
632}