13ROOT.gInterpreter.Load(
"libopenblaso.so")
17import graph_nets
as gn
20from graph_nets
import utils_tf
25snd = np.array([1, 2, 3, 4, 2, 3, 4, 3, 4, 4, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3], dtype=
"int32")
26rec = np.array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 1, 2, 3, 4, 2, 3, 4, 3, 4, 4], dtype=
"int32")
36def get_graph_data_dict(num_nodes, num_edges, NODE_FEATURE_SIZE=2, EDGE_FEATURE_SIZE=2, GLOBAL_FEATURE_SIZE=1):
38 "globals": 10 * np.random.rand(GLOBAL_FEATURE_SIZE).astype(np.float32) - 5.0,
39 "nodes": 10 * np.random.rand(num_nodes, NODE_FEATURE_SIZE).astype(np.float32) - 5.0,
40 "edges": 10 * np.random.rand(num_edges, EDGE_FEATURE_SIZE).astype(np.float32) - 5.0,
48 return snt.Sequential(
50 snt.nets.MLP([LATENT_SIZE] * NUM_LAYERS, activate_final=
True),
51 snt.LayerNorm(axis=-1, create_offset=
True, create_scale=
True),
57class MLPGraphIndependent(snt.Module):
58 def __init__(self, name="MLPGraphIndependent"):
59 super(MLPGraphIndependent, self).__init__(name=name)
60 self._network = gn.modules.GraphIndependent(
61 edge_model_fn=
lambda: snt.nets.MLP([LATENT_SIZE] * NUM_LAYERS, activate_final=
True),
62 node_model_fn=
lambda: snt.nets.MLP([LATENT_SIZE] * NUM_LAYERS, activate_final=
True),
63 global_model_fn=
lambda: snt.nets.MLP([LATENT_SIZE] * NUM_LAYERS, activate_final=
True),
66 def __call__(self, inputs):
67 return self._network(inputs)
71class MLPGraphNetwork(snt.Module):
72 def __init__(self, name="MLPGraphNetwork"):
73 super(MLPGraphNetwork, self).__init__(name=name)
74 self._network = gn.modules.GraphNetwork(
75 edge_model_fn=make_mlp_model, node_model_fn=make_mlp_model, global_model_fn=make_mlp_model
78 def __call__(self, inputs):
79 return self._network(inputs)
83class EncodeProcessDecode(snt.Module):
85 def __init__(self, name="EncodeProcessDecode"):
86 super(EncodeProcessDecode, self).__init__(name=name)
87 self._encoder = MLPGraphIndependent()
88 self._core = MLPGraphNetwork()
89 self._decoder = MLPGraphIndependent()
90 self._output_transform = MLPGraphIndependent()
92 def __call__(self, input_op, num_processing_steps):
93 latent = self._encoder(input_op)
96 for _
in range(num_processing_steps):
97 core_input = utils_tf.concat([latent0, latent], axis=1)
98 latent = self._core(core_input)
99 decoded_op = self._decoder(latent)
100 output_ops.append(self._output_transform(decoded_op))
105ep_model = EncodeProcessDecode()
108GraphData = get_graph_data_dict(num_nodes, num_edges, node_size, edge_size, global_size)
111input_graph_data = utils_tf.data_dicts_to_graphs_tuple([GraphData])
115CoreGraphData = get_graph_data_dict(num_nodes, num_edges, 2 * LATENT_SIZE, 2 * LATENT_SIZE, 2 * LATENT_SIZE)
116input_core_graph_data = utils_tf.data_dicts_to_graphs_tuple([CoreGraphData])
119DecodeGraphData = get_graph_data_dict(num_nodes, num_edges, LATENT_SIZE, LATENT_SIZE, LATENT_SIZE)
122output_gn = ep_model(input_graph_data, processing_steps)
128encoder = ROOT.TMVA.Experimental.SOFIE.RModel_GraphIndependent.ParseFromMemory(
129 ep_model._encoder._network, GraphData, filename=
"gnn_encoder"
132encoder.OutputGenerated()
134core = ROOT.TMVA.Experimental.SOFIE.RModel_GNN.ParseFromMemory(
135 ep_model._core._network, CoreGraphData, filename=
"gnn_core"
138core.OutputGenerated()
140decoder = ROOT.TMVA.Experimental.SOFIE.RModel_GraphIndependent.ParseFromMemory(
141 ep_model._decoder._network, DecodeGraphData, filename=
"gnn_decoder"
144decoder.OutputGenerated()
146output_transform = ROOT.TMVA.Experimental.SOFIE.RModel_GraphIndependent.ParseFromMemory(
147 ep_model._output_transform._network, DecodeGraphData, filename=
"gnn_output_transform"
149output_transform.Generate()
150output_transform.OutputGenerated()
153gen_code =
'''#pragma cling optimize(2)
154#include "gnn_encoder.hxx"
155#include "gnn_core.hxx"
156#include "gnn_decoder.hxx"
157#include "gnn_output_transform.hxx"'''
158ROOT.gInterpreter.Declare(gen_code)
162def PrintSofie(output, printShape=False):
163 n = np.asarray(output.node_data)
164 e = np.asarray(output.edge_data)
165 g = np.asarray(output.global_data)
167 print(
"SOFIE data ... shapes", n.shape, e.shape, g.shape)
188def CopyData(input_data):
189 output_data = ROOT.TMVA.Experimental.SOFIE.Copy(input_data)
196 self.encoder_session = ROOT.TMVA_SOFIE_gnn_encoder.Session()
197 self.core_session = ROOT.TMVA_SOFIE_gnn_core.Session()
198 self.decoder_session = ROOT.TMVA_SOFIE_gnn_decoder.Session()
199 self.output_transform_session = ROOT.TMVA_SOFIE_gnn_output_transform.Session()
201 def infer(self, graphData):
203 input_data = CopyData(graphData)
206 self.encoder_session.infer(input_data)
207 latent0 = CopyData(input_data)
210 for _
in range(processing_steps):
211 core_input = ROOT.TMVA.Experimental.SOFIE.Concatenate(latent0, latent, axis=1)
212 self.core_session.infer(core_input)
213 latent = CopyData(core_input)
214 self.decoder_session.infer(core_input)
215 self.output_transform_session.infer(core_input)
216 output = CopyData(core_input)
217 output_ops.append(output)
224 data = get_graph_data_dict(num_nodes, num_edges, node_size, edge_size, global_size)
230for i
in range(0, numevts):
231 data = GenerateData()
237for i
in range(0, numevts):
238 graphData = dataSet[i]
239 gnet_data_i = utils_tf.data_dicts_to_graphs_tuple([graphData])
240 gnetData.append(gnet_data_i)
244def RunGNet(inputGraphData):
245 output_gn = ep_model(inputGraphData, processing_steps)
250hG = ROOT.TH1D(
"hG",
"Result from graphnet", 20, 1, 0)
251for i
in range(0, numevts):
252 out = RunGNet(gnetData[i])
253 g = out[1].globals.numpy()
257print(
"elapsed time for ", numevts,
"events = ", end - start)
261for i
in range(0, numevts):
262 graphData = dataSet[i]
263 input_data = ROOT.TMVA.Experimental.SOFIE.GNN_Data()
264 input_data.node_data = ROOT.TMVA.Experimental.AsRTensor(graphData[
"nodes"])
265 input_data.edge_data = ROOT.TMVA.Experimental.AsRTensor(graphData[
"edges"])
266 input_data.global_data = ROOT.TMVA.Experimental.AsRTensor(graphData[
"globals"])
267 input_data.edge_index = ROOT.TMVA.Experimental.AsRTensor(np.stack((graphData[
"receivers"], graphData[
"senders"])))
268 sofieData.append(input_data)
272print(
"time to convert data to SOFIE format", endSC - end)
274hS = ROOT.TH1D(
"hS",
"Result from SOFIE", 20, 1, 0)
278print(
"time to create SOFIE GNN class", start - start0)
279for i
in range(0, numevts):
281 out = gnn.infer(sofieData[i])
282 g = np.asarray(out[1].global_data)
286print(
"elapsed time for ", numevts,
"events = ", end - start)
297hDe = ROOT.TH1D(
"hDe",
"Difference for edge data", 40, 1, 0)
298hDn = ROOT.TH1D(
"hDn",
"Difference for node data", 40, 1, 0)
299hDg = ROOT.TH1D(
"hDg",
"Difference for global data", 40, 1, 0)
301for i
in range(0, numevts):
302 outSofie = gnn.infer(sofieData[i])
303 outGnet = RunGNet(gnetData[i])
304 edgesG = outGnet[1].edges.numpy()
305 edgesS = np.asarray(outSofie[1].edge_data)
308 for j
in range(0, edgesG.shape[0]):
309 for k
in range(0, edgesG.shape[1]):
310 hDe.Fill(edgesG[j, k] - edgesS[j, k])
312 nodesG = outGnet[1].nodes.numpy()
313 nodesS = np.asarray(outSofie[1].node_data)
314 for j
in range(0, nodesG.shape[0]):
315 for k
in range(0, nodesG.shape[1]):
316 hDn.Fill(nodesG[j, k] - nodesS[j, k])
318 globG = outGnet[1].globals.numpy()
319 globS = np.asarray(outSofie[1].global_data)
320 for j
in range(0, globG.shape[1]):
321 hDg.Fill(globG[0, j] - globS[j])