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}