Skip to main content

runmat_runtime/
compatibility.rs

1//! Active language compatibility policy for runtime builtin dispatch.
2
3use 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
11/// Runtime release identity for RunMat's compatibility version pin. Keep this
12/// paired with `MATLAB_COMPATIBILITY_VERSION`; the reader-facing source of
13/// truth is `docs/getting-started/compatability.md`.
14pub const MATLAB_COMPATIBILITY_RELEASE: &str = "R2026a";
15
16/// Numeric product version corresponding to `MATLAB_COMPATIBILITY_RELEASE`.
17pub const MATLAB_COMPATIBILITY_VERSION: &str = "26.1";
18
19runmat_thread_local! {
20    static RUNMAT_EXTENSIONS_ENABLED: Cell<bool> = const { Cell::new(false) };
21}
22
23/// Returns whether the current execution may use deliberately classified
24/// RunMat-only builtin forms.
25pub 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
32/// Set the extension policy for subsequent builtin dispatch on this thread.
33pub 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
41/// Seed a standalone runtime context from the legacy thread-local extension
42/// policy before entering that context's scope.
43pub 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
69/// Reject a RunMat-only sparse integer result at a MATLAB-compatible language boundary.
70pub fn ensure_sparse_integer_extension_enabled(context: &str) -> Result<(), RuntimeError> {
71    ensure_builtin_extension_enabled(&SPARSE_INTEGER_EXTENSION, context)
72}
73
74/// Enforce the sparse-integer extension policy recursively for a public result.
75pub 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
120/// Temporarily replace the extension policy and restore it on drop.
121pub 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 &registered {
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 &registered {
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}