mlx-sys 0.0.10-alpha

Rust bindings for mlx
#include "mlx/linalg.h"

#include "mlx-cxx/mlx_cxx.hpp"
#include "mlx-cxx/linalg.hpp"

namespace mlx_cxx {
    std::optional<std::vector<int>> to_std_optional(const OptionalAxis &opt) {
        switch (opt.tag) {
            case OptionalAxis::Tag::None:
                return std::nullopt;
            case OptionalAxis::Tag::Some:
                return *opt.payload.some;
        }
    }

    std::unique_ptr<mlx::core::array> norm_ord(
        const mlx::core::array &a,
        const double ord,
        const OptionalAxis &axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto axis_std = to_std_optional(axis);
        auto array = mlx::core::linalg::norm(a, ord, axis_std, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }

    std::unique_ptr<mlx::core::array> norm_ord_axis(
        const mlx::core::array& a,
        const double ord,
        int axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto array = mlx::core::linalg::norm(a, ord, axis, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }

    std::unique_ptr<mlx::core::array> norm_str_ord(
        const mlx::core::array& a,
        const std::string& ord,
        const OptionalAxis &axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto axis_std = to_std_optional(axis);
        auto array = mlx::core::linalg::norm(a, ord, axis_std, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }

    std::unique_ptr<mlx::core::array> norm_str_ord_axis(
        const mlx::core::array& a,
        const std::string& ord,
        int axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto array = mlx::core::linalg::norm(a, ord, axis, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }

    std::unique_ptr<mlx::core::array> norm(
        const mlx::core::array& a,
        const OptionalAxis &axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto axis_std = to_std_optional(axis);
        auto array = mlx::core::linalg::norm(a, axis_std, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }

    std::unique_ptr<mlx::core::array> norm_axis(
        const mlx::core::array& a,
        int axis,
        bool keepdims,
        mlx_cxx::StreamOrDevice s)
    {
        auto array = mlx::core::linalg::norm(a, axis, keepdims, s.to_variant());
        return std::make_unique<mlx::core::array>(array);
    }
}