// Copyright © 2024 Apple Inc. #include "mlx/export.h" #include #include "mlx/compile_impl.h" #include "mlx/fast_primitives.h" #include "mlx/primitives.h" #include "mlx/utils.h" #include "mlx/version.h" // clang-format off #define SERIALIZE_PRIMITIVE(primitive, ...) \ { \ #primitive, { \ serialize_primitive, \ deserialize_primitive, \ {__VA_ARGS__} \ } \ } // clang-format on bool is_big_endian() { int num = 1; return *reinterpret_cast(&num) != 1; } namespace mlx::core { using namespace mlx::core::fast; using Reader = io::ParallelFileReader; using Writer = io::FileWriter; struct PrimitiveSerializer { using Serializer = std::function; using Deserializer = std::function(Reader&, Stream s)>; PrimitiveSerializer( Serializer serialize, Deserializer deserialize, std::vector keys = {}) : serialize(std::move(serialize)), deserialize(std::move(deserialize)), keys(std::move(keys)) {}; Serializer serialize; Deserializer deserialize; std::vector keys; }; template constexpr bool is_iterable = false; template constexpr bool is_iterable< T, std::void_t< decltype(std::declval().begin()), decltype(std::declval().end())>> = true; template