Skip to content

MLX compatibility: Manipulation functions #462

Description

@aaishwarymishra
Array API MLX Analog Status Notes Test Node Result
broadcast_arrays(*arrays) broadcast_arrays(*arrays, stream=None) -> list[array] incompatible Array API 2025.12 requires a tuple of arrays; MLX returns a list. test_broadcast_arrays Failed
broadcast_shapes(*shapes) broadcast_shapes(*shapes) compatible MLX returns the expected broadcasted shape. TestBroadcastShapes::test_broadcast_shapes Passed
broadcast_to(x, /, shape) broadcast_to(array, shape, *, stream=None) compatible Required broadcasting behavior passes. MLX adds the optional stream extension. test_broadcast_to Passed
concat(arrays, /, *, axis=0) concat(arrays: list[array], axis: int | None = 0, *, stream=None) compatible Required behavior passes. MLX additionally accepts axis=None, positional axis, and stream. test_concat Passed
expand_dims(x, /, axis) expand_dims(a, /, axis: int | Sequence[int], *, stream=None) partial Tuple-axis coverage passes, but MLX incorrectly rejects a valid negative insertion axis at the lower boundary. TestExpandDims::test_expand_dims; TestExpandDims::test_expand_dims_tuples Failed / Passed
flip(x, /, *, axis=None) flip(a, /, axis: None | int | Sequence[int] = None, *, stream=None) compatible Passes for None, integer, and tuple axes. MLX additionally permits positional axis. test_flip Passed
moveaxis(x, source, destination, /) moveaxis(a, /, source: int, destination: int, *, stream=None) incompatible Array API accepts integers or tuples for source and destination; MLX accepts only scalar integers and rejects valid calls such as moveaxis(x, (), ()). test_moveaxis Failed
permute_dims(x, /, axes) permute_dims(a, /, axes: Sequence[int] | None = None, *, stream=None) compatible Required axis permutation behavior passes. MLX additionally permits omitted or None axes. test_permute_dims Passed
repeat(x, repeats, /, *, axis=None) repeat(array: array, repeats: int, axis: int | None = None, *, stream=None) partial Array API allows scalar or 1D integer-array repeats, while MLX documents only scalar integers. test_repeat Failed
reshape(x, /, shape, *, copy=None) reshape(a, /, shape: Sequence[int], *, stream=None) partial Tested behavior passes, but MLX lacks the standard copy keyword and therefore cannot accept all conforming calls. test_reshape Passed
roll(x, /, shift, *, axis=None) roll(a, shift: int | tuple[int], axis: None | int | tuple[int] = None, /, *, stream=None) partial Tested behavior passes, but MLX makes shift and axis positional-only. Array API permits keyword shift and requires axis to be keyword-only. test_roll Passed
squeeze(x, /, axis) squeeze(a, /, axis: None | int | Sequence[int] = None, *, stream=None) compatible Integer and tuple-axis behavior passes. MLX additionally allows omitted or None axes. test_squeeze Passed
stack(arrays, /, *, axis=0) stack(arrays: list[array], axis: int | None = 0, *, stream=None) compatible Required behavior passes. MLX additionally accepts positional axis, axis=None, and stream. test_stack Passed
tile(x, repetitions, /) tile(a, reps: int | Sequence[int], /, *, stream=None) compatible Required tiling behavior passes. The parameter-name difference is irrelevant because it is positional-only. test_tile Passed
unstack(x, /, *, axis=0) unstack(x, /, *, axis: int = 0, stream=None) -> list[array] incompatible Array API requires a tuple of arrays; MLX returns a list, including [] instead of () for an empty axis. test_unstack Failed

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions