2023-12-01 03:12:53 +08:00
|
|
|
// Copyright © 2023 Apple Inc.
|
|
|
|
|
2023-11-30 02:52:08 +08:00
|
|
|
#pragma once
|
|
|
|
|
2024-12-02 23:03:03 +08:00
|
|
|
#include <unordered_map>
|
|
|
|
|
2023-11-30 02:52:08 +08:00
|
|
|
#include "mlx/array.h"
|
|
|
|
|
|
|
|
namespace mlx::core {
|
|
|
|
|
2024-02-08 05:15:59 +08:00
|
|
|
struct NodeNamer {
|
|
|
|
std::unordered_map<std::uintptr_t, std::string> names;
|
|
|
|
|
|
|
|
const std::string& get_name(const array& x);
|
2025-01-07 05:07:46 +08:00
|
|
|
void set_name(const array& x, std::string n);
|
2024-02-08 05:15:59 +08:00
|
|
|
};
|
|
|
|
|
2025-01-07 05:07:46 +08:00
|
|
|
void print_graph(
|
|
|
|
std::ostream& os,
|
|
|
|
NodeNamer namer,
|
|
|
|
const std::vector<array>& outputs);
|
|
|
|
|
|
|
|
inline void print_graph(std::ostream& os, const std::vector<array>& outputs) {
|
|
|
|
print_graph(os, NodeNamer{}, outputs);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename... Arrays, typename = enable_for_arrays_t<Arrays...>>
|
|
|
|
inline void print_graph(std::ostream& os, Arrays&&... outputs) {
|
|
|
|
print_graph(
|
|
|
|
os, NodeNamer{}, std::vector<array>{std::forward<Arrays>(outputs)...});
|
|
|
|
}
|
2023-11-30 02:52:08 +08:00
|
|
|
|
2024-03-26 05:55:54 +08:00
|
|
|
template <typename... Arrays, typename = enable_for_arrays_t<Arrays...>>
|
2025-01-07 05:07:46 +08:00
|
|
|
inline void
|
|
|
|
print_graph(std::ostream& os, NodeNamer namer, Arrays&&... outputs) {
|
|
|
|
print_graph(
|
|
|
|
os,
|
|
|
|
std::move(namer),
|
|
|
|
std::vector<array>{std::forward<Arrays>(outputs)...});
|
2023-11-30 02:52:08 +08:00
|
|
|
}
|
|
|
|
|
2025-01-07 05:07:46 +08:00
|
|
|
void export_to_dot(
|
|
|
|
std::ostream& os,
|
|
|
|
NodeNamer namer,
|
|
|
|
const std::vector<array>& outputs);
|
|
|
|
|
|
|
|
inline void export_to_dot(std::ostream& os, const std::vector<array>& outputs) {
|
|
|
|
export_to_dot(os, NodeNamer{}, outputs);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename... Arrays, typename = enable_for_arrays_t<Arrays...>>
|
|
|
|
inline void export_to_dot(std::ostream& os, Arrays&&... outputs) {
|
|
|
|
export_to_dot(
|
|
|
|
os, NodeNamer{}, std::vector<array>{std::forward<Arrays>(outputs)...});
|
|
|
|
}
|
2023-11-30 02:52:08 +08:00
|
|
|
|
2024-03-26 05:55:54 +08:00
|
|
|
template <typename... Arrays, typename = enable_for_arrays_t<Arrays...>>
|
2025-01-07 05:07:46 +08:00
|
|
|
inline void
|
|
|
|
export_to_dot(std::ostream& os, NodeNamer namer, Arrays&&... outputs) {
|
|
|
|
export_to_dot(
|
|
|
|
os,
|
|
|
|
std::move(namer),
|
|
|
|
std::vector<array>{std::forward<Arrays>(outputs)...});
|
2023-11-30 02:52:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mlx::core
|