docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
broadcast_node.h
Go to the documentation of this file.
1#pragma once
2
4
6
7namespace sdfg {
8namespace math {
9namespace tensor {
10
12
13class BroadcastNode : public TensorNode {
14private:
15 std::vector<symbolic::Expression> input_shape_;
16 std::vector<symbolic::Expression> output_shape_;
17 // true: leading-alignment (linalg.broadcast); false: trailing-alignment (NumPy/PyTorch).
18 bool padded_;
19
20public:
22 size_t element_id,
23 const DebugInfo& debug_info,
26 const std::vector<symbolic::Expression>& input_shape,
27 const std::vector<symbolic::Expression>& output_shape,
28 bool padded = true
29 );
30
31 static auto constexpr RESULT_PTR_IDX = 0;
32 static auto constexpr X_INPUT_IDX = 1;
33
34 void validate(const Function& function) const override;
35
36 const std::vector<symbolic::Expression>& input_shape() const {
37 return input_shape_;
38 }
39 const std::vector<symbolic::Expression>& output_shape() const {
40 return output_shape_;
41 }
42 bool padded() const {
43 return padded_;
44 }
45
46 symbolic::SymbolSet symbols() const override;
47
48 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override;
49
50 void replace(const symbolic::ExpressionMapping& replacements) override;
51
52 bool supports_integer_types() const override {
53 return true;
54 }
55
58
59 std::unique_ptr<data_flow::DataFlowNode>
60 clone(size_t element_id, const graph::Vertex vertex, data_flow::DataFlowGraph& parent) const override;
61
63};
64
66public:
67 nlohmann::json serialize(const data_flow::LibraryNode& library_node) override {
68 const BroadcastNode& reduce_node = static_cast<const BroadcastNode&>(library_node);
69 nlohmann::json j;
70
71 j["code"] = reduce_node.code().value();
72
74 j["input_shape"] = nlohmann::json::array();
75 for (auto& dim : reduce_node.input_shape()) {
76 j["input_shape"].push_back(serializer.expression(dim));
77 }
78
79 j["output_shape"] = nlohmann::json::array();
80 for (auto& dim : reduce_node.output_shape()) {
81 j["output_shape"].push_back(serializer.expression(dim));
82 }
83
84 j["padded"] = reduce_node.padded();
85
86 return j;
87 }
88
91 ) override {
92 // Assertions for required fields
93 assert(j.contains("element_id"));
94 assert(j.contains("code"));
95 assert(j.contains("debug_info"));
96 assert(j.contains("input_shape"));
97 assert(j.contains("output_shape"));
98
99 auto code = j["code"].get<std::string>();
100
101 std::vector<symbolic::Expression> input_shape;
102 for (const auto& dim : j["input_shape"]) {
103 input_shape.push_back(symbolic::parse(dim.get<std::string>()));
104 }
105
106 std::vector<symbolic::Expression> output_shape;
107 for (const auto& dim : j["output_shape"]) {
108 output_shape.push_back(symbolic::parse(dim.get<std::string>()));
109 }
110
111 bool padded = j.value("padded", true);
112
113 // Extract debug info using JSONSerializer
115 DebugInfo debug_info = serializer.json_to_debug_info(j["debug_info"]);
116
117 return builder.add_library_node<BroadcastNode>(parent, debug_info, input_shape, output_shape, padded);
118 }
119};
120
121} // namespace tensor
122} // namespace math
123} // namespace sdfg
Definition element.h:30
size_t element_id() const
const DebugInfo & debug_info() const
Definition function.h:43
std::string value() const
Definition exceptions.h:47
Note: Even though the class references unique_ptr, it will never delete an SDFG it has a reference to...
Definition structured_sdfg_builder.h:44
Definition data_flow_graph.h:29
graph::Vertex vertex() const
Get the graph vertex for this node.
Base class for all library nodes in the dataflow graph.
Definition library_node.h:106
const LibraryNodeCode & code() const
Get the operation code.
Definition broadcast_node.h:65
data_flow::LibraryNode & deserialize(const nlohmann::json &j, builder::StructuredSDFGBuilder &builder, structured_control_flow::Block &parent) override
Deserialize a library node from JSON.
Definition broadcast_node.h:89
nlohmann::json serialize(const data_flow::LibraryNode &library_node) override
Serialize a library node to JSON.
Definition broadcast_node.h:67
Definition broadcast_node.h:13
static auto constexpr RESULT_PTR_IDX
Definition broadcast_node.h:31
static auto constexpr X_INPUT_IDX
Definition broadcast_node.h:32
bool padded() const
Definition broadcast_node.h:42
symbolic::SymbolSet symbols() const override
Get all symbols used in this node.
std::unique_ptr< data_flow::DataFlowNode > clone(size_t element_id, const graph::Vertex vertex, data_flow::DataFlowGraph &parent) const override
Clone this node for graph transformations.
void replace(const symbolic::ExpressionMapping &replacements) override
data_flow::PointerAccessType pointer_access_type(int input_idx) const override
Describes what a pointer is used for.
const std::vector< symbolic::Expression > & output_shape() const
Definition broadcast_node.h:39
void validate(const Function &function) const override
Validates the element.
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
BroadcastNode(size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const std::vector< symbolic::Expression > &input_shape, const std::vector< symbolic::Expression > &output_shape, bool padded=true)
passes::LibNodeExpander::ExpandOutcome expand(passes::LibNodeExpander::ExpandContext &context, structured_control_flow::Block &block) override
Expand this node into its internal operations.
const std::vector< symbolic::Expression > & input_shape() const
Definition broadcast_node.h:36
bool supports_integer_types() const override
Check if this operation supports integer types.
Definition broadcast_node.h:52
TensorNode(size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const data_flow::LibraryNodeCode &code, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const data_flow::ImplementationType &impl_type)
Construct a tensor node.
Definition lib_node_expander.h:122
Definition json_serializer.h:22
Base class for library node serialization.
Definition json_serializer.h:195
A control flow node representing a basic block with dataflow computations.
Definition block.h:42
Expression parse(const std::string &expr_str)
Parses a string into a symbolic expression.
SymEngine::RCP< const SymEngine::Basic > Expression
Reference-counted pointer to a symbolic expression (SymEngine Basic).
Definition symbolic.h:83
std::set< Symbol, SymEngine::RCPBasicKeyLess > SymbolSet
Ordered set of symbols.
Definition symbolic.h:95
SymEngine::map_basic_basic ExpressionMapping
Definition symbolic.h:109
Definition function_builder.h:10
StringEnum LibraryNodeCode
Definition library_node.h:65
std::unique_ptr< PointerAccessMeta, PtrAccessDeleter > PointerAccessType
Definition pointer_metadata.h:32
boost::graph_traits< Graph >::vertex_descriptor Vertex
Definition graph.h:25
Definition arange_node.h:8
data_flow::LibraryNodeCode LibraryNodeType_Broadcast("ml::Broadcast")
Definition batched_gemm_node.h:12
Definition cutout_serializer.h:13
Definition analysis.h:7
Definition lib_node_expander.h:12
Abstract base class for tensor library nodes.