1use crate::{build_runtime_error, RuntimeError};
4use runmat_builtins::{BuiltinExtensionDescriptor, BuiltinExtensionMode};
5pub use runmat_builtins::{SPARSE_EXTENSIONS, SPARSE_INTEGER_EXTENSION};
6use runmat_thread_local::runmat_thread_local;
7use runmat_value::Value;
8use std::cell::Cell;
9use std::collections::HashSet;
10
11pub const MATLAB_COMPATIBILITY_RELEASE: &str = "R2026a";
15
16pub const MATLAB_COMPATIBILITY_VERSION: &str = "26.1";
18
19runmat_thread_local! {
20 static RUNMAT_EXTENSIONS_ENABLED: Cell<bool> = const { Cell::new(false) };
21}
22
23pub fn runmat_extensions_enabled() -> bool {
26 if let Some(context) = crate::context::legacy::active() {
27 return context.state().runmat_extensions_enabled.get();
28 }
29 RUNMAT_EXTENSIONS_ENABLED.with(Cell::get)
30}
31
32pub fn set_runmat_extensions_enabled(enabled: bool) {
34 if let Some(context) = crate::context::legacy::active() {
35 context.state().runmat_extensions_enabled.set(enabled);
36 return;
37 }
38 RUNMAT_EXTENSIONS_ENABLED.with(|slot| slot.set(enabled));
39}
40
41pub fn inherit_legacy_extension_policy(context: &crate::context::RuntimeContext) {
44 let enabled = RUNMAT_EXTENSIONS_ENABLED.with(Cell::get);
45 context.state().runmat_extensions_enabled.set(enabled);
46}
47
48pub fn ensure_builtin_extension_enabled(
49 extension: &BuiltinExtensionDescriptor,
50 context: &str,
51) -> Result<(), RuntimeError> {
52 let enabled = match extension.mode {
53 BuiltinExtensionMode::RunMatOnly => runmat_extensions_enabled(),
54 };
55 if enabled {
56 return Ok(());
57 }
58 let mut builder = build_runtime_error(format!(
59 "{context}: {}; enable runmat compatibility mode to use it",
60 extension.description
61 ))
62 .with_gpu_gather_retry(crate::GpuGatherRetry::Never);
63 if let Some(identifier) = extension.error_identifier {
64 builder = builder.with_identifier(identifier);
65 }
66 Err(builder.build())
67}
68
69pub fn ensure_sparse_integer_extension_enabled(context: &str) -> Result<(), RuntimeError> {
71 ensure_builtin_extension_enabled(&SPARSE_INTEGER_EXTENSION, context)
72}
73
74pub fn ensure_value_compatible(value: &Value, context: &str) -> Result<(), RuntimeError> {
76 if value_contains_sparse_integer(value, &mut HashSet::new()) {
77 ensure_sparse_integer_extension_enabled(context)?;
78 }
79 Ok(())
80}
81
82fn value_contains_sparse_integer(
83 value: &Value,
84 visited_handles: &mut HashSet<runmat_gc::GcHandle>,
85) -> bool {
86 match value {
87 Value::SparseTensor(sparse) => sparse.integer_storage().is_some(),
88 Value::Cell(cell) => cell
89 .data
90 .iter()
91 .any(|value| value_contains_sparse_integer(value, visited_handles)),
92 Value::Struct(struct_value) => struct_value
93 .fields
94 .values()
95 .any(|value| value_contains_sparse_integer(value, visited_handles)),
96 Value::Object(object) => object
97 .properties
98 .values()
99 .any(|value| value_contains_sparse_integer(value, visited_handles)),
100 Value::HandleObject(handle) => {
101 if !visited_handles.insert(handle.target) {
102 return false;
103 }
104 runmat_gc::gc_with_value(&handle.target, |target| {
105 value_contains_sparse_integer(target, visited_handles)
106 })
107 .unwrap_or(false)
108 }
109 Value::Closure(closure) => closure
110 .captures
111 .iter()
112 .any(|value| value_contains_sparse_integer(value, visited_handles)),
113 Value::OutputList(values) => values
114 .iter()
115 .any(|value| value_contains_sparse_integer(value, visited_handles)),
116 _ => false,
117 }
118}
119
120pub fn push_runmat_extensions_enabled(enabled: bool) -> RunMatExtensionsGuard {
122 let previous = runmat_extensions_enabled();
123 set_runmat_extensions_enabled(enabled);
124 RunMatExtensionsGuard {
125 previous,
126 state: crate::context::legacy::active().map(|context| std::rc::Rc::clone(context.state())),
127 }
128}
129
130#[must_use]
131pub struct RunMatExtensionsGuard {
132 previous: bool,
133 state: Option<std::rc::Rc<crate::context::RuntimeContextState>>,
134}
135
136impl Drop for RunMatExtensionsGuard {
137 fn drop(&mut self) {
138 if let Some(state) = &self.state {
139 state.runmat_extensions_enabled.set(self.previous);
140 } else {
141 RUNMAT_EXTENSIONS_ENABLED.with(|slot| slot.set(self.previous));
142 }
143 }
144}
145
146#[cfg(test)]
147mod tests {
148 use super::*;
149
150 #[test]
151 fn documented_compatibility_version_pin_matches_runtime_queries() {
152 let policy = include_str!("../../../docs/getting-started/compatability.md");
153 assert!(policy.contains(&format!("**MATLAB {MATLAB_COMPATIBILITY_RELEASE}**")));
154 assert!(policy.contains(&format!(
155 "product version, `{MATLAB_COMPATIBILITY_VERSION}`"
156 )));
157 }
158
159 #[test]
160 fn compatibility_version_pin_is_centralized_in_the_repository() {
161 let workspace_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");
162 let canonical_policy = workspace_root.join("docs/getting-started/compatability.md");
163 let runtime_policy = workspace_root.join("crates/runmat-runtime/src/compatibility.rs");
164 let release_label = MATLAB_COMPATIBILITY_RELEASE.to_ascii_lowercase();
165 let bare_release_label = release_label.strip_prefix('r').unwrap_or(&release_label);
166 let product_version = MATLAB_COMPATIBILITY_VERSION.to_ascii_lowercase();
167 let contains_pin_token = |contents: &str| {
168 let contents = contents.to_ascii_lowercase();
169 [
170 release_label.as_str(),
171 bare_release_label,
172 product_version.as_str(),
173 ]
174 .into_iter()
175 .any(|needle| {
176 contents.match_indices(needle).any(|(start, _)| {
177 let end = start + needle.len();
178 let is_version_character =
179 |byte: u8| byte.is_ascii_alphanumeric() || byte == b'.';
180 let starts_at_boundary =
181 start == 0 || !is_version_character(contents.as_bytes()[start - 1]);
182 let ends_at_boundary =
183 end == contents.len() || !is_version_character(contents.as_bytes()[end]);
184 starts_at_boundary && ends_at_boundary
185 })
186 })
187 };
188 let mut pending = vec![workspace_root.clone()];
189 while let Some(directory) = pending.pop() {
190 for entry in std::fs::read_dir(&directory).expect("read repository directory") {
191 let path = entry.expect("read repository entry").path();
192 if path.is_dir() {
193 if !matches!(
194 path.file_name().and_then(|name| name.to_str()),
195 Some(".git" | "target")
196 ) {
197 pending.push(path);
198 }
199 } else if path != canonical_policy && path != runtime_policy {
200 let Ok(contents) = std::fs::read_to_string(&path) else {
201 continue;
202 };
203 assert!(
204 !contains_pin_token(&contents),
205 "the compatibility pin must appear only in {} and the runtime policy: {}",
206 canonical_policy.display(),
207 path.display()
208 );
209 }
210 }
211 }
212 }
213
214 #[test]
215 fn scoped_extension_policy_restores_previous_state() {
216 let original = runmat_extensions_enabled();
217 {
218 let _guard = push_runmat_extensions_enabled(!original);
219 assert_eq!(runmat_extensions_enabled(), !original);
220 }
221 assert_eq!(runmat_extensions_enabled(), original);
222 }
223
224 #[test]
225 fn sparse_integer_policy_checks_nested_results() {
226 use runmat_value::{IntegerStorage, SparseTensor, StructValue};
227
228 let sparse = SparseTensor::new_integer(
229 1,
230 1,
231 vec![0, 1],
232 vec![0],
233 IntegerStorage::U64(vec![u64::MAX]),
234 )
235 .expect("sparse integer");
236 let mut fields = StructValue::new();
237 fields.insert("x", Value::SparseTensor(sparse));
238 let nested = Value::Struct(fields);
239
240 {
241 let _compat = push_runmat_extensions_enabled(false);
242 let err = ensure_value_compatible(&nested, "load").expect_err("MATLAB mode rejects");
243 assert_eq!(
244 err.identifier(),
245 Some("RunMat:compatibility:SparseIntegerExtension")
246 );
247 }
248 {
249 let _compat = push_runmat_extensions_enabled(true);
250 ensure_value_compatible(&nested, "load").expect("RunMat mode accepts");
251 }
252 }
253
254 #[test]
255 fn integer_extensions_are_declared_in_builtin_metadata() {
256 let sparse = runmat_builtins::builtin_function_by_name("sparse").expect("sparse builtin");
257 assert_eq!(sparse.extensions, &SPARSE_EXTENSIONS);
258 let randi = runmat_builtins::builtin_function_by_name("randi").expect("randi builtin");
259 assert_eq!(
260 randi.extensions,
261 &crate::builtins::array::creation::randi::RANDI_EXTENSIONS
262 );
263 assert_eq!(
264 randi.extensions[0].error_identifier,
265 Some("RunMat:compatibility:RandiWideIntegerExtension")
266 );
267
268 let catalog_extensions =
269 runmat_builtins::builtin_catalog_entries()
270 .iter()
271 .flat_map(|entry| {
272 entry
273 .extensions
274 .iter()
275 .map(move |extension| (entry.identity.name, extension.id))
276 });
277 let declared = runmat_builtins::builtin_functions()
278 .into_iter()
279 .flat_map(|builtin| {
280 builtin
281 .extensions
282 .iter()
283 .map(move |extension| (builtin.name, extension.id))
284 })
285 .chain(catalog_extensions)
286 .collect::<std::collections::BTreeSet<_>>();
287 let expected = std::collections::BTreeSet::from([
288 ("DelaunayTri", "delaunaytri-integer-coordinates"),
289 ("DelaunayTri", "delaunaytri-integer-topology"),
290 ("DelaunayTri.freeBoundary", "delaunaytri-integer-topology"),
291 (
292 "DelaunayTri.nearestNeighbor",
293 "delaunaytri-integer-coordinates",
294 ),
295 (
296 "DelaunayTri.pointLocation",
297 "delaunaytri-integer-coordinates",
298 ),
299 ("DelaunayTri.pointLocation", "delaunaytri-integer-topology"),
300 ("abs", "abs-character-input"),
301 ("abs", "abs-logical-input"),
302 ("abs", "sparse-integer-storage"),
303 ("addpath", "addpath-numeric-character-codes"),
304 ("all", "all-nanflag"),
305 ("allfinite", "allfinite-string-input"),
306 ("and", "and-character-input"),
307 ("and", "and-complex-input"),
308 ("any", "any-nanflag"),
309 ("area", "area-linespec"),
310 ("array2table", "array2table-gpu-input"),
311 ("array2timetable", "array2timetable-gpu-input"),
312 ("arrayDatastore", "arraydatastore-gpu-input"),
313 ("arrayfun", "arrayfun-gpu-options"),
314 ("arrayfun", "arrayfun-host-scalar-expansion"),
315 ("arrayfun", "arrayfun-text-callable"),
316 ("assert", "assert-complex-condition"),
317 ("assert", "assert-unqualified-identifier"),
318 ("acos", "acos-character-input"),
319 ("acos", "acos-gpu-real-complex-promotion"),
320 ("acos", "acos-integer-input"),
321 ("acos", "acos-logical-input"),
322 ("acosh", "acosh-character-input"),
323 ("acosh", "acosh-gpu-real-complex-promotion"),
324 ("acosh", "acosh-integer-input"),
325 ("acosh", "acosh-logical-input"),
326 ("asin", "asin-character-input"),
327 ("asin", "asin-gpu-real-complex-promotion"),
328 ("asin", "asin-integer-input"),
329 ("asin", "asin-logical-input"),
330 ("asinh", "asinh-character-input"),
331 ("asinh", "asinh-integer-input"),
332 ("asinh", "asinh-logical-input"),
333 ("atan", "atan-character-input"),
334 ("atan", "atan-integer-input"),
335 ("atan", "atan-like-output-template"),
336 ("atan", "atan-logical-input"),
337 ("atan2", "atan2-character-input"),
338 ("atan2", "atan2-integer-input"),
339 ("atan2", "atan2-logical-input"),
340 ("atanh", "atanh-character-input"),
341 ("atanh", "atanh-gpu-real-complex-promotion"),
342 ("atanh", "atanh-integer-input"),
343 ("atanh", "atanh-logical-input"),
344 ("any", "any-nanflag"),
345 ("bandwidth", "bandwidth-integer-input"),
346 ("bandwidth", "bandwidth-logical-input"),
347 ("binocdf", "binocdf-integer-probability"),
348 ("binocdf", "binocdf-integer-trials"),
349 ("binocdf", "binocdf-integer-x"),
350 ("binocdf", "binocdf-logical-input"),
351 ("cdf", "cdf-integer-parameters"),
352 ("cdf", "cdf-integer-x"),
353 ("cdf", "cdf-logical-input"),
354 ("cdfplot", "cdfplot-gpu-input"),
355 ("cdfplot", "cdfplot-integer-input"),
356 ("cdfplot", "cdfplot-logical-input"),
357 ("cell", "cell-gpu-size"),
358 ("mat2cell", "mat2cell-integer-partitions"),
359 ("mat2str", "mat2str-integer-precision"),
360 ("mat2str", "mat2str-text-input"),
361 ("cell", "cell-like"),
362 ("char", "char-logical-input"),
363 ("char", "char-resident-numeric-input"),
364 ("cheb2ord", "cheb2ord-integer-attenuation"),
365 ("cheb2ord", "cheb2ord-integer-frequency"),
366 ("cheb2ord", "cheb2ord-logical-input"),
367 ("cheb2ord", "cheb2ord-resident-input"),
368 ("chi2cdf", "chi2cdf-integer-degrees-of-freedom"),
369 ("chi2cdf", "chi2cdf-integer-x"),
370 ("chi2cdf", "chi2cdf-logical-input"),
371 ("chol", "chol-integer-input"),
372 ("chol", "chol-logical-input"),
373 ("classify", "classify-integer-group"),
374 ("classify", "classify-integer-prior"),
375 ("classify", "classify-integer-sample"),
376 ("classify", "classify-integer-training"),
377 ("classify", "classify-logical-predictor"),
378 ("classify", "classify-resident-input"),
379 ("clf", "clf-all-selector"),
380 ("clf", "clf-integer-figure-number"),
381 ("clf", "clf-variadic-targets"),
382 ("close", "close-integer-figure-number"),
383 ("close", "close-variadic-targets"),
384 ("colon", "colon-gpu-64-bit-integer"),
385 ("colon", "colon-logical-input"),
386 ("colon", "colon-zero-imaginary-complex"),
387 ("colormap", "colormap-non-uint8-integer-map"),
388 ("colororder", "colororder-integer-rgb"),
389 ("combinations", "combinations-resident-input"),
390 ("compose", "compose-resident-input"),
391 ("cond", "cond-integer-matrix"),
392 ("cond", "cond-integer-norm-selector"),
393 ("cond", "cond-logical-matrix"),
394 ("cond", "cond-logical-norm-selector"),
395 ("confusionmat", "confusionmat-integer-group"),
396 ("confusionmat", "confusionmat-integer-grouphat"),
397 ("confusionmat", "confusionmat-integer-order"),
398 ("confusionmat", "confusionmat-resident-input"),
399 ("conj", "conj-character-input"),
400 (
401 "containers.Map",
402 "containers-map-resident-constructor-input",
403 ),
404 (
405 "containers.Map.isKey",
406 "containers-map-resident-iskey-input",
407 ),
408 (
409 "containers.Map.values",
410 "containers-map-resident-values-input",
411 ),
412 (
413 "containers.Map.remove",
414 "containers-map-resident-remove-input",
415 ),
416 (
417 "containers.Map.subsref",
418 "containers-map-resident-subsref-input",
419 ),
420 (
421 "containers.Map.subsasgn",
422 "containers-map-resident-subsasgn-input",
423 ),
424 ("contour", "contour-integer-line-color"),
425 ("contourf", "contour-integer-line-color"),
426 ("copyobj", "copyobj-integer-handle-aliases"),
427 ("cos", "cos-integer-input"),
428 ("cos", "cos-logical-input"),
429 ("cos", "cos-character-input"),
430 ("cos", "cos-like-output"),
431 ("cosd", "cosd-integer-input"),
432 ("cosd", "cosd-logical-input"),
433 ("cosd", "cosd-character-input"),
434 ("cosh", "cosh-integer-input"),
435 ("cosh", "cosh-logical-input"),
436 ("cosh", "cosh-character-input"),
437 ("cosineSimilarity", "cosine-similarity-integer-matrix"),
438 ("cosineSimilarity", "cosine-similarity-single-matrix"),
439 ("cosineSimilarity", "cosine-similarity-logical-matrix"),
440 ("cosineSimilarity", "cosine-similarity-resident-input"),
441 ("cospi", "cospi-integer-input"),
442 ("cospi", "cospi-logical-input"),
443 ("cospi", "cospi-character-input"),
444 ("cross", "cross-integer-a"),
445 ("cross", "cross-integer-b"),
446 ("cross", "cross-integer-dim"),
447 ("cross", "cross-logical-a"),
448 ("cross", "cross-logical-b"),
449 ("cross", "cross-logical-dim"),
450 ("csvread", "csvread-colon-range"),
451 ("csvread", "csvread-resident-control-inputs"),
452 ("csvread", "csvread-two-vector-range"),
453 ("csvwrite", "csvwrite-bytes-written-output"),
454 ("csvwrite", "csvwrite-resident-input"),
455 ("ctranspose", "ctranspose-integer-sparse"),
456 ("cumtrapz", "cumtrapz-integer-dim"),
457 ("cumtrapz", "cumtrapz-integer-spacing"),
458 ("cumtrapz", "cumtrapz-integer-y"),
459 ("cumtrapz", "cumtrapz-logical-spacing"),
460 ("cumtrapz", "cumtrapz-logical-y"),
461 ("cumtrapz", "cumtrapz-tensor-spacing"),
462 ("cvpartition", "cvpartition-integer-custom-testsets"),
463 ("cvpartition", "cvpartition-integer-observation-count"),
464 ("cvpartition", "cvpartition-integer-partition-control"),
465 ("cvpartition", "cvpartition-integer-stratification"),
466 ("cvpartition", "cvpartition-nonlogical-stratify-option"),
467 ("daspect", "daspect-numeric-axes-handle-alias"),
468 ("dataTipTextRow", "data-tip-text-row-nonvector-value"),
469 ("dataTipTextRow", "data-tip-text-row-resident-value"),
470 ("datacursormode", "datacursormode-numeric-handle-alias"),
471 ("datacursormode", "datacursormode-onoff-aliases"),
472 ("datacursormode", "datacursormode-status-output"),
473 ("datasample", "datasample-integer-data"),
474 ("datasample", "datasample-integer-dim"),
475 ("datasample", "datasample-integer-k"),
476 ("datasample", "datasample-integer-weights"),
477 ("datasample", "datasample-logical-weights"),
478 ("datasample", "datasample-numeric-replace"),
479 ("datasample", "datasample-resident-input"),
480 ("dateshift", "datetime-resident-numeric-input"),
481 ("datetime", "datetime-four-five-components"),
482 ("datetime", "datetime-implicit-datenum"),
483 ("datetime", "datetime-logical-numeric-input"),
484 ("datetime", "datetime-resident-numeric-input"),
485 ("day", "datetime-logical-numeric-input"),
486 ("day", "datetime-resident-numeric-input"),
487 ("deal", "deal-resident-input"),
488 ("binornd", "binornd-integer-probability"),
489 ("binornd", "binornd-integer-size"),
490 ("binornd", "binornd-integer-trials"),
491 ("binornd", "binornd-logical-input"),
492 ("binscatter", "binscatter-gpu-input"),
493 ("bitand", "bitand-gpu-assumedtype"),
494 ("bitand", "bitand-gpu-undocumented-input"),
495 ("bitand", "bitand-single-input"),
496 ("bitor", "bitor-gpu-assumedtype"),
497 ("bitor", "bitor-gpu-undocumented-input"),
498 ("bitor", "bitor-single-input"),
499 ("bitshift", "bitshift-gpu-assumedtype"),
500 ("bitshift", "bitshift-gpu-undocumented-input"),
501 ("bitshift", "bitshift-logical-count-input"),
502 ("bitshift", "bitshift-logical-value-input"),
503 ("bitshift", "bitshift-single-count-input"),
504 ("bitshift", "bitshift-single-value-input"),
505 ("bitcmp", "direct-bit-gpu-assumedtype"),
506 ("bitcmp", "direct-bit-gpu-undocumented-input"),
507 ("bitget", "direct-bit-gpu-assumedtype"),
508 ("bitget", "direct-bit-gpu-undocumented-input"),
509 ("bitset", "direct-bit-gpu-assumedtype"),
510 ("bitset", "direct-bit-gpu-undocumented-input"),
511 ("bitxor", "bitxor-gpu-assumedtype"),
512 ("bitxor", "bitxor-gpu-undocumented-input"),
513 ("bitxor", "bitxor-single-input"),
514 ("blackman", "blackman-logical-length"),
515 ("blanks", "blanks-gpu-input"),
516 ("blkdiag", "blkdiag-complex-integer-input"),
517 ("blkdiag", "blkdiag-sparse-integer-input"),
518 ("bootstrp", "bootstrp-gpu-input"),
519 ("bootstrp", "bootstrp-integer-data"),
520 ("bootstrp", "bootstrp-integer-nboot"),
521 ("bootstrp", "bootstrp-integer-weights"),
522 ("bootstrp", "bootstrp-logical-nboot"),
523 ("bootstrp", "bootstrp-logical-weights"),
524 ("bootstrp", "bootstrp-text-callable"),
525 ("boxplot", "boxplot-gpu-input"),
526 ("boxplot", "boxplot-integer-data"),
527 ("boxplot", "boxplot-integer-group"),
528 ("boxplot", "boxplot-integer-option"),
529 ("boxplot", "boxplot-logical-data"),
530 ("boxplot", "boxplot-logical-group"),
531 ("boxplot", "boxplot-logical-option"),
532 ("bsxfun", "bsxfun-text-callable"),
533 ("butter", "butter-gpu-input"),
534 ("butter", "butter-integer-cutoff"),
535 ("butter", "butter-integer-order"),
536 ("butter", "butter-logical-cutoff"),
537 ("butter", "butter-logical-order"),
538 ("butter", "butter-option-alias"),
539 ("butter", "butter-order-above-500"),
540 ("butter", "butter-single-cutoff"),
541 ("butter", "butter-single-order"),
542 ("buttord", "buttord-complex-frequency"),
543 ("buttord", "buttord-gpu-input"),
544 ("buttord", "buttord-integer-attenuation"),
545 ("buttord", "buttord-integer-frequency"),
546 ("buttord", "buttord-logical-attenuation"),
547 ("buttord", "buttord-logical-frequency"),
548 ("cat", "cat-like-prototype"),
549 ("cat", "cat-resident-dimension"),
550 ("categorical", "categorical-gpu-input"),
551 ("caxis", "clim-integer-limits"),
552 ("clim", "clim-integer-limits"),
553 ("contains", "contains-numeric-ignore-case"),
554 ("contains", "contains-positional-ignore-case"),
555 ("contains", "contains-text-ignore-case"),
556 ("corr", "corr-integer-data"),
557 ("corr", "corr-integer-weights"),
558 ("corrcoef", "corrcoef-integer-data"),
559 ("corrcoef", "corrcoef-logical-data"),
560 ("corrcov", "corrcov-integer-data"),
561 ("corrcov", "corrcov-logical-data"),
562 ("cov", "cov-integer-data"),
563 ("cov", "cov-logical-data"),
564 ("cov", "cov-typed-normalization"),
565 ("cov", "cov-vector-weights"),
566 ("cov2corr", "cov2corr-gpu-input"),
567 ("cov2corr", "cov2corr-integer-data"),
568 ("cov2corr", "cov2corr-logical-data"),
569 ("cov2corr", "cov2corr-single-data"),
570 ("cummax", "cummax-gpu-nanflag"),
571 ("cummin", "cummin-gpu-nanflag"),
572 ("cumprod", "cumprod-gpu-nanflag"),
573 ("decomposition", "decomposition-gpu-input"),
574 ("decomposition", "decomposition-integer-check-condition"),
575 ("decomposition", "decomposition-integer-rank-tolerance"),
576 ("decomposition", "decomposition-nonfloating-input"),
577 (
578 "decomposition.ctranspose",
579 "decomposition-nonfloating-input",
580 ),
581 ("decomposition.mldivide", "decomposition-nonfloating-input"),
582 ("decomposition.mldivide", "decomposition-gpu-input"),
583 ("decomposition.mrdivide", "decomposition-nonfloating-input"),
584 ("decomposition.mrdivide", "decomposition-gpu-input"),
585 ("decomposition.mtimes", "decomposition-nonfloating-input"),
586 ("decomposition.mtimes", "decomposition-gpu-input"),
587 ("decomposition.mtimes", "decomposition-integer-scale-factor"),
588 (
589 "decomposition.mtimes",
590 "decomposition-complex-integer-scale-factor",
591 ),
592 ("decomposition.rdivide", "decomposition-nonfloating-input"),
593 ("decomposition.rdivide", "decomposition-gpu-input"),
594 (
595 "decomposition.rdivide",
596 "decomposition-integer-scale-factor",
597 ),
598 (
599 "decomposition.rdivide",
600 "decomposition-complex-integer-scale-factor",
601 ),
602 ("decomposition.subsref", "decomposition-nonfloating-input"),
603 ("decomposition.times", "decomposition-nonfloating-input"),
604 ("decomposition.times", "decomposition-gpu-input"),
605 ("decomposition.times", "decomposition-integer-scale-factor"),
606 (
607 "decomposition.times",
608 "decomposition-complex-integer-scale-factor",
609 ),
610 ("decomposition.uminus", "decomposition-nonfloating-input"),
611 ("decomposition.uplus", "decomposition-nonfloating-input"),
612 ("dividerand", "dividerand-resident-argument"),
613 ("dlmread", "dlmread-colon-spreadsheet-range"),
614 ("dlmread", "dlmread-composed-range"),
615 ("dlmread", "dlmread-numeric-delimiter"),
616 ("dlmread", "dlmread-resident-argument"),
617 ("dlmwrite", "dlmwrite-byte-count-output"),
618 ("dlmwrite", "dlmwrite-resident-input"),
619 ("dot", "dot-integer-data"),
620 ("dot", "dot-logical-data"),
621 ("double", "double-like-prototype"),
622 ("downsample", "downsample-integer-factor"),
623 ("downsample", "downsample-integer-phase"),
624 ("downsample", "downsample-nd-input"),
625 ("dummyvar", "dummyvar-gpu-group"),
626 ("dummyvar", "dummyvar-integer-group"),
627 ("duration", "duration-gpu-input"),
628 ("duration", "duration-short-component-form"),
629 ("db", "db-nonfloating-input"),
630 ("deconv", "deconv-integer-input"),
631 ("deconv", "deconv-logical-input"),
632 ("deg2rad", "deg2rad-integer-input"),
633 ("deg2rad", "deg2rad-logical-input"),
634 ("det", "det-integer-input"),
635 ("det", "det-logical-input"),
636 (
637 "detectImportOptions",
638 "detectimportoptions-integer-num-header-lines",
639 ),
640 ("diag", "diag-explicit-size"),
641 ("diag", "diag-like"),
642 ("diag", "diag-output-class"),
643 ("diag", "diag-trailing-singleton-dimensions"),
644 ("diag", "diag-vector-option"),
645 ("dictionary", "dictionary-gpu-input"),
646 ("diff", "diff-character-input"),
647 ("diff", "diff-empty-control"),
648 ("diff", "diff-zero-order"),
649 ("digits", "digits-default-reset"),
650 ("digits", "digits-numeric-text"),
651 ("ecdf", "ecdf-integer-censoring"),
652 ("ecdf", "ecdf-integer-frequency"),
653 ("ecdf", "ecdf-integer-y"),
654 ("ecdf", "ecdf-logical-frequency"),
655 ("ecdf", "ecdf-logical-y"),
656 ("eig", "eig-nonfloating-coefficient"),
657 ("eigs", "eigs-gpu-input"),
658 ("eigs", "eigs-integer-sigma"),
659 ("eigs", "eigs-integer-start-vector"),
660 ("eigs", "eigs-nonfloating-matrix"),
661 ("empty", "empty-global-call"),
662 ("empty", "empty-resident-size"),
663 ("empty", "empty-typename"),
664 ("encode", "encode-numeric-force-cell-output"),
665 ("encode", "encode-resident-force-cell-output"),
666 ("endsWith", "endswith-numeric-ignore-case"),
667 ("endsWith", "endswith-positional-ignore-case"),
668 ("endsWith", "endswith-resident-ignore-case"),
669 ("endsWith", "endswith-text-ignore-case"),
670 ("envelope", "envelope-integer-control"),
671 ("envelope", "envelope-integer-data"),
672 ("eraseBetween", "erasebetween-char-matrix"),
673 ("eraseBetween", "erasebetween-full-broadcast"),
674 ("eraseBetween", "erasebetween-resident-position"),
675 ("eraseBetween", "erasebetween-string-cell"),
676 ("error", "error-mexception-input"),
677 ("error", "error-struct-field-aliases"),
678 ("error", "error-unqualified-identifier"),
679 ("erasePunctuation", "erase-punctuation-broad-cell-input"),
680 ("erasePunctuation", "erase-punctuation-char-matrix-input"),
681 ("eraseURLs", "erase-urls-broad-cell-input"),
682 ("eraseURLs", "erase-urls-char-matrix-input"),
683 ("exist", "exist-nontext-handle-query"),
684 ("exist", "exist-search-type-extension"),
685 ("exp", "exp-character-input"),
686 ("exp", "exp-integer-input"),
687 ("exp", "exp-logical-input"),
688 ("expm1", "expm1-character-input"),
689 ("expm1", "expm1-integer-input"),
690 ("expm1", "expm1-logical-input"),
691 ("exprnd", "exprnd-integer-mean"),
692 ("exprnd", "exprnd-integer-size"),
693 ("extractAfter", "extractafter-char-matrix"),
694 ("extractAfter", "extractafter-resident-position"),
695 ("extractAfter", "extractafter-string-cell"),
696 ("extractBefore", "extractbefore-char-matrix"),
697 ("extractBefore", "extractbefore-resident-position"),
698 ("extractBefore", "extractbefore-string-cell"),
699 ("extractBetween", "extractbetween-char-matrix"),
700 ("extractBetween", "extractbetween-full-broadcast"),
701 ("extractBetween", "extractbetween-resident-position"),
702 ("extractBetween", "extractbetween-string-cell"),
703 ("extractFileText", "extractfiletext-broad-file-cell"),
704 ("extractFileText", "extractfiletext-resident-pages"),
705 ("extractHTMLText", "extracthtmltext-broad-cell"),
706 ("extractHTMLText", "extracthtmltext-char-matrix"),
707 ("eye", "eye-column-size-vector"),
708 ("eye", "eye-implicit-prototype"),
709 ("eye", "eye-nd-dimensions"),
710 ("false", "false-implicit-prototype"),
711 ("false", "false-logical-class-option"),
712 ("false", "false-resident-size-input"),
713 ("false", "false-single-size-input"),
714 ("fclose", "fclose-cell-fileids"),
715 ("fclose", "fclose-fileid-vector"),
716 ("fclose", "fclose-integer-fileid"),
717 ("fclose", "fclose-logical-fileid"),
718 ("fclose", "fclose-message-output"),
719 ("fclose", "fclose-no-input-close-all"),
720 ("fclose", "fclose-resident-fileid"),
721 ("fclose", "fclose-single-fileid"),
722 ("fclose", "fclose-string-all"),
723 ("fcontour", "fcontour-integer-line-color"),
724 ("fcontour", "fcontour-positional-level-spec"),
725 ("fcontour", "fcontour-resident-numeric-input"),
726 ("feedback", "feedback-single-system"),
727 ("feedback", "feedback-scalar-forward-system"),
728 ("feedback", "feedback-scalar-scalar-systems"),
729 ("feedback", "feedback-integer-scalar-gain"),
730 ("feedback", "feedback-integer-sign"),
731 ("feedback", "feedback-logical-numeric-input"),
732 ("feedback", "feedback-resident-numeric-input"),
733 ("feedback", "feedback-single-numeric-input"),
734 ("feval", "feval-at-prefixed-text-target"),
735 ("feval", "feval-object-receiver"),
736 ("feof", "feof-integer-fileid"),
737 ("feof", "feof-logical-fileid"),
738 ("feof", "feof-resident-fileid"),
739 ("fitclinear", "fitclinear-integer-numeric-arguments"),
740 ("fitclinear", "fitclinear-integer-predictors"),
741 ("fitclinear", "fitclinear-resident-input"),
742 ("fitctree", "fitctree-integer-numeric-arguments"),
743 ("fitctree", "fitctree-integer-predictors"),
744 ("fitctree", "fitctree-resident-input"),
745 ("fitdist", "fitdist-integer-data"),
746 ("fitdist", "fitdist-integer-frequency"),
747 ("fitdist", "fitdist-resident-fallback"),
748 ("fitlm", "fitlm-integer-controls"),
749 ("fitlm", "fitlm-integer-predictor-data"),
750 ("fitlm", "fitlm-integer-response-data"),
751 ("fitlm", "fitlm-integer-selectors"),
752 ("fitlm", "fitlm-integer-weights"),
753 ("fitlm", "fitlm-resident-fallback"),
754 ("fminbnd", "fminbnd-nonfloating-bounds"),
755 ("fminbnd", "fminbnd-nonfloating-objective"),
756 ("fminbnd", "fminbnd-resident-fallback"),
757 ("fminbnd", "fminbnd-typed-option-controls"),
758 ("fminunc", "fminunc-nonfloating-callback-output"),
759 ("fminunc", "fminunc-nonfloating-initial-point"),
760 ("fminunc", "fminunc-resident-fallback"),
761 ("fminunc", "fminunc-typed-option-controls"),
762 ("fsolve", "fsolve-nonfloating-callback-output"),
763 ("fsolve", "fsolve-nonfloating-initial-point"),
764 ("fsolve", "fsolve-resident-fallback"),
765 ("fsolve", "fsolve-typed-option-controls"),
766 ("fspecial", "fspecial-nondouble-parameter"),
767 ("fspecial", "fspecial-nondouble-size"),
768 ("fspecial", "fspecial-resident-output"),
769 ("fspecial", "fspecial-unsharp-filter"),
770 ("fsurf", "fsurf-integer-axes-handle"),
771 ("fsurf", "fsurf-integer-callback-output"),
772 ("fsurf", "fsurf-integer-domain"),
773 ("fsurf", "fsurf-integer-mesh-density"),
774 ("fsurf", "fsurf-integer-style-property"),
775 ("fsurf", "fsurf-logical-numeric-input"),
776 ("fsurf", "fsurf-resident-callback-output"),
777 ("fsurf", "fsurf-single-numeric-input"),
778 ("fzero", "fzero-nonfloating-callback-output"),
779 ("fzero", "fzero-nonfloating-initial-point"),
780 ("fzero", "fzero-resident-fallback"),
781 ("fzero", "fzero-typed-option-controls"),
782 ("fft", "fft-wide-integer-controls"),
783 ("fft", "fft-wide-integer-data"),
784 ("fft2", "fft2-empty-zero-size"),
785 ("fft2", "fft2-size-form"),
786 ("fft2", "fft2-wide-integer-controls"),
787 ("fft2", "fft2-wide-integer-data"),
788 ("fftn", "fftn-short-size-vector"),
789 ("fftn", "fftn-wide-integer-controls"),
790 ("fftn", "fftn-wide-integer-data"),
791 ("fftshift", "fftshift-multi-dimension-selector"),
792 ("fgetl", "fgetl-integer-fileid"),
793 ("fgetl", "fgetl-resident-fileid"),
794 ("fgetl", "fgetl-single-fileid"),
795 ("fgets", "fgets-integer-fileid"),
796 ("fgets", "fgets-integer-nchar"),
797 ("fgets", "fgets-resident-fileid"),
798 ("fgets", "fgets-resident-nchar"),
799 ("fgets", "fgets-single-fileid"),
800 ("fgets", "fgets-single-nchar"),
801 ("fieldnames", "fieldnames-object-family"),
802 ("figure", "figure-integer-property-value"),
803 ("figure", "figure-integer-target"),
804 ("figure", "figure-next-selector"),
805 ("figure", "figure-single-target"),
806 ("filewrite", "filewrite-runmat-native"),
807 ("fill", "fill-integer-axes-handle"),
808 ("fill3", "fill3-integer-axes-handle"),
809 ("fillmissing", "fillmissing-aggregate-integer-data"),
810 ("fillmissing", "fillmissing-integer-data"),
811 ("filloutliers", "filloutliers-integer-data"),
812 ("filloutliers", "filloutliers-integer-fill-scalar"),
813 ("filloutliers", "filloutliers-numeric-outlier-locations"),
814 ("filloutliers", "filloutliers-resident-input"),
815 ("filter2", "filter2-convolution-mode"),
816 ("filter2", "filter2-integer-gpu-input"),
817 ("filter2", "filter2-logical-gpu-input"),
818 ("filter2", "filter2-nd-input"),
819 ("filter2", "filter2-variadic-options"),
820 ("filtfilt", "filtfilt-integer-input"),
821 ("filtfilt", "filtfilt-logical-input"),
822 ("flip", "flip-dimension-vector"),
823 ("flip", "flip-direction-keyword"),
824 ("flip", "flip-typed-dimension"),
825 ("find", "find-direction-only"),
826 ("find", "find-integer-sparse-input"),
827 ("findgroups", "findgroups-matrix-as-columns"),
828 ("findgroups", "findgroups-resident-input"),
829 ("findgroups", "findgroups-table-selector"),
830 ("findgroups", "findgroups-timetable-input"),
831 ("findobj", "findobj-integer-root-aliases"),
832 ("fir1", "fir1-integer-cutoff"),
833 ("fir1", "fir1-integer-order"),
834 ("fir1", "fir1-integer-window"),
835 ("fir1", "fir1-logical-cutoff"),
836 ("fir1", "fir1-logical-order"),
837 ("fir1", "fir1-logical-window"),
838 ("fir1", "fir1-single-cutoff"),
839 ("fir1", "fir1-single-order"),
840 ("fir1", "fir1-single-window"),
841 ("fopen", "fopen-integer-fileid"),
842 ("fopen", "fopen-legacy-all"),
843 ("fopen", "fopen-resident-fileid"),
844 ("fopen", "fopen-single-fileid"),
845 ("fprintf", "fprintf-integer-fileid"),
846 ("fprintf", "fprintf-integer-format"),
847 ("fprintf", "fprintf-numeric-format"),
848 ("fprintf", "fprintf-resident-fileid"),
849 ("fprintf", "fprintf-resident-format"),
850 ("fprintf", "fprintf-single-fileid"),
851 ("fprintf", "fprintf-stream-label"),
852 ("gather", "gather-recursive-container"),
853 ("kron", "kron-nd-input"),
854 ("kstest", "kstest-integer-cdf"),
855 ("kstest", "kstest-integer-sample"),
856 ("kstest", "kstest-resident-input"),
857 ("lasso", "lasso-integer-boolean"),
858 ("lasso", "lasso-integer-control"),
859 ("lasso", "lasso-integer-data"),
860 ("lasso", "lasso-integer-parameter"),
861 ("lasso", "lasso-resident-input"),
862 ("lassoglm", "lassoglm-integer-boolean"),
863 ("lassoglm", "lassoglm-integer-control"),
864 ("lassoglm", "lassoglm-integer-data"),
865 ("lassoglm", "lassoglm-integer-parameter"),
866 ("lassoglm", "lassoglm-resident-input"),
867 ("lab2rgb", "lab2rgb-explicit-gpu-input"),
868 ("ldivide", "ldivide-like-prototype"),
869 ("linprog", "linprog-integer-a"),
870 ("linprog", "linprog-integer-aeq"),
871 ("linprog", "linprog-integer-b"),
872 ("linprog", "linprog-integer-beq"),
873 ("linprog", "linprog-explicit-gpu-input"),
874 ("linprog", "linprog-integer-f"),
875 ("linprog", "linprog-integer-lb"),
876 ("linprog", "linprog-integer-ub"),
877 ("linsolve", "linsolve-explicit-gpu-two-output"),
878 ("linsolve", "linsolve-integer-input"),
879 ("linsolve", "linsolve-integer-option-control"),
880 ("linsolve", "linsolve-logical-input"),
881 ("linsolve", "linsolve-rcond-option"),
882 ("linsolve", "linsolve-text-transa-option"),
883 ("log", "log-character-input"),
884 ("log", "log-explicit-real-gpu-complex-promotion"),
885 ("log", "log-integer-input"),
886 ("log", "log-logical-input"),
887 ("log10", "log10-character-input"),
888 ("log10", "log10-explicit-real-gpu-complex-promotion"),
889 ("log10", "log10-integer-input"),
890 ("log10", "log10-logical-input"),
891 ("log1p", "log1p-character-input"),
892 ("log1p", "log1p-explicit-real-gpu-complex-promotion"),
893 ("log1p", "log1p-integer-input"),
894 ("log1p", "log1p-logical-input"),
895 ("log2", "log2-character-input"),
896 ("log2", "log2-integer-input"),
897 ("log2", "log2-logical-input"),
898 ("logical", "logical-string-array-input"),
899 ("logical", "logical-symbolic-constant-input"),
900 ("lu", "lu-integer-input"),
901 ("lu", "lu-logical-input"),
902 ("join", "join-dimension-before-delimiter"),
903 ("join", "join-resident-input"),
904 ("join", "join-typed-integer-dimension"),
905 ("jsonencode", "jsonencode-complex-input"),
906 ("jsonencode", "jsonencode-numeric-option"),
907 ("jsonencode", "jsonencode-resident-input"),
908 ("jsonencode", "jsonencode-sparse-input"),
909 ("jsonencode", "jsonencode-text-option"),
910 ("jsonencode", "jsonencode-typed-integer-option"),
911 ("gpuArray", "gpuarray-dtype-selector"),
912 ("gpuArray", "gpuarray-like"),
913 ("gpuArray", "gpuarray-size-arguments"),
914 ("gpuArray", "gpuarray-text-upload"),
915 ("gpuDevice", "gpudevice-logical-selector"),
916 ("gpuDevice", "gpudevice-provider-info"),
917 ("fread", "fread-integer-fileid"),
918 ("fread", "fread-integer-size"),
919 ("fread", "fread-integer-skip"),
920 ("fread", "fread-like"),
921 ("fread", "fread-logical-control"),
922 ("fread", "fread-resident-control"),
923 ("fread", "fread-single-control"),
924 ("freqz", "freqz-integer-coefficients"),
925 ("freqz", "freqz-integer-point-count"),
926 ("freqz", "freqz-integer-sample-rate"),
927 ("freqz", "freqz-logical-coefficients"),
928 ("freqz", "freqz-logical-point-count"),
929 ("freqz", "freqz-logical-sample-rate"),
930 ("freqz", "freqz-resident-input"),
931 ("freqz", "freqz-single-point-count"),
932 ("freqz", "freqz-single-sample-rate"),
933 ("frewind", "frewind-integer-fileid"),
934 ("frewind", "frewind-logical-fileid"),
935 ("frewind", "frewind-resident-fileid"),
936 ("frewind", "frewind-single-fileid"),
937 ("full", "full-integer-sparse"),
938 ("fwrite", "fwrite-arrow-precision"),
939 ("fwrite", "fwrite-gpu-input"),
940 ("fwrite", "fwrite-integer-fileid"),
941 ("fwrite", "fwrite-integer-skip"),
942 ("fwrite", "fwrite-logical-control"),
943 ("fwrite", "fwrite-resident-control"),
944 ("fwrite", "fwrite-single-control"),
945 ("freeBoundary", "delaunaytri-integer-topology"),
946 ("gauspuls", "gauspuls-integer-control"),
947 ("gauspuls", "gauspuls-integer-time"),
948 ("gauspuls", "gauspuls-logical-control"),
949 ("gauspuls", "gauspuls-logical-time"),
950 ("gauspuls", "gauspuls-resident-input"),
951 ("gauspuls", "gauspuls-single-control"),
952 ("gamrnd", "gamrnd-integer-scale-parameter"),
953 ("gamrnd", "gamrnd-integer-shape-parameter"),
954 ("gamrnd", "gamrnd-integer-size"),
955 ("gammaln", "gammaln-character-input"),
956 ("gammaln", "gammaln-integer-input"),
957 ("gammaln", "gammaln-logical-input"),
958 ("gradient", "gradient-integer-data"),
959 ("gradient", "gradient-integer-spacing"),
960 ("gradient", "gradient-logical-data"),
961 ("gradient", "gradient-logical-spacing"),
962 ("gray2rgb", "gray2rgb-callable"),
963 ("griddedInterpolant", "griddedinterpolant-integer-grid"),
964 ("griddedInterpolant", "griddedinterpolant-integer-query"),
965 ("griddedInterpolant", "griddedinterpolant-integer-values"),
966 ("groupcounts", "groupcounts-integer-control"),
967 ("groupcounts", "groupcounts-resident-input"),
968 ("groupsummary", "groupsummary-integer-control"),
969 ("groupsummary", "groupsummary-resident-input"),
970 ("grpstats", "grpstats-integer-alpha"),
971 ("grpstats", "grpstats-integer-data"),
972 ("grpstats", "grpstats-integer-selector"),
973 ("grpstats", "grpstats-resident-input"),
974 ("geomean", "geomean-integer-data"),
975 ("geomean", "geomean-typed-integer-control"),
976 ("gca", "gca-figure-argument"),
977 ("gca", "gca-integer-figure-alias"),
978 ("gca", "gca-struct-output"),
979 ("get", "get-integer-handle-alias"),
980 ("getenv", "getenv-cell-string-name"),
981 ("getenv", "getenv-character-matrix-name"),
982 ("getfield", "getfield-indexed-resident-field"),
983 ("getfield", "getfield-object-family"),
984 ("getfield", "getfield-textual-index"),
985 ("getmethod", "getmethod-bound-method-handle"),
986 ("getpref", "getpref-group-query"),
987 ("hour", "datetime-logical-numeric-input"),
988 ("hour", "datetime-resident-numeric-input"),
989 ("hour", "hour-typed-legacy-serial-input"),
990 ("minute", "datetime-logical-numeric-input"),
991 ("minute", "datetime-resident-numeric-input"),
992 ("minute", "minute-typed-legacy-serial-input"),
993 ("month", "datetime-logical-numeric-input"),
994 ("month", "datetime-resident-numeric-input"),
995 ("month", "month-typed-legacy-serial-input"),
996 ("htmlTree", "htmltree-broad-cell-input"),
997 ("htmlTree", "htmltree-cell-object-array"),
998 ("icdf", "icdf-integer-input"),
999 ("icdf", "icdf-logical-input"),
1000 ("image", "image-four-channel-cdata"),
1001 ("imagesc", "imagesc-four-channel-cdata"),
1002 ("imfilter", "imfilter-fill-keyword"),
1003 ("imfilter", "imfilter-valid-output-shape"),
1004 ("imhist", "imhist-typed-integer-bin-count"),
1005 ("imwrite", "imwrite-single-gif-tiff"),
1006 ("isdiag", "isdiag-integer-input"),
1007 ("isgraphics", "isgraphics-integer-handle-alias"),
1008 ("ishandle", "ishandle-integer-handle-alias"),
1009 ("ishermitian", "ishermitian-flag-aliases"),
1010 ("ishermitian", "ishermitian-integer-input"),
1011 ("ishermitian", "ishermitian-tolerance-form"),
1012 ("ismissing", "ismissing-resident-input"),
1013 ("issymmetric", "issymmetric-flag-aliases"),
1014 ("issymmetric", "issymmetric-integer-input"),
1015 ("issymmetric", "issymmetric-tolerance-form"),
1016 ("isstrprop", "isstrprop-resident-input"),
1017 ("istril", "istril-integer-input"),
1018 ("istriu", "istriu-integer-input"),
1019 ("inf", "inf-column-size-vector"),
1020 ("inf", "inf-resident-size-control"),
1021 ("input", "input-no-prompt"),
1022 ("input", "input-swapped-arguments"),
1023 ("insertAfter", "insertafter-broad-text-containers"),
1024 ("insertAfter", "insertafter-resident-position"),
1025 ("insertBefore", "insertbefore-broad-text-containers"),
1026 ("insertBefore", "insertbefore-resident-position"),
1027 ("imshow", "imshow-four-channel-image"),
1028 ("impulse", "impulse-integer-numeric-role"),
1029 ("impulse", "impulse-logical-numeric-role"),
1030 ("impulse", "impulse-resident-input"),
1031 ("impulse", "impulse-single-numeric-role"),
1032 ("ind2word", "ind2word-nonvector-indices"),
1033 ("ind2word", "ind2word-resident-indices"),
1034 ("ind2word", "ind2word-typed-integer-indices"),
1035 ("int16.empty", "empty-resident-size"),
1036 ("int32.empty", "empty-resident-size"),
1037 ("int64.empty", "empty-resident-size"),
1038 ("int8.empty", "empty-resident-size"),
1039 ("isoutlier", "isoutlier-gpu-data-variables"),
1040 ("isoutlier", "isoutlier-gpu-movmedian"),
1041 ("isoutlier", "isoutlier-gpu-sample-points"),
1042 ("isoutlier", "isoutlier-integer-data"),
1043 ("isoutlier", "isoutlier-integer-dimension"),
1044 ("isoutlier", "isoutlier-integer-threshold"),
1045 ("isoutlier", "isoutlier-integer-window"),
1046 ("ismembertol", "ismembertol-gpu-options"),
1047 ("ismembertol", "ismembertol-gpu-wide-integer-input"),
1048 ("ismembertol", "ismembertol-host-integer-data"),
1049 ("ismembertol", "ismembertol-host-logical-data"),
1050 ("ismembertol", "ismembertol-logical-tolerance-control"),
1051 ("ismembertol", "ismembertol-typed-tolerance-control"),
1052 ("issorted", "issorted-gpu-missing-placement"),
1053 ("issorted", "issorted-gpu-nonvector"),
1054 ("issortedrows", "issortedrows-gpu-input"),
1055 ("harmmean", "harmmean-integer-data"),
1056 ("harmmean", "harmmean-typed-integer-control"),
1057 ("hamming", "hamming-logical-length"),
1058 ("hann", "hann-logical-length"),
1059 ("head", "head-gpu-row-count"),
1060 ("heatmap", "heatmap-gpu-cdata"),
1061 ("heaviside", "heaviside-character-input"),
1062 ("heaviside", "heaviside-gpu-input"),
1063 ("heaviside", "heaviside-integer-input"),
1064 ("heaviside", "heaviside-logical-input"),
1065 ("hilbert", "hilbert-empty-length"),
1066 ("hilbert", "hilbert-integer-data"),
1067 ("hilbert", "hilbert-logical-data"),
1068 ("hilbert", "hilbert-logical-length"),
1069 ("hilbert", "hilbert-nd-input"),
1070 ("hilbert", "hilbert-typed-integer-length"),
1071 ("hilbert", "hilbert-zero-length"),
1072 ("hist", "hist-integer-centers"),
1073 ("hist", "hist-integer-data"),
1074 ("hist", "hist-modern-options"),
1075 ("histc", "histc-gpu-input"),
1076 ("histc", "histc-logical"),
1077 ("histc", "histc-wide-integer"),
1078 ("histcounts2", "histcounts2-extra-bin-syntax"),
1079 ("histcounts2", "histcounts2-gpu-input"),
1080 ("hypot", "hypot-character-input"),
1081 ("hypot", "hypot-integer-input"),
1082 ("hypot", "hypot-logical-input"),
1083 ("ifft", "ifft-wide-integer-controls"),
1084 ("ifft", "ifft-wide-integer-data"),
1085 ("ifft2", "ifft2-empty-zero-size"),
1086 ("ifft2", "ifft2-size-form"),
1087 ("ifft2", "ifft2-wide-integer-controls"),
1088 ("ifft2", "ifft2-wide-integer-data"),
1089 ("ifftn", "ifftn-short-size-vector"),
1090 ("ifftn", "ifftn-wide-integer-controls"),
1091 ("ifftn", "ifftn-wide-integer-data"),
1092 ("ifftn", "ifftn-zero-size-vector"),
1093 ("ifftshift", "ifftshift-multi-dimension-selector"),
1094 ("kmeans", "kmeans-integer-cluster-count"),
1095 ("kmeans", "kmeans-integer-iteration-control"),
1096 ("kmeans", "kmeans-integer-observation-data"),
1097 ("kmeans", "kmeans-integer-parallel-toggle"),
1098 ("kmeans", "kmeans-integer-start-centroids"),
1099 ("knnsearch", "knnsearch-gpu-fast-distance"),
1100 ("knnsearch", "knnsearch-gpu-include-ties"),
1101 ("knnsearch", "knnsearch-gpu-nonexhaustive-search"),
1102 ("knnsearch", "knnsearch-gpu-sort-indices"),
1103 ("knnsearch", "knnsearch-integer-floating-control"),
1104 ("knnsearch", "knnsearch-integer-logical-control"),
1105 ("knnsearch", "knnsearch-integer-observation-data"),
1106 ("knnsearch", "knnsearch-integer-structural-control"),
1107 ("kurtosis", "kurtosis-gpu-all-or-vecdim"),
1108 ("kurtosis", "kurtosis-integer-data"),
1109 ("kurtosis", "kurtosis-typed-integer-control"),
1110 ("int2str", "int2str-logical-input"),
1111 ("integral", "integral-integer-bound"),
1112 ("integral", "integral-integer-option"),
1113 ("integral", "integral-logical-bound"),
1114 ("integral", "integral-logical-numeric-option"),
1115 ("interp1", "interp1-integer-query"),
1116 ("interp1", "interp1-integer-sample"),
1117 ("interp1", "interp1-integer-extrapolation"),
1118 ("interp1", "interp1-logical-input"),
1119 ("interp1q", "interp1q-gpu-input"),
1120 ("interp1q", "interp1q-integer-data"),
1121 ("interp1q", "interp1q-integer-query"),
1122 ("interp1q", "interp1q-logical-input"),
1123 ("interp2", "interp2-integer-query"),
1124 ("interp2", "interp2-integer-sample"),
1125 ("interp2", "interp2-integer-extrapolation"),
1126 ("interp2", "interp2-logical-input"),
1127 ("inv", "inv-integer-input"),
1128 ("inv", "inv-logical-input"),
1129 ("lhsdesign", "lhsdesign-explicit-gpu-input"),
1130 ("lhsdesign", "lhsdesign-integer-dimension"),
1131 ("lhsdesign", "lhsdesign-integer-iterations"),
1132 ("lhsdesign", "lhsdesign-integer-smooth"),
1133 ("linkage", "linkage-explicit-gpu-input"),
1134 ("linkage", "linkage-integer-data"),
1135 ("linkage", "linkage-integer-distance-parameter"),
1136 ("macd", "macd-nondouble-matrix"),
1137 ("mad", "mad-integer-data"),
1138 ("mad", "mad-typed-integer-control"),
1139 ("maxk", "maxk-gpu-input"),
1140 ("meshgrid", "meshgrid-complex-axes"),
1141 ("meshgrid", "meshgrid-like"),
1142 ("minus", "minus-like-prototype"),
1143 ("mink", "mink-gpu-input"),
1144 ("mnrfit", "mnrfit-integer-control"),
1145 ("mnrfit", "mnrfit-integer-parameter"),
1146 ("mnrfit", "mnrfit-integer-x"),
1147 ("mnrfit", "mnrfit-integer-y"),
1148 ("mnrfit", "mnrfit-legacy-options"),
1149 ("mnrfit", "mnrfit-logical-x"),
1150 ("mnrfit", "mnrfit-resident-input"),
1151 ("movmad", "movmad-gpu-large-window"),
1152 ("movmax", "movmax-gpu-sample-points"),
1153 ("movmean", "movmean-gpu-sample-points"),
1154 ("movmedian", "movmedian-gpu-large-window"),
1155 ("movmedian", "movmedian-gpu-sample-points"),
1156 ("movmin", "movmin-gpu-sample-points"),
1157 ("movprod", "movprod-gpu-sample-points"),
1158 ("movstd", "movstd-gpu-sample-points"),
1159 ("movstd", "movstd-typed-integer-control"),
1160 ("movsum", "movsum-gpu-sample-points"),
1161 ("movvar", "movvar-gpu-sample-points"),
1162 ("movvar", "movvar-typed-integer-control"),
1163 ("mustBeFinite", "mustBeFinite.resident-input"),
1164 ("mustBeInteger", "mustBeInteger.resident-input"),
1165 ("mustBeNonNan", "mustBeNonNan.resident-input"),
1166 ("mustBeNonzero", "mustBeNonzero.resident-input"),
1167 ("missing", "missing-shaped-array"),
1168 ("mvnrnd", "mvnrnd-integer-count"),
1169 ("mvnrnd", "mvnrnd-integer-mu"),
1170 ("mvnrnd", "mvnrnd-integer-sigma"),
1171 ("mvnrnd", "mvnrnd-logical-input"),
1172 ("mvnrnd", "mvnrnd-resident-count"),
1173 ("nnz", "nnz-dimension-reduction"),
1174 ("nanmax", "nanmax-typed-integer-input"),
1175 ("nanmean", "nanmean-typed-integer-input"),
1176 ("nanmedian", "nanmedian-typed-integer-input"),
1177 ("nanmin", "nanmin-typed-integer-input"),
1178 ("nan", "nan-column-size-vector"),
1179 ("nan", "nan-resident-size-control"),
1180 ("nanstd", "nanstd-typed-integer-control"),
1181 ("nansum", "nansum-typed-integer-input"),
1182 ("nanvar", "nanvar-typed-integer-control"),
1183 ("nearestNeighbor", "delaunaytri-integer-coordinates"),
1184 ("norm", "norm-integer-data"),
1185 ("norm", "norm-logical-data"),
1186 ("norm", "norm-logical-order"),
1187 ("norm", "norm-nuclear-order"),
1188 ("norm", "norm-zero-order"),
1189 ("normalize", "normalize-integer-data"),
1190 ("normalize", "normalize-logical-data"),
1191 ("normalize", "normalize-resident-control"),
1192 ("normcdf", "normcdf-integer-mu"),
1193 ("normcdf", "normcdf-integer-sigma"),
1194 ("normcdf", "normcdf-integer-x"),
1195 ("normcdf", "normcdf-logical-input"),
1196 ("norminv", "norminv-integer-mu"),
1197 ("norminv", "norminv-integer-p"),
1198 ("norminv", "norminv-integer-sigma"),
1199 ("norminv", "norminv-logical-input"),
1200 ("normpdf", "normpdf-integer-mu"),
1201 ("normpdf", "normpdf-integer-sigma"),
1202 ("normpdf", "normpdf-integer-x"),
1203 ("normpdf", "normpdf-logical-input"),
1204 ("normrnd", "normrnd-integer-mu"),
1205 ("normrnd", "normrnd-integer-sigma"),
1206 ("normrnd", "normrnd-integer-size"),
1207 ("normrnd", "normrnd-logical-input"),
1208 ("normrnd", "normrnd-resident-size"),
1209 ("num2str", "num2str-explicit-gpu-input"),
1210 ("ones", "ones-column-size-vector"),
1211 ("ones", "ones-resident-size-control"),
1212 ("onehotdecode", "onehotdecode-explicit-gpu-input"),
1213 ("onehotdecode", "onehotdecode-integer-logical-encoded-input"),
1214 ("onehotdecode", "onehotdecode-logical-cell-output"),
1215 ("onehotdecode", "onehotdecode-outputtype-alias"),
1216 ("onehotencode", "onehotencode-explicit-gpu-input"),
1217 ("onehotencode", "onehotencode-outputtype-alias"),
1218 ("opentoline", "opentoline-integer-column"),
1219 ("opentoline", "opentoline-integer-line"),
1220 ("opentoline", "opentoline-resident-position"),
1221 ("or", "or-character-input"),
1222 ("or", "or-complex-input"),
1223 ("ordinal", "ordinal-explicit-gpu-input"),
1224 ("pagefun", "pagefun-host-inputs"),
1225 ("pagefun", "pagefun-text-callable"),
1226 ("pagemtimes", "pagemtimes-integer-input"),
1227 ("pan", "pan-integer-graphics-target"),
1228 ("patch", "patch-integer-axes-handle"),
1229 ("pause", "pause-gpu-input"),
1230 ("pchip", "pchip-integer-query-points"),
1231 ("pchip", "pchip-integer-sample-locations"),
1232 ("pchip", "pchip-integer-sample-values"),
1233 ("pdf", "pdf-integer-parameters"),
1234 ("pdf", "pdf-integer-x"),
1235 ("pdist", "pdist-integer-numeric-control"),
1236 ("pdist", "pdist-integer-observation-data"),
1237 ("pdist2", "pdist2-integer-numeric-control"),
1238 ("pdist2", "pdist2-integer-observation-data"),
1239 ("pdist2", "pdist2-integer-selection-count"),
1240 ("peaks", "peaks-explicit-gpu-input"),
1241 ("peaks", "peaks-typed-integer-grid-size"),
1242 ("periodogram", "periodogram-integer-numeric-control"),
1243 ("periodogram", "periodogram-integer-signal"),
1244 ("perfcurve", "perfcurve-integer-labels"),
1245 ("perfcurve", "perfcurve-integer-logical-controls"),
1246 ("perfcurve", "perfcurve-integer-numeric-options"),
1247 ("perfcurve", "perfcurve-integer-scores"),
1248 ("pie", "pie-integer-values"),
1249 ("pinv", "pinv-integer-input"),
1250 ("pinv", "pinv-integer-tolerance"),
1251 ("pinv", "pinv-logical-input"),
1252 ("pinv", "pinv-logical-tolerance"),
1253 ("plus", "plus-like-prototype"),
1254 ("pol2cart", "pol2cart-integer-rho"),
1255 ("pol2cart", "pol2cart-integer-theta"),
1256 ("pol2cart", "pol2cart-integer-z"),
1257 ("polarplot", "polarplot-complex-integer-z"),
1258 ("polyder", "polyder-integer-coefficients"),
1259 ("polyfit", "polyfit-integer-weights"),
1260 ("polyfit", "polyfit-integer-x"),
1261 ("polyfit", "polyfit-integer-y"),
1262 ("polyval", "polyval-integer-coefficients"),
1263 ("polyval", "polyval-integer-fit-options"),
1264 ("polyval", "polyval-integer-points"),
1265 ("power", "power-like-prototype"),
1266 ("pow2", "pow2-integer-binary-exponent"),
1267 ("pow2", "pow2-integer-significand"),
1268 ("pow2", "pow2-integer-unary-exponent"),
1269 ("ppval", "ppval-integer-query-points"),
1270 ("predict", "predict-integer-statistical-controls"),
1271 ("predict", "predict-integer-statistical-predictors"),
1272 ("print", "print-integer-figure-handle"),
1273 ("pskmod", "pskmod-integer-custom-order"),
1274 ("pskmod", "pskmod-integer-modulation-order"),
1275 ("pskmod", "pskmod-integer-phase-offset"),
1276 ("pointLocation", "delaunaytri-integer-coordinates"),
1277 ("pointLocation", "delaunaytri-integer-topology"),
1278 ("prctile", "prctile-integer-data"),
1279 ("prctile", "prctile-typed-integer-percentage"),
1280 ("pulstran", "pulstran-integer-delay"),
1281 ("pulstran", "pulstran-integer-parameter"),
1282 ("pulstran", "pulstran-integer-prototype"),
1283 ("pulstran", "pulstran-integer-time"),
1284 ("pulstran", "pulstran-explicit-gpu-input"),
1285 ("pwelch", "pwelch-integer-numeric-control"),
1286 ("pwelch", "pwelch-integer-signal"),
1287 ("pwelch", "pwelch-logical-input"),
1288 ("randi", "randi-implicit-prototype"),
1289 ("randi", "randi-wide-integer-output"),
1290 ("rand", "rand-column-size-vector"),
1291 ("rand", "rand-resident-size-control"),
1292 ("randn", "randn-column-size-vector"),
1293 ("randn", "randn-resident-size-control"),
1294 ("randperm", "randperm-explicit-double"),
1295 ("randperm", "randperm-like"),
1296 ("random", "random-integer-parameters"),
1297 ("random", "random-integer-size"),
1298 ("randsample", "randsample-integer-count"),
1299 ("randsample", "randsample-integer-population"),
1300 ("randsample", "randsample-integer-range"),
1301 ("randsample", "randsample-integer-replacement"),
1302 ("randsample", "randsample-integer-weights"),
1303 ("rectpuls", "rectpuls-integer-time"),
1304 ("rectpuls", "rectpuls-integer-width"),
1305 ("rectpuls", "rectpuls-explicit-gpu-input"),
1306 ("rms", "rms-integer-data"),
1307 ("rgb2lab", "rgb2lab-explicit-gpu"),
1308 ("rmse", "rmse-integer-data"),
1309 ("rmse", "rmse-integer-weights"),
1310 ("quantile", "quantile-integer-data"),
1311 ("quantile", "quantile-typed-integer-probability"),
1312 ("qqplot", "qqplot-explicit-gpu-input"),
1313 ("qqplot", "qqplot-integer-pvec"),
1314 ("qqplot", "qqplot-integer-sample"),
1315 ("qqplot", "qqplot-logical-input"),
1316 ("range", "range-explicit-nanflag"),
1317 ("range", "range-gpu-all-or-vecdim"),
1318 ("range", "range-integer-data"),
1319 ("range", "range-typed-integer-control"),
1320 ("readcell", "readcell-typed-integer-control"),
1321 ("readmatrix", "readmatrix-like-output"),
1322 ("readmatrix", "readmatrix-typed-integer-control"),
1323 ("readtable", "readtable-typed-integer-control"),
1324 ("readtimetable", "readtimetable-typed-integer-control"),
1325 ("rdivide", "rdivide-like-prototype"),
1326 ("rad2deg", "rad2deg-integer-input"),
1327 ("rad2deg", "rad2deg-logical-input"),
1328 ("regexprep", "regexprep-explicit-gpu-input"),
1329 ("removeLongWords", "removelongwords-explicit-gpu-input"),
1330 ("removeShortWords", "removeshortwords-explicit-gpu-input"),
1331 ("removeWords", "removewords-explicit-gpu-input"),
1332 ("replaceBetween", "replacebetween-explicit-gpu-input"),
1333 ("refline", "refline-explicit-gpu-coefficients"),
1334 ("refline", "refline-integer-coefficients"),
1335 ("refline", "refline-logical-coefficients"),
1336 ("sawtooth", "sawtooth-gpu-input"),
1337 ("sawtooth", "sawtooth-nondouble-input"),
1338 ("sinc", "sinc-nonfloating-input"),
1339 ("skewness", "skewness-gpu-all-or-vecdim"),
1340 ("skewness", "skewness-integer-data"),
1341 ("skewness", "skewness-typed-integer-control"),
1342 ("split", "split-advanced-options"),
1343 ("split", "split-resident-dimension"),
1344 ("split", "split-typed-dimension"),
1345 ("sparse", "sparse-integer-storage"),
1346 ("square", "square-gpu-input"),
1347 ("square", "square-nonfloating-input"),
1348 ("stackedplot", "stackedplot-explicit-gpu-input"),
1349 ("startsWith", "startswith-numeric-ignore-case"),
1350 ("startsWith", "startswith-positional-ignore-case"),
1351 ("startsWith", "startswith-resident-ignore-case"),
1352 ("startsWith", "startswith-text-ignore-case"),
1353 ("std", "std-typed-integer-control"),
1354 (
1355 "standardizeMissing",
1356 "standardize-missing-explicit-gpu-indicator",
1357 ),
1358 ("standardizeMissing", "standardize-missing-integer-data"),
1359 ("statset", "statset-integer-option-value"),
1360 ("step", "step-integer-time"),
1361 ("stepinfo", "stepinfo-integer-sampled-data"),
1362 ("stepinfo", "stepinfo-integer-threshold"),
1363 (
1364 "spreadsheetImportOptions",
1365 "spreadsheetimportoptions-typed-integer-location-control",
1366 ),
1367 ("strfind", "strfind-nonbinary-force-cell-output"),
1368 ("strfind", "strfind-resident-force-cell-output"),
1369 ("strfind", "strfind-typed-force-cell-output"),
1370 ("tabulate", "tabulate-gpu-input"),
1371 ("tabulate", "tabulate-integer-data"),
1372 ("textscan", "textscan-typed-integer-control"),
1373 ("times", "times-like-prototype"),
1374 ("tiedrank", "tiedrank-integer-data"),
1375 ("trnd", "trnd-integer-degrees-of-freedom"),
1376 ("trnd", "trnd-integer-size"),
1377 ("uint16.empty", "empty-resident-size"),
1378 ("uint32.empty", "empty-resident-size"),
1379 ("uint64.empty", "empty-resident-size"),
1380 ("uint8.empty", "empty-resident-size"),
1381 ("var", "var-typed-integer-control"),
1382 ("xor", "xor-character-input"),
1383 ("xor", "xor-complex-input"),
1384 ("lsqcurvefit", "lsqcurvefit-integer-bound"),
1385 ("lsqcurvefit", "lsqcurvefit-integer-callback-result"),
1386 ("lsqcurvefit", "lsqcurvefit-integer-option"),
1387 ("lsqcurvefit", "lsqcurvefit-integer-x0"),
1388 ("lsqcurvefit", "lsqcurvefit-integer-xdata"),
1389 ("lsqcurvefit", "lsqcurvefit-integer-ydata"),
1390 ("lsqcurvefit", "lsqcurvefit-logical-numeric"),
1391 ("lsqcurvefit", "lsqcurvefit-resident-input"),
1392 ("null", "null-integer-matrix"),
1393 ("null", "null-logical-matrix"),
1394 ("null", "null-resident-tolerance"),
1395 ("qr", "qr-integer-input"),
1396 ("qr", "qr-integer-option"),
1397 ("qr", "qr-logical-input"),
1398 ("qr", "qr-logical-option"),
1399 ("qr", "qr-resident-option"),
1400 ("rank", "rank-integer-input"),
1401 ("rank", "rank-integer-tolerance"),
1402 ("rank", "rank-logical-input"),
1403 ("rank", "rank-logical-tolerance"),
1404 ("rcond", "rcond-integer-input"),
1405 ("rcond", "rcond-logical-input"),
1406 ("ode15s", "ode15s-integer-callback-result"),
1407 ("ode15s", "ode15s-integer-option"),
1408 ("ode15s", "ode15s-integer-tspan"),
1409 ("ode15s", "ode15s-integer-y0"),
1410 ("ode15s", "ode15s-logical-numeric"),
1411 ("ode15s", "ode15s-resident-input"),
1412 ("ode23", "ode23-integer-callback-result"),
1413 ("ode23", "ode23-integer-option"),
1414 ("ode23", "ode23-integer-tspan"),
1415 ("ode23", "ode23-integer-y0"),
1416 ("ode23", "ode23-logical-numeric"),
1417 ("ode23", "ode23-resident-input"),
1418 ("ode45", "ode45-integer-callback-result"),
1419 ("ode45", "ode45-integer-option"),
1420 ("ode45", "ode45-integer-tspan"),
1421 ("ode45", "ode45-integer-y0"),
1422 ("ode45", "ode45-logical-numeric"),
1423 ("ode45", "ode45-resident-input"),
1424 ("optimoptions", "optimoptions-integer-option"),
1425 ("optimoptions", "optimoptions-resident-option"),
1426 ("optimset", "optimset-integer-option"),
1427 ("optimset", "optimset-resident-option"),
1428 ("quad", "quad-integer-bound"),
1429 ("quad", "quad-integer-callback-result"),
1430 ("quad", "quad-integer-tolerance"),
1431 ("quad", "quad-logical-numeric"),
1432 ("quad", "quad-resident-input"),
1433 ("loadobj", "loadobj-plain-payload-passthrough"),
1434 ("memmapfile", "memmapfile-explicit-gpu-argument"),
1435 ("memmapfile", "memmapfile-integer-property-controls"),
1436 ("numel", "numel-dimension-selectors"),
1437 ("regress", "regress-integer-alpha"),
1438 ("regress", "regress-integer-data"),
1439 ("resample", "resample-integer-options"),
1440 ("ridge", "ridge-integer-data"),
1441 ("ridge", "ridge-integer-k"),
1442 ("ridge", "ridge-integer-scaled"),
1443 ("rlocus", "rlocus-integer-gain"),
1444 ("rmmissing", "rmmissing-integer-dimension"),
1445 ("roots", "roots-integer-coefficients"),
1446 ("rot90", "rot90-direction-token"),
1447 ("round", "round-typed-integer-digits"),
1448 ("rref", "rref-integer-matrix"),
1449 ("rref", "rref-integer-tolerance"),
1450 ("scatterhist", "scatterhist-gpu-input"),
1451 ("scatterhist", "scatterhist-integer-data"),
1452 ("scatterhist", "scatterhist-integer-group"),
1453 ("scatterhist", "scatterhist-integer-option"),
1454 ("scatterplot", "scatterplot-integer-control"),
1455 ("scatterplot", "scatterplot-integer-data"),
1456 ("limit", "limit-numeric-expression"),
1457 ("rng", "rng-typed-state-fields"),
1458 ("rng", "rng-wide-seed"),
1459 ("sin", "sin-character-input"),
1460 ("sin", "sin-integer-input"),
1461 ("sin", "sin-like-output"),
1462 ("sin", "sin-logical-input"),
1463 ("sind", "sind-integer-input"),
1464 ("sind", "sind-logical-input"),
1465 ("single", "single-like-output"),
1466 ("sinh", "sinh-character-input"),
1467 ("sinh", "sinh-integer-input"),
1468 ("sinh", "sinh-logical-input"),
1469 ("sinpi", "sinpi-character-input"),
1470 ("sinpi", "sinpi-integer-input"),
1471 ("sinpi", "sinpi-logical-input"),
1472 ("spdiags", "spdiags-integer-control"),
1473 ("spdiags", "spdiags-integer-data"),
1474 ("spectrogram", "spectrogram-integer-numeric-control"),
1475 ("spectrogram", "spectrogram-integer-signal"),
1476 ("sphere", "sphere-typed-face-count"),
1477 ("spline", "spline-integer-query-points"),
1478 ("spline", "spline-integer-sample-locations"),
1479 ("spline", "spline-integer-sample-values"),
1480 ("splitapply", "splitapply-integer-group-vector"),
1481 ("spones", "spones-integer-input"),
1482 ("sprand", "sprand-integer-numeric-control"),
1483 ("sqrt", "sqrt-integer-input"),
1484 ("squareform", "squareform-explicit-gpu-input"),
1485 ("squareform", "squareform-integer-input"),
1486 ("ss", "ss-explicit-gpu-input"),
1487 ("ss", "ss-integer-matrix-input"),
1488 ("ss", "ss-integer-sample-time"),
1489 ("trapz", "trapz-integer-data"),
1490 ("trapz", "trapz-integer-spacing"),
1491 ("triu", "triu-paged-input"),
1492 ("triplot", "triplot-gpu-input"),
1493 ("triplot", "triplot-integer-connectivity"),
1494 ("triplot", "triplot-integer-coordinates"),
1495 ("tripuls", "tripuls-gpu-input"),
1496 ("tripuls", "tripuls-integer-controls"),
1497 ("tripuls", "tripuls-integer-sample-times"),
1498 ("true", "true-implicit-prototype"),
1499 ("true", "true-logical-class-option"),
1500 ("true", "true-resident-size-input"),
1501 ("true", "true-single-size-input"),
1502 ("tsne", "tsne-integer-data"),
1503 ("tsne", "tsne-integer-option"),
1504 ("tsne", "tsne-resident-input"),
1505 ("ttest2", "ttest2-integer-option"),
1506 ("ttest2", "ttest2-integer-sample"),
1507 (
1508 "DelaunayTri.nearestNeighbor",
1509 "delaunaytri-integer-coordinates",
1510 ),
1511 (
1512 "DelaunayTri.pointLocation",
1513 "delaunaytri-integer-coordinates",
1514 ),
1515 (
1516 "containers.Map",
1517 "containers-map-resident-constructor-input",
1518 ),
1519 (
1520 "containers.Map.isKey",
1521 "containers-map-resident-iskey-input",
1522 ),
1523 (
1524 "containers.Map.remove",
1525 "containers-map-resident-remove-input",
1526 ),
1527 (
1528 "containers.Map.subsasgn",
1529 "containers-map-resident-subsasgn-input",
1530 ),
1531 (
1532 "containers.Map.subsref",
1533 "containers-map-resident-subsref-input",
1534 ),
1535 (
1536 "containers.Map.values",
1537 "containers-map-resident-values-input",
1538 ),
1539 (
1540 "decomposition.ctranspose",
1541 "decomposition-nonfloating-input",
1542 ),
1543 (
1544 "decomposition.mtimes",
1545 "decomposition-complex-integer-scale-factor",
1546 ),
1547 (
1548 "decomposition.rdivide",
1549 "decomposition-complex-integer-scale-factor",
1550 ),
1551 (
1552 "decomposition.rdivide",
1553 "decomposition-integer-scale-factor",
1554 ),
1555 (
1556 "decomposition.times",
1557 "decomposition-complex-integer-scale-factor",
1558 ),
1559 (
1560 "detectImportOptions",
1561 "detectimportoptions-integer-num-header-lines",
1562 ),
1563 ("readtimetable", "table2timetable-numeric-row-times"),
1564 (
1565 "spreadsheetImportOptions",
1566 "spreadsheetimportoptions-typed-integer-location-control",
1567 ),
1568 (
1569 "standardizeMissing",
1570 "standardize-missing-explicit-gpu-indicator",
1571 ),
1572 ("string", "string-encoding"),
1573 ("string", "string-explicit-gpu-input"),
1574 ("string", "string-format-spec"),
1575 ("strings", "strings-fill-mode"),
1576 ("strings", "strings-like-prototype"),
1577 ("subplot", "subplot-integer-grid-control"),
1578 ("subtitle", "subtitle-integer-axes-handle"),
1579 ("svd", "svd-integer-input"),
1580 ("svd", "svd-integer-option"),
1581 ("svd", "svd-logical-input"),
1582 ("svd", "svd-logical-option"),
1583 ("swapbytes", "swapbytes-explicit-gpu-input"),
1584 ("table", "table-gpu-input"),
1585 ("table2struct", "table2struct-integer-toscalar"),
1586 ("table2timetable", "table2timetable-generated-row-times"),
1587 ("table2timetable", "table2timetable-gpu-input"),
1588 ("table2timetable", "table2timetable-numeric-row-times"),
1589 ("tan", "tan-character-input"),
1590 ("tan", "tan-integer-input"),
1591 ("tan", "tan-like-output"),
1592 ("tan", "tan-logical-input"),
1593 ("tand", "tand-character-input"),
1594 ("tand", "tand-integer-input"),
1595 ("tand", "tand-logical-input"),
1596 ("tanh", "tanh-character-input"),
1597 ("tanh", "tanh-integer-input"),
1598 ("tanh", "tanh-logical-input"),
1599 ("tcdf", "tcdf-integer-degrees-of-freedom"),
1600 ("tcdf", "tcdf-integer-x"),
1601 ("tcdf", "tcdf-logical-input"),
1602 ("tcpclient", "tcpclient-explicit-gpu-input"),
1603 ("tcpclient", "tcpclient-integer-connect-timeout"),
1604 ("tcpclient", "tcpclient-integer-port"),
1605 ("tcpclient", "tcpclient-integer-timeout"),
1606 ("tcpclient", "tcpclient-legacy-constructor-options"),
1607 ("tcpclient", "tcpclient-zero-port"),
1608 ("tcpserver", "tcpserver-explicit-gpu-input"),
1609 ("tcpserver", "tcpserver-integer-port"),
1610 ("tcpserver", "tcpserver-integer-timeout"),
1611 ("tcpserver", "tcpserver-legacy-constructor-options"),
1612 ("tcpserver", "tcpserver-zero-port"),
1613 ("test", "cvpartition-test-integer-index"),
1614 ("test", "cvpartition-test-logical-index"),
1615 ("text", "text-explicit-gpu-input"),
1616 ("text", "text-integer-axes-handle"),
1617 ("textscatter", "textscatter-explicit-gpu-input"),
1618 ("textscatter", "textscatter-integer-axes-handle"),
1619 ("textscatter3", "textscatter3-explicit-gpu-input"),
1620 ("textscatter3", "textscatter3-integer-axes-handle"),
1621 ("tf", "tf-default-discrete-sample-time"),
1622 ("tf", "tf-explicit-gpu-input"),
1623 ("tf", "tf-integer-coefficients"),
1624 ("tf", "tf-integer-sample-time"),
1625 ("tf", "tf-logical-coefficients"),
1626 ("tf", "tf-variable-shorthand-alias"),
1627 ("timeit", "timeit-explicit-gpu-num-outputs"),
1628 ("timeit", "timeit-typed-integer-num-outputs"),
1629 ("timer", "timer-explicit-gpu-numeric-property"),
1630 ("timerange", "timerange-explicit-gpu-input"),
1631 ("timerange", "timerange-numeric-bounds"),
1632 ("timerfind", "timerfind-explicit-gpu-numeric-filter"),
1633 ("timerfindall", "timerfind-explicit-gpu-numeric-filter"),
1634 ("timetable", "timetable-explicit-gpu-input"),
1635 ("timetable", "timetable-generated-row-times"),
1636 ("timetable", "timetable-numeric-row-times"),
1637 ("timetable2table", "timetable2table-explicit-gpu-input"),
1638 (
1639 "timetable2table",
1640 "timetable2table-typed-integer-convert-row-times",
1641 ),
1642 ("tinv", "tinv-integer-degrees-of-freedom"),
1643 ("tinv", "tinv-integer-probability"),
1644 ("tinv", "tinv-logical-input"),
1645 ("toc", "toc-legacy-double-timer-handle"),
1646 ("toeplitz", "toeplitz-complex-integer-input"),
1647 ("tpdf", "tpdf-integer-degrees-of-freedom"),
1648 ("tpdf", "tpdf-integer-x"),
1649 ("tpdf", "tpdf-logical-input"),
1650 ("trace", "trace-character-input"),
1651 ("trace", "trace-integer-input"),
1652 ("trace", "trace-logical-input"),
1653 (
1654 "trainWordEmbedding",
1655 "train-word-embedding-native-integer-controls",
1656 ),
1657 ("training", "cvpartition-training-integer-index"),
1658 ("training", "cvpartition-training-logical-index"),
1659 ("uitable", "uitable-explicit-gpu-data"),
1660 ("unidrnd", "unidrnd-integer-limit"),
1661 ("unidrnd", "unidrnd-integer-size"),
1662 ("unifrnd", "unifrnd-integer-lower-bound"),
1663 ("unifrnd", "unifrnd-integer-size"),
1664 ("unifrnd", "unifrnd-integer-upper-bound"),
1665 ("unwrap", "unwrap-integer-phase-data"),
1666 ("unwrap", "unwrap-integer-tolerance"),
1667 ("unwrap", "unwrap-logical-phase-data"),
1668 ("upsample", "upsample-integer-factor"),
1669 ("upsample", "upsample-integer-phase"),
1670 ("upsample", "upsample-nd-input"),
1671 ("vec2word", "vec2word-integer-k"),
1672 ("vec2word", "vec2word-integer-vectors"),
1673 ("vecnorm", "vecnorm-integer-input"),
1674 ("vecnorm", "vecnorm-integer-order"),
1675 ("view", "view-integer-angles"),
1676 ("view", "view-integer-axes-handle"),
1677 ("waitbar", "waitbar-integer-handle"),
1678 ("waitbar", "waitbar-integer-progress"),
1679 ("warning", "warning-integer-array-formatting"),
1680 ("wblinv", "wblinv-explicit-gpu-input"),
1681 ("wblinv", "wblinv-integer-probability"),
1682 ("wblinv", "wblinv-integer-scale"),
1683 ("wblinv", "wblinv-integer-shape"),
1684 ("wblinv", "wblinv-logical-input"),
1685 ("wblrnd", "wblrnd-integer-scale"),
1686 ("wblrnd", "wblrnd-integer-shape"),
1687 ("wblrnd", "wblrnd-integer-size"),
1688 ("wblrnd", "wblrnd-logical-input"),
1689 ("weboptions", "weboptions-explicit-gpu-input"),
1690 ("weboptions", "weboptions-query-parameters"),
1691 ("weboptions", "weboptions-struct-copy"),
1692 ("webread", "webread-explicit-gpu-input"),
1693 ("websave", "websave-explicit-gpu-input"),
1694 ("webwrite", "webwrite-explicit-gpu-input"),
1695 ("wordEncoding", "wordencoding-integer-max-num-words"),
1696 ("wordcloud", "wordcloud-integer-properties"),
1697 ("wordcloud", "wordcloud-numeric-parent"),
1698 ("write", "write-explicit-gpu-data"),
1699 ("write", "write-logical-data"),
1700 ("write", "write-nonvector-data"),
1701 ("write", "write-sparse-data"),
1702 ("writecell", "writecell-explicit-gpu-input"),
1703 ("writecell", "writecell-bytes-written-output"),
1704 ("writematrix", "writematrix-bytes-written-output"),
1705 ("writematrix", "writematrix-explicit-gpu-input"),
1706 ("writematrix", "writematrix-quote-strings-logical-alias"),
1707 ("writematrix", "writematrix-text-format-options"),
1708 ("writetable", "writetable-bytes-written-output"),
1709 ("writetable", "writetable-explicit-gpu-input"),
1710 ("writetable", "writetable-integer-logical-option"),
1711 ("writetimetable", "writetimetable-bytes-written-output"),
1712 ("writetimetable", "writetimetable-explicit-gpu-input"),
1713 ("writetimetable", "writetimetable-integer-logical-option"),
1714 ("xlabel", "xlabel-integer-axes-handle"),
1715 ("xlsread", "xlsread-explicit-gpu-input"),
1716 ("xlsread", "xlsread-numeric-range"),
1717 ("xlswrite", "xlswrite-explicit-gpu-input"),
1718 ("xlswrite", "xlswrite-numeric-range"),
1719 ("xtickangle", "xtickangle-integer-axes-handle"),
1720 ("xticklabels", "xticklabels-integer-axes-handle"),
1721 ("xticks", "xticks-integer-axes-handle"),
1722 ("year", "datetime-logical-numeric-input"),
1723 ("year", "datetime-resident-numeric-input"),
1724 ("year", "year-typed-legacy-serial-input"),
1725 ("ylabel", "ylabel-integer-axes-handle"),
1726 ("ytickangle", "ytickangle-integer-axes-handle"),
1727 ("yticklabels", "yticklabels-integer-axes-handle"),
1728 ("yticks", "yticks-integer-axes-handle"),
1729 ("zeros", "zeros-column-size-vector"),
1730 ("zeros", "zeros-implicit-prototype"),
1731 ("zeros", "zeros-resident-size-control"),
1732 ("zlabel", "zlabel-integer-axes-handle"),
1733 ("zoom", "zoom-integer-target-handle"),
1734 ("zplane", "zplane-nonfloating-input"),
1735 ]);
1736 assert_eq!(
1737 declared.difference(&expected).copied().collect::<Vec<_>>(),
1738 Vec::<(&str, &str)>::new(),
1739 "unexpected live extensions"
1740 );
1741 assert_eq!(
1742 expected.difference(&declared).copied().collect::<Vec<_>>(),
1743 Vec::<(&str, &str)>::new(),
1744 "missing live extensions"
1745 );
1746 }
1747
1748 #[test]
1749 fn every_builtin_extension_has_a_structured_compatibility_identifier() {
1750 for builtin in runmat_builtins::builtin_functions() {
1751 for extension in builtin.extensions {
1752 assert!(
1753 extension.error_identifier.is_some_and(|identifier| {
1754 identifier.starts_with("RunMat:compatibility:")
1755 }),
1756 "{} extension {} must use the compatibility identifier namespace",
1757 builtin.name,
1758 extension.id
1759 );
1760 }
1761 }
1762 }
1763
1764 #[test]
1765 fn core_operator_extensions_reject_before_semantic_dispatch_in_matlab_mode() {
1766 let _matlab_mode = push_runmat_extensions_enabled(false);
1767 let like_cases = [
1768 ("plus", "RunMat:compatibility:PlusLikePrototypeExtension"),
1769 ("minus", "RunMat:compatibility:MinusLikePrototypeExtension"),
1770 ("times", "RunMat:compatibility:TimesLikePrototypeExtension"),
1771 (
1772 "rdivide",
1773 "RunMat:compatibility:RdivideLikePrototypeExtension",
1774 ),
1775 ("power", "RunMat:compatibility:PowerLikePrototypeExtension"),
1776 ];
1777 for (name, identifier) in like_cases {
1778 let builtin = runmat_builtins::builtin_function_by_name(name).expect("builtin");
1779 let args = [
1780 Value::Num(2.0),
1781 Value::Num(1.0),
1782 Value::String("like".to_string()),
1783 Value::Num(0.0),
1784 ];
1785 let error = futures::executor::block_on((builtin.implementation)(&args))
1786 .expect_err("MATLAB mode must reject RunMat-only like prototype");
1787 assert_eq!(error.identifier(), Some(identifier), "{name}");
1788 }
1789
1790 for (name, identifier) in [
1791 ("or", "RunMat:compatibility:OrComplexInputExtension"),
1792 ("xor", "RunMat:compatibility:XorComplexInputExtension"),
1793 ] {
1794 let builtin = runmat_builtins::builtin_function_by_name(name).expect("builtin");
1795 let args = [Value::Complex(0.0, 1.0), Value::Bool(false)];
1796 let error = futures::executor::block_on((builtin.implementation)(&args))
1797 .expect_err("MATLAB mode must reject RunMat-only complex logical input");
1798 assert_eq!(error.identifier(), Some(identifier), "{name}");
1799 }
1800
1801 for (name, identifier) in [
1802 ("or", "RunMat:compatibility:OrCharacterInputExtension"),
1803 ("xor", "RunMat:compatibility:XorCharacterInputExtension"),
1804 ] {
1805 let builtin = runmat_builtins::builtin_function_by_name(name).expect("builtin");
1806 let args = [
1807 Value::CharArray(runmat_value::CharArray::new_row("A")),
1808 Value::Bool(false),
1809 ];
1810 let error = futures::executor::block_on((builtin.implementation)(&args))
1811 .expect_err("MATLAB mode must reject RunMat-only character logical input");
1812 assert_eq!(error.identifier(), Some(identifier), "{name}");
1813 }
1814 }
1815
1816 #[test]
1817 fn generated_builtin_catalog_matches_registered_integer_extensions() {
1818 let catalog: serde_json::Value =
1819 serde_json::from_str(include_str!("../../../docs/builtins/meta.json"))
1820 .expect("builtin metadata catalog");
1821 let builtins = catalog["builtins"].as_array().expect("builtin entries");
1822 for registered in runmat_builtins::builtin_functions()
1823 .into_iter()
1824 .filter(|builtin| !builtin.extensions.is_empty())
1825 {
1826 let name = registered.name;
1827 let exported = builtins
1828 .iter()
1829 .find(|entry| entry["name"] == name)
1830 .unwrap_or_else(|| panic!("exported {name} metadata"));
1831 assert_eq!(
1832 exported["extensions"],
1833 serde_json::to_value(registered.extensions).expect("serialize extensions"),
1834 "{name}"
1835 );
1836 }
1837 }
1838
1839 #[test]
1840 fn generated_builtin_catalog_matches_integer_epic_descriptors() {
1841 let catalog: serde_json::Value =
1842 serde_json::from_str(include_str!("../../../docs/builtins/meta.json"))
1843 .expect("builtin metadata catalog");
1844 let builtins = catalog["builtins"].as_array().expect("builtin entries");
1845 for name in [
1846 "gcd", "intmax", "intmin", "linspace", "logspace", "mod", "rem",
1847 ] {
1848 let registered = runmat_builtins::builtin_functions()
1849 .into_iter()
1850 .find(|builtin| builtin.name == name)
1851 .unwrap_or_else(|| panic!("registered {name} builtin"));
1852 let expected = serde_json::to_value(registered.descriptor.expect("public descriptor"))
1853 .expect("serialize descriptor");
1854 let mut exported = builtins
1855 .iter()
1856 .find(|entry| entry["name"] == name)
1857 .unwrap_or_else(|| panic!("exported {name} metadata"))
1858 .clone();
1859 exported
1860 .as_object_mut()
1861 .expect("catalog entry object")
1862 .remove("name");
1863 exported
1864 .as_object_mut()
1865 .expect("catalog entry object")
1866 .remove("integer_capabilities");
1867 assert_eq!(exported, expected, "{name} descriptor");
1868 }
1869 }
1870
1871 #[test]
1872 fn integer_capability_metadata_is_complete_and_well_formed_for_settled_apis() {
1873 let registered = runmat_builtins::builtin_functions();
1874 for builtin in ®istered {
1875 assert!(
1876 builtin.integer_capabilities.is_empty() || builtin.integer_audit.is_none(),
1877 "{} cannot carry both integer capabilities and an audit disposition",
1878 builtin.name
1879 );
1880 }
1881 for name in [
1882 "DataArray.fill",
1883 "DataArray.read",
1884 "DataArray.resize",
1885 "DataArray.write",
1886 "DataTransaction.create_array",
1887 "DataTransaction.fill",
1888 "DataTransaction.resize",
1889 "DataTransaction.set_attr",
1890 "DataTransaction.set_attrs",
1891 "DataTransaction.write",
1892 "Dataset.attrs",
1893 "Dataset.get_attr",
1894 "Dataset.set_attr",
1895 "Dataset.set_attrs",
1896 "DelaunayTri",
1897 "DelaunayTri.freeBoundary",
1898 "DelaunayTri.nearestNeighbor",
1899 "DelaunayTri.pointLocation",
1900 "circshift",
1901 "corr",
1902 "corrcoef",
1903 "corrcov",
1904 "cov",
1905 "cov2corr",
1906 "cummax",
1907 "cummin",
1908 "cumprod",
1909 "cumsum",
1910 "db",
1911 "factor",
1912 "factorial",
1913 "freeBoundary",
1914 "gcd",
1915 "histcounts",
1916 "idivide",
1917 "imshow",
1918 "intersect",
1919 "ismember",
1920 "isprime",
1921 "issorted",
1922 "lcm",
1923 "max",
1924 "maxk",
1925 "mean",
1926 "median",
1927 "min",
1928 "mink",
1929 "mod",
1930 "mpower",
1931 "movmax",
1932 "movmean",
1933 "movmedian",
1934 "movmin",
1935 "movprod",
1936 "movstd",
1937 "movsum",
1938 "movvar",
1939 "nanmax",
1940 "nanmean",
1941 "nanmedian",
1942 "nanmin",
1943 "nanstd",
1944 "nansum",
1945 "nanvar",
1946 "nearestNeighbor",
1947 "nchoosek",
1948 "num2cell",
1949 "pskmod",
1950 "polyint",
1951 "pointLocation",
1952 "primes",
1953 "qammod",
1954 "rem",
1955 "setdiff",
1956 "setxor",
1957 "sort",
1958 "std",
1959 "sum",
1960 "trnd",
1961 "union",
1962 "var",
1963 "bounds",
1964 "prod",
1965 "accept",
1966 "area",
1967 "array2table",
1968 "atan2",
1969 "audioread",
1970 "axes",
1971 "axis",
1972 "bagOfNgrams",
1973 "bagOfWords",
1974 "bandwidth",
1975 "bitand",
1976 "bitor",
1977 "bitshift",
1978 "blackman",
1979 "blanks",
1980 "blkdiag",
1981 "bootstrp",
1982 "boxplot",
1983 "bsxfun",
1984 "builtin",
1985 "butter",
1986 "buttord",
1987 "cat",
1988 "cdf",
1989 "cdfplot",
1990 "ceil",
1991 "cell",
1992 "cell2mat",
1993 "cell2struct",
1994 "cell2table",
1995 "cellfun",
1996 "char",
1997 "cheb2ord",
1998 "chi2cdf",
1999 "chol",
2000 "class",
2001 "classify",
2002 "clf",
2003 "close",
2004 "colon",
2005 "colorcube",
2006 "colormap",
2007 "colororder",
2008 "combinations",
2009 "complex",
2010 "compose",
2011 "cond",
2012 "confusionmat",
2013 "conj",
2014 "containers.Map",
2015 "containers.Map.isKey",
2016 "containers.Map.keys",
2017 "containers.Map.remove",
2018 "containers.Map.subsasgn",
2019 "containers.Map.subsref",
2020 "containers.Map.values",
2021 "contour",
2022 "contourf",
2023 "conv",
2024 "conv2",
2025 "copyobj",
2026 "cos",
2027 "cosd",
2028 "cosh",
2029 "cosineSimilarity",
2030 "cospi",
2031 "cross",
2032 "contains",
2033 "convertCharsToStrings",
2034 "convertContainedStringsToChars",
2035 "convertStringsToChars",
2036 "dbstack",
2037 "disp",
2038 "display",
2039 "data.create",
2040 "error",
2041 "errorbar",
2042 "erf",
2043 "erfcinv",
2044 "exp",
2045 "expm1",
2046 "exprnd",
2047 "extractAfter",
2048 "extractBefore",
2049 "extractBetween",
2050 "extractFileText",
2051 "eye",
2052 "false",
2053 "fclose",
2054 "fcontour",
2055 "feedback",
2056 "fea.boundaryCondition",
2057 "fea.domain",
2058 "fea.interface",
2059 "fea.loadCase",
2060 "fea.material",
2061 "fea.results",
2062 "fea.runOptions",
2063 "fea.trends",
2064 "feof",
2065 "fitclinear",
2066 "fitctree",
2067 "fitdist",
2068 "fitlm",
2069 "fminbnd",
2070 "fminunc",
2071 "fsolve",
2072 "fzero",
2073 "gradient",
2074 "gray2rgb",
2075 "griddedInterpolant",
2076 "groupcounts",
2077 "groupsummary",
2078 "grp2idx",
2079 "grpstats",
2080 "gt",
2081 "hamming",
2082 ] {
2083 let builtin = registered
2084 .iter()
2085 .find(|builtin| builtin.name == name)
2086 .unwrap_or_else(|| panic!("registered {name} builtin"));
2087 assert!(
2088 !builtin.integer_capabilities.is_empty(),
2089 "{name} integer capabilities"
2090 );
2091 for capability in builtin.integer_capabilities {
2092 assert!(!capability.form.is_empty(), "{name} form");
2093 assert!(
2094 !capability.inputs.is_empty()
2095 || capability.output_class
2096 != runmat_builtins::BuiltinIntegerOutputClassRule::NotApplicable,
2097 "{name} inputs or integer output"
2098 );
2099 assert!(!capability.notes.is_empty(), "{name} notes");
2100 for input in capability.inputs {
2101 assert!(!input.notes.is_empty(), "{name}:{} notes", input.name);
2102 match input.availability {
2103 runmat_builtins::BuiltinIntegerInputAvailability::Rejected => {
2104 assert!(
2105 input.classes.is_empty(),
2106 "{name}:{} rejected class mask",
2107 input.name
2108 );
2109 assert_eq!(
2110 input.scalar_double,
2111 runmat_builtins::BuiltinIntegerScalarDoubleRule::NotApplicable,
2112 "{name}:{} rejected scalar-double rule",
2113 input.name
2114 );
2115 }
2116 runmat_builtins::BuiltinIntegerInputAvailability::Documented
2117 | runmat_builtins::BuiltinIntegerInputAvailability::RunMatOnly => {
2118 assert!(
2119 !input.classes.is_empty(),
2120 "{name}:{} accepted class mask",
2121 input.name
2122 );
2123 }
2124 }
2125 for (index, class) in input.classes.iter().enumerate() {
2126 assert!(
2127 !input.classes[..index].contains(class),
2128 "{name}:{} duplicate {class:?}",
2129 input.name
2130 );
2131 }
2132 }
2133 }
2134 if builtin.integer_capabilities.iter().any(|capability| {
2135 capability.inputs.iter().any(|input| {
2136 input.availability
2137 == runmat_builtins::BuiltinIntegerInputAvailability::RunMatOnly
2138 })
2139 }) {
2140 assert!(
2141 !builtin.extensions.is_empty(),
2142 "{name} RunMat-only integer input requires extension metadata"
2143 );
2144 }
2145 }
2146 }
2147
2148 #[test]
2149 fn integer_audit_dispositions_are_complete_and_well_formed() {
2150 let registered = runmat_builtins::builtin_functions();
2151 let mut audited = std::collections::BTreeMap::new();
2152 for builtin in ®istered {
2153 let Some(audit) = builtin.integer_audit else {
2154 continue;
2155 };
2156 if let Some(previous) = audited.insert(builtin.name, audit) {
2157 assert_eq!(previous, audit, "{} duplicate integer audit", builtin.name);
2158 }
2159 }
2160 assert_eq!(
2161 audited.keys().copied().collect::<Vec<_>>(),
2162 [
2163 "DataArray.chunk_shape",
2164 "DataArray.codec",
2165 "DataArray.dtype",
2166 "DataArray.name",
2167 "DataArray.rank",
2168 "DataArray.shape",
2169 "DataTransaction.abort",
2170 "DataTransaction.commit",
2171 "DataTransaction.delete_array",
2172 "DataTransaction.id",
2173 "DataTransaction.status",
2174 "Dataset.array",
2175 "Dataset.arrays",
2176 "Dataset.begin",
2177 "Dataset.has_array",
2178 "Dataset.id",
2179 "Dataset.path",
2180 "Dataset.refresh",
2181 "Dataset.snapshot",
2182 "Dataset.version",
2183 "addDependencyDetails",
2184 "addEntityDetails",
2185 "addLemmaDetails",
2186 "addPartOfSpeechDetails",
2187 "addSentenceDetails",
2188 "addTypeDetails",
2189 "addlistener",
2190 "addprop",
2191 "ancestor",
2192 "append",
2193 "argsort",
2194 "cancel",
2195 "caxis",
2196 "cellstr",
2197 "clearCache",
2198 "commit",
2199 "data.copy",
2200 "data.delete",
2201 "data.exists",
2202 "data.export",
2203 "data.import",
2204 "data.inspect",
2205 "data.list",
2206 "data.move",
2207 "data.open",
2208 "deblank",
2209 "erasePunctuation",
2210 "eraseURLs",
2211 "exist",
2212 "extractHTMLText",
2213 "fea.compare",
2214 "fea.field",
2215 "fea.materialAssignment",
2216 "fea.model",
2217 "fea.plan",
2218 "fea.plot",
2219 "fea.run",
2220 "fea.step",
2221 "fea.study",
2222 "fea.sweep",
2223 "fea.validate",
2224 "fieldnames",
2225 "fileattrib",
2226 "fileparts",
2227 "fileread",
2228 "findElement",
2229 "findprop",
2230 "func2str",
2231 "functions",
2232 "genvarname",
2233 "geometry.listRegions",
2234 "geometry.meshes",
2235 "getAttribute",
2236 "getenv",
2237 "getmethod",
2238 "hgload",
2239 "hgsave",
2240 "htmlTree",
2241 "input",
2242 "isStringScalar",
2243 "isVocabularyWord",
2244 "iscategorical",
2245 "iscell",
2246 "iscellstr",
2247 "ischar",
2248 "iscolumn",
2249 "isdeployed",
2250 "isdiag",
2251 "isempty",
2252 "isenv",
2253 "isfield",
2254 "isfile",
2255 "isfolder",
2256 "isgraphics",
2257 "ishandle",
2258 "ishermitian",
2259 "isletter",
2260 "islogical",
2261 "ismatrix",
2262 "ismethod",
2263 "isobject",
2264 "isordinal",
2265 "ispref",
2266 "isrow",
2267 "isscalar",
2268 "isspace",
2269 "isstable",
2270 "isstring",
2271 "issymmetric",
2272 "istable",
2273 "istimetable",
2274 "istril",
2275 "istriu",
2276 "isvalid",
2277 "isvarname",
2278 "isvector",
2279 "jsondecode",
2280 "legend",
2281 "lower",
2282 "matches",
2283 "matlab.metadata.DynamicProperty.delete",
2284 "memoize",
2285 "mustBeFile",
2286 "mustBeFolder",
2287 "mustBeNonzeroLengthText",
2288 "mustBeText",
2289 "mustBeTextScalar",
2290 "mustBeValidVariableName",
2291 "namedargs2cell",
2292 "normalizeWords",
2293 "notify",
2294 "onCleanup",
2295 "openfig",
2296 "pattern",
2297 "readWordEmbedding",
2298 "readline",
2299 "regexp",
2300 "regexpPattern",
2301 "regexpi",
2302 "removeStopWords",
2303 "replace",
2304 "rethrow",
2305 "reverse",
2306 "rmpath",
2307 "rowfilter",
2308 "saveas",
2309 "savefig",
2310 "saveobj",
2311 "second",
2312 "sendmail",
2313 "splitlines",
2314 "stats",
2315 "str2double",
2316 "str2func",
2317 "str2num",
2318 "strcat",
2319 "strcmp",
2320 "strcmpi",
2321 "strip",
2322 "strjoin",
2323 "strjust",
2324 "strlength",
2325 "strrep",
2326 "strsplit",
2327 "strtok",
2328 "strtrim",
2329 "superclasses",
2330 "suptitle",
2331 "system",
2332 "tokenDetails",
2333 "tokenizedDocument",
2334 "uigetfile",
2335 "uiputfile",
2336 "unsetenv",
2337 "upper",
2338 "urldecode",
2339 "urlencode",
2340 "userpath",
2341 "validateFunctionSignaturesJSON",
2342 "vartype",
2343 "verLessThan",
2344 "version",
2345 "what",
2346 "word2ind",
2347 "word2vec",
2348 "writeWordEmbedding",
2349 "writelines",
2350 "xmlread",
2351 "xticklabels",
2352 "yticklabels",
2353 "zero",
2354 ]
2355 );
2356 for (name, audit) in audited {
2357 assert!(!audit.notes.is_empty(), "{name} integer audit notes");
2358 match audit.kind {
2359 runmat_builtins::BuiltinIntegerAuditKind::AliasOf => {
2360 let canonical = audit
2361 .canonical_builtin
2362 .unwrap_or_else(|| panic!("{name} alias target"));
2363 assert_ne!(canonical, name, "{name} cannot alias itself");
2364 let target = registered
2365 .iter()
2366 .find(|builtin| builtin.name == canonical)
2367 .unwrap_or_else(|| panic!("{name} registered alias target {canonical}"));
2368 assert!(
2369 !target.integer_capabilities.is_empty(),
2370 "{name} alias target {canonical} must carry integer capabilities"
2371 );
2372 }
2373 runmat_builtins::BuiltinIntegerAuditKind::NotApplicable => {
2374 assert_eq!(
2375 audit.canonical_builtin, None,
2376 "{name} inapplicable audit cannot name a canonical builtin"
2377 );
2378 }
2379 }
2380 }
2381 }
2382
2383 #[test]
2384 fn generated_builtin_catalog_matches_integer_metadata() {
2385 let catalog: serde_json::Value =
2386 serde_json::from_str(include_str!("../../../docs/builtins/meta.json"))
2387 .expect("builtin metadata catalog");
2388 let builtins = catalog["builtins"].as_array().expect("builtin entries");
2389 for registered in runmat_builtins::builtin_functions()
2390 .into_iter()
2391 .filter(|builtin| {
2392 !builtin.integer_capabilities.is_empty() || builtin.integer_audit.is_some()
2393 })
2394 {
2395 let name = registered.name;
2396 let exported = builtins
2397 .iter()
2398 .find(|entry| entry["name"] == name)
2399 .unwrap_or_else(|| panic!("exported {name} metadata"));
2400 let expected_capabilities = (!registered.integer_capabilities.is_empty()).then(|| {
2401 serde_json::to_value(registered.integer_capabilities)
2402 .expect("serialize integer capabilities")
2403 });
2404 assert_eq!(
2405 exported.get("integer_capabilities"),
2406 expected_capabilities.as_ref(),
2407 "{name}"
2408 );
2409 let expected_audit = registered
2410 .integer_audit
2411 .map(|audit| serde_json::to_value(audit).expect("serialize integer audit"));
2412 assert_eq!(
2413 exported.get("integer_audit"),
2414 expected_audit.as_ref(),
2415 "{name} integer audit"
2416 );
2417 }
2418 }
2419}