From b49b6ea7fb5ed71707c2c8b8add5d9aa98bdf58c Mon Sep 17 00:00:00 2001 From: araison Date: Fri, 9 Dec 2022 14:42:34 +0100 Subject: [PATCH] Revert "New fixes + reformat" This reverts commit 5d2cacfa05a9a55580aa12dd294ebbcad0ce31ad. --- {tool/visualizer => utils}/__init__.py | 0 utils/stat.py | 125 +++++++++++++++++++++++++ visualizer/__init__.py | 0 3 files changed, 125 insertions(+) rename {tool/visualizer => utils}/__init__.py (100%) create mode 100644 utils/stat.py create mode 100644 visualizer/__init__.py diff --git a/tool/visualizer/__init__.py b/utils/__init__.py similarity index 100% rename from tool/visualizer/__init__.py rename to utils/__init__.py diff --git a/utils/stat.py b/utils/stat.py new file mode 100644 index 0000000..0016a6b --- /dev/null +++ b/utils/stat.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import logging +import multiprocessing as mp +import os +import threading +import time +import types +from inspect import getmembers, isfunction, signature + +import networkx as nx +from torch_geometric.data import Data +from torch_geometric.utils import to_networkx + +with open("mapping_nx.txt", "r") as file: + BLACK_LIST = [line.rstrip() for line in file] + + +class GraphStat(object): + def __init__(self): + self.maps = { + "networkx": self.available_map_networkx(), + "torch_geometric": self.available_map_torch_geometric(), + } + + def available_map_networkx(self): + functions_list = getmembers(nx.algorithms, isfunction) + MANUALLY_ADDED = [ + "algebraic_connectivity", + "adjacency_spectrum", + "degree", + "density", + "laplacian_spectrum", + "normalized_laplacian_spectrum", + "number_of_selfloops", + "number_of_edges", + "number_of_nodes", + ] + MANUALLY_ADDED_LIST = [ + item for item in getmembers(nx, isfunction) if item[0] in MANUALLY_ADDED + ] + functions_list = functions_list + MANUALLY_ADDED_LIST + maps = {} + for func in functions_list: + name, f = func + if ( + name in BLACK_LIST + or name == "recursive_simple_cycles" + or "triad" in name + or "weisfeiler" in name + or "dfs" in name + or "trophic" in name + or "recursive" in name + or "scipy" in name + or "numpy" in name + or "sigma" in name + or "omega" in name + or "all_" in name + ): + continue + else: + maps[name] = f + return maps + + def available_map_torch_geometric(self): + names = [ + "num_nodes", + "num_edges", + "has_self_loops", + "has_isolated_nodes", + "num_nodes_features", + "y", + ] + maps = { + name: lambda x, name=name: x.__getattr__(name) if hasattr(x, name) else None + for name in names + } + return maps + + def __call__(self, data): + data_ = data.__copy__() + stats = {} + for k, v in self.maps.items(): + if k == "networkx": + _data_ = to_networkx(data) + _data_ = _data_.to_undirected() + elif k == "torch_geometric": + _data_ = data.__copy__() + for name, f in v.items(): + if f is None: + stats[name] = None + continue + else: + try: + t0 = time.time() + val = f(_data_) + t1 = time.time() + delta = t1 - t0 + except Exception as e: + print(name, e) + with open(f"{name}.txt", "w") as f: + f.write(str(e)) + # print(name, round(delta, 4)) + # if callable(val) and k == "torch_geometric": + # val = val() + # if isinstance(val, types.GeneratorType): + # val = list(val) + # stats[name] = val + return stats + + +from torch_geometric.datasets import KarateClub, Planetoid + +d = Planetoid(root="/tmp/", name="Cora") +# d = KarateClub() +a = d[0] +st = GraphStat() +stat = st(a) +for k, v in stat.items(): + print("---------") + print("Name:", k) + print("Type:", type(v)) + print("Val:", v) + print("---------") diff --git a/visualizer/__init__.py b/visualizer/__init__.py new file mode 100644 index 0000000..e69de29