From 55ab4e4a73c9345eb62f3b2a03688c17fb3ed8be Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:36:30 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .bumpversion.cfg | 10 + .flake8 | 69 + .github/ISSUE_TEMPLATE/---bug-report.md | 32 + .github/ISSUE_TEMPLATE/---documentation.md | 22 + .github/ISSUE_TEMPLATE/---everything-else.md | 20 + .github/ISSUE_TEMPLATE/---feature-request.md | 23 + .github/ISSUE_TEMPLATE/config.yml | 7 + .github/PULL_REQUEST_TEMPLATE.md | 10 + .github/dependabot.yml | 11 + .../workflows/archive/release-all-mlwb.yaml | 44 + .github/workflows/archive/release-macos.yaml | 41 + .../workflows/archive/release-manylinux.yaml | 50 + .github/workflows/benchmarking.yaml | 15 + .github/workflows/diagram.yml | 16 + .github/workflows/pr_code_check.yaml | 50 + .github/workflows/pre-commit.yaml | 38 + .github/workflows/stale.yaml | 19 + .github/workflows/test.yaml | 46 + .github/workflows/translator.yaml | 34 + .github/workflows/wheel_publish.yml | 75 + .gitignore | 212 ++ .gitmodules | 3 + .pre-commit-config.yaml | 94 + CMakeLists.txt | 19 + CONTRIBUTING.md | 253 ++ EG_framework.png | Bin 0 -> 186349 bytes LICENSE | 29 + MANIFEST.in | 3 + Makefile | 13 + README.md | 187 ++ README.rst | 135 + README.wehub.md | 7 + _typos.toml | 23 + cpp_easygraph/CMakeLists.txt | 83 + cpp_easygraph/classes/__init__.h | 5 + cpp_easygraph/classes/coo_graph.h | 13 + cpp_easygraph/classes/csr_graph.h | 13 + cpp_easygraph/classes/directed_graph.cpp | 613 ++++ cpp_easygraph/classes/directed_graph.h | 37 + cpp_easygraph/classes/graph.cpp | 990 +++++++ cpp_easygraph/classes/graph.h | 73 + cpp_easygraph/classes/linkgraph.h | 91 + cpp_easygraph/classes/operation.cpp | 16 + cpp_easygraph/classes/operation.h | 5 + cpp_easygraph/classes/segment_tree.cpp | 42 + cpp_easygraph/common/common.cpp | 3 + cpp_easygraph/common/common.h | 37 + cpp_easygraph/common/utils.cpp | 48 + cpp_easygraph/common/utils.h | 9 + cpp_easygraph/cpp_easygraph.cpp | 120 + cpp_easygraph/functions/__init__.h | 10 + cpp_easygraph/functions/basic/__init__.h | 4 + cpp_easygraph/functions/basic/avg_degree.cpp | 9 + cpp_easygraph/functions/basic/avg_degree.h | 5 + cpp_easygraph/functions/basic/cluster.cpp | 298 ++ cpp_easygraph/functions/basic/cluster.h | 5 + cpp_easygraph/functions/centrality/__init__.h | 1 + .../functions/centrality/betweenness.cpp | 467 +++ .../functions/centrality/centrality.h | 27 + .../functions/centrality/closeness.cpp | 353 +++ cpp_easygraph/functions/centrality/degree.cpp | 96 + .../functions/centrality/eigenvector.cpp | 198 ++ .../functions/centrality/katz_centrality.cpp | 194 ++ cpp_easygraph/functions/community/LPA.cpp | 146 + cpp_easygraph/functions/community/LPA.h | 7 + cpp_easygraph/functions/community/__init__.h | 10 + .../functions/community/ego_graph.cpp | 155 + cpp_easygraph/functions/community/ego_graph.h | 23 + .../functions/community/graph_coloring.cpp | 135 + .../functions/community/graph_coloring.h | 12 + .../functions/community/greedy_modularity.cpp | 289 ++ .../functions/community/greedy_modularity.h | 11 + .../functions/community/indexed_heap.h | 191 ++ .../functions/community/localsearch.cpp | 613 ++++ .../functions/community/localsearch.h | 13 + cpp_easygraph/functions/community/louvain.cpp | 544 ++++ cpp_easygraph/functions/community/louvain.h | 20 + .../functions/community/modularity.cpp | 213 ++ .../functions/community/modularity.h | 11 + cpp_easygraph/functions/community/motif.cpp | 553 ++++ cpp_easygraph/functions/community/motif.h | 11 + .../functions/community/subgraph.cpp | 179 ++ cpp_easygraph/functions/community/subgraph.h | 10 + .../functions/community/tests/__init__.py | 1 + .../functions/community/tests/cpp_LPA_test.py | 139 + .../community/tests/cpp_ego_graph_test.py | 254 ++ .../tests/cpp_enumerate_subgraph_test.py | 143 + .../tests/cpp_greedy_modularity_test.py | 117 + .../community/tests/cpp_localsearch_test.py | 188 ++ .../community/tests/cpp_louvain_test.py | 178 ++ .../community/tests/cpp_modularity_test.py | 161 + .../community/tests/run_all_tests.py | 55 + cpp_easygraph/functions/components/__init__.h | 5 + .../functions/components/biconnected.cpp | 109 + .../functions/components/biconnected.h | 34 + .../functions/components/connected.cpp | 205 ++ .../functions/components/connected.h | 16 + .../components/strongly_connected.cpp | 90 + .../functions/components/strongly_connected.h | 6 + cpp_easygraph/functions/cores/__init__.h | 3 + cpp_easygraph/functions/cores/k_cores.cpp | 101 + cpp_easygraph/functions/cores/k_cores.h | 5 + cpp_easygraph/functions/pagerank/__init__.h | 5 + cpp_easygraph/functions/pagerank/pagerank.cpp | 119 + cpp_easygraph/functions/pagerank/pagerank.h | 5 + cpp_easygraph/functions/path/__init__.h | 4 + .../path/average_shortest_path_length.cpp | 148 + cpp_easygraph/functions/path/diameter.cpp | 207 ++ cpp_easygraph/functions/path/mst.cpp | 314 ++ cpp_easygraph/functions/path/mst.h | 19 + cpp_easygraph/functions/path/path.cpp | 376 +++ cpp_easygraph/functions/path/path.h | 12 + .../functions/structural_holes/__init__.h | 3 + .../functions/structural_holes/evaluation.cpp | 827 ++++++ .../functions/structural_holes/evaluation.h | 8 + diagram.svg | 1 + easygraph/__init__.py | 29 + easygraph/_global.py | 15 + easygraph/classes/__init__.py | 19 + easygraph/classes/base.py | 996 +++++++ easygraph/classes/directed_graph.py | 1315 ++++++++ easygraph/classes/directed_multigraph.py | 420 +++ easygraph/classes/graph.py | 1579 ++++++++++ easygraph/classes/graphviews.py | 15 + easygraph/classes/hypergraph.py | 2633 +++++++++++++++++ easygraph/classes/multigraph.py | 729 +++++ easygraph/classes/operation.py | 447 +++ easygraph/classes/test_base_graph_class.py | 27 + easygraph/classes/tests/__init__.py | 0 easygraph/classes/tests/test_base.py | 145 + .../classes/tests/test_directed_graph.py | 97 + easygraph/classes/tests/test_graph.py | 112 + easygraph/classes/tests/test_graphV2.py | 122 + easygraph/classes/tests/test_hypergraph.py | 1001 +++++++ easygraph/classes/tests/test_multidigraph.py | 114 + easygraph/classes/tests/test_multigraph.py | 149 + easygraph/classes/tests/test_operation.py | 131 + easygraph/convert.py | 591 ++++ easygraph/datapipe/__init__.py | 29 + easygraph/datapipe/common.py | 106 + easygraph/datapipe/loader.py | 90 + easygraph/datapipe/normalize.py | 74 + easygraph/datasets/__init__.py | 35 + easygraph/datasets/amazon_photo.py | 110 + easygraph/datasets/arxiv.py | 106 + easygraph/datasets/citation_graph.py | 875 ++++++ easygraph/datasets/coauthor.py | 118 + easygraph/datasets/dynamic/__init__.py | 4 + easygraph/datasets/dynamic/email_enron.py | 86 + easygraph/datasets/dynamic/email_eu.py | 81 + easygraph/datasets/dynamic/hospital_lyon.py | 133 + easygraph/datasets/dynamic/load_dataset.py | 94 + easygraph/datasets/facebook_ego.py | 109 + easygraph/datasets/flickr.py | 129 + easygraph/datasets/get_sample_graph.py | 210 ++ easygraph/datasets/github.py | 125 + easygraph/datasets/gnn_benchmark.py | 216 ++ easygraph/datasets/graph_dataset_base.py | 318 ++ .../datasets/hypergraph/House_Committees.py | 216 ++ easygraph/datasets/hypergraph/Yelp.py | 82 + easygraph/datasets/hypergraph/__init__.py | 10 + easygraph/datasets/hypergraph/_global.py | 14 + .../datasets/hypergraph/cat_edge_Cooking.py | 104 + easygraph/datasets/hypergraph/coauthorship.py | 192 ++ easygraph/datasets/hypergraph/cocitation.py | 279 ++ .../hypergraph/contact_primary_school.py | 183 ++ easygraph/datasets/hypergraph/cooking_200.py | 85 + .../hypergraph/hypergraph_dataset_base.py | 119 + .../hypergraph/loadDeepSetDatasets.py | 78 + .../hypergraph/mathoverflow_answers.py | 113 + .../datasets/hypergraph/senate_committees.py | 106 + .../datasets/hypergraph/trivago_clicks.py | 104 + .../datasets/hypergraph/walmart_trips.py | 208 ++ easygraph/datasets/karate.py | 93 + easygraph/datasets/ppi.py | 217 ++ easygraph/datasets/reddit.py | 104 + easygraph/datasets/roadnet.py | 107 + easygraph/datasets/samples/blogcatalog.mat | Bin 0 -> 1255783 bytes easygraph/datasets/twitter_ego.py | 65 + easygraph/datasets/utils.py | 358 +++ easygraph/datasets/web_google.py | 118 + easygraph/datasets/wiki_topcats.py | 105 + easygraph/exception.py | 84 + easygraph/experiments/__init__.py | 10 + easygraph/experiments/base.py | 204 ++ easygraph/experiments/hypergraphs/__init__.py | 1 + .../experiments/hypergraphs/hypergraph.py | 121 + .../experiments/vertex_classification.py | 166 ++ easygraph/functions/__init__.py | 21 + easygraph/functions/basic/__init__.py | 4 + easygraph/functions/basic/avg_degree.py | 31 + easygraph/functions/basic/cluster.py | 559 ++++ easygraph/functions/basic/localassort.py | 226 ++ .../functions/basic/predecessor_path_based.py | 101 + easygraph/functions/basic/tests/__init__.py | 0 .../functions/basic/tests/test_avg_degree.py | 41 + .../functions/basic/tests/test_cluster.py | 418 +++ .../functions/basic/tests/test_localassort.py | 104 + .../functions/basic/tests/test_predecessor.py | 79 + easygraph/functions/centrality/__init__.py | 9 + easygraph/functions/centrality/betweenness.py | 245 ++ easygraph/functions/centrality/closeness.py | 105 + easygraph/functions/centrality/degree.py | 125 + .../functions/centrality/ego_betweenness.py | 57 + easygraph/functions/centrality/eigenvector.py | 154 + .../functions/centrality/flowbetweenness.py | 146 + .../functions/centrality/katz_centrality.py | 105 + easygraph/functions/centrality/laplacian.py | 134 + easygraph/functions/centrality/pagerank.py | 58 + .../functions/centrality/tests/__init__.py | 0 .../centrality/tests/test_betweenness.py | 99 + .../centrality/tests/test_closeness.py | 86 + .../functions/centrality/tests/test_degree.py | 78 + .../centrality/tests/test_egobetweenness.py | 73 + .../centrality/tests/test_flowbetweenness.py | 90 + .../centrality/tests/test_laplacian.py | 106 + .../centrality/tests/test_pagerank.py | 90 + easygraph/functions/community/LPA.py | 761 +++++ easygraph/functions/community/__init__.py | 7 + easygraph/functions/community/ego_graph.py | 66 + easygraph/functions/community/localsearch.py | 689 +++++ easygraph/functions/community/louvain.py | 355 +++ easygraph/functions/community/modularity.py | 75 + .../community/modularity_max_detection.py | 200 ++ easygraph/functions/community/motif.py | 122 + .../functions/community/tests/__init__.py | 0 .../functions/community/tests/test_LPA.py | 65 + .../functions/community/tests/test_LS.py | 48 + .../community/tests/test_ego_graph.py | 65 + .../functions/community/tests/test_louvian.py | 65 + .../community/tests/test_modularity.py | 71 + .../tests/test_modularity_max_detection.py | 81 + .../functions/community/tests/test_motif.py | 89 + easygraph/functions/components/__init__.py | 4 + easygraph/functions/components/biconnected.py | 247 ++ easygraph/functions/components/connected.py | 160 + .../components/strongly_connected.py | 244 ++ .../functions/components/tests/__init__.py | 0 .../components/tests/test_biconnected.py | 92 + .../components/tests/test_connected.py | 112 + .../tests/test_strongly_connected.py | 121 + .../components/tests/test_weakly_connected.py | 82 + .../functions/components/weakly_connected.py | 186 ++ easygraph/functions/core/__init__.py | 1 + easygraph/functions/core/k_core.py | 72 + easygraph/functions/core/tests/__init__.py | 0 easygraph/functions/core/tests/test_k_core.py | 101 + easygraph/functions/drawing/__init__.py | 3 + easygraph/functions/drawing/defaults.py | 253 ++ easygraph/functions/drawing/drawing.py | 1722 +++++++++++ easygraph/functions/drawing/geometry.py | 50 + easygraph/functions/drawing/layout.py | 33 + easygraph/functions/drawing/plot.py | 233 ++ easygraph/functions/drawing/positioning.py | 646 ++++ easygraph/functions/drawing/simulator.py | 195 ++ easygraph/functions/drawing/tests/__init__.py | 0 .../functions/drawing/tests/test_drawing.py | 27 + .../functions/drawing/tests/test_geometry.py | 78 + .../functions/drawing/tests/test_plot.py | 39 + .../drawing/tests/test_positioning.py | 56 + easygraph/functions/drawing/utils.py | 596 ++++ easygraph/functions/graph_embedding/NOBE.py | 185 ++ .../functions/graph_embedding/__init__.py | 13 + .../functions/graph_embedding/deepwalk.py | 103 + easygraph/functions/graph_embedding/line.py | 303 ++ .../functions/graph_embedding/n2v_citesee.pdf | Bin 0 -> 65430 bytes .../net_emb_example_citeseer.py | 175 ++ .../functions/graph_embedding/node2vec.py | 308 ++ easygraph/functions/graph_embedding/sdne.py | 280 ++ .../graph_embedding/tests/__init__.py | 0 .../functions/graph_embedding/tests/test.emb | 4 + .../graph_embedding/tests/test_deepwalk.py | 101 + .../graph_embedding/tests/test_line.py | 77 + .../graph_embedding/tests/test_nobe.py | 57 + .../graph_embedding/tests/test_node2vec.py | 58 + .../graph_embedding/tests/test_sdne.py | 107 + .../graph_generator/RandomNetwork.py | 411 +++ .../functions/graph_generator/__init__.py | 2 + .../functions/graph_generator/classic.py | 73 + .../graph_generator/tests/__init__.py | 0 .../tests/test_Random_Network.py | 63 + .../graph_generator/tests/test_classic.py | 87 + easygraph/functions/hypergraph/__init__.py | 5 + .../functions/hypergraph/assortativity.py | 185 ++ .../hypergraph/centrality/__init__.py | 5 + .../hypergraph/centrality/cycle_ratio.py | 193 ++ .../functions/hypergraph/centrality/degree.py | 28 + .../hypergraph/centrality/hypercoreness.py | 351 +++ .../hypergraph/centrality/s_centrality.py | 89 + .../centrality/tests/test_cycle_ratio.py | 72 + .../centrality/tests/test_degree.py | 38 + .../centrality/tests/test_hypercoreness.py | 51 + .../centrality/tests/test_s_centrality.py | 40 + .../tests/test_vector_centrality.py | 43 + .../centrality/vector_centrality.py | 91 + .../hypergraph/hypergraph_clustering.py | 295 ++ .../hypergraph/hypergraph_operation.py | 70 + .../hypergraph/null_model/__init__.py | 5 + .../null_model/hypergraph_classic.py | 39 + .../hypergraph/null_model/lattice.py | 69 + .../functions/hypergraph/null_model/random.py | 446 +++ .../functions/hypergraph/null_model/simple.py | 77 + .../hypergraph/null_model/tests/__init__.py | 0 .../null_model/tests/test_classic.py | 85 + .../null_model/tests/test_lattice.py | 49 + .../null_model/tests/test_simple.py | 60 + .../hypergraph/null_model/uniform.py | 455 +++ .../functions/hypergraph/tests/__init__.py | 0 .../hypergraph/tests/test_assortativity.py | 103 + .../hypergraph/tests/test_centrality.py | 24 + .../tests/test_hypergraph_clustering.py | 89 + .../tests/test_hypergraph_operation.py | 72 + easygraph/functions/isolate.py | 103 + easygraph/functions/path/__init__.py | 5 + .../path/average_shortest_path_length.py | 116 + easygraph/functions/path/bridges.py | 201 ++ easygraph/functions/path/diameter.py | 109 + easygraph/functions/path/mst.py | 685 +++++ easygraph/functions/path/path.py | 259 ++ easygraph/functions/path/tests/__init__.py | 0 .../test_average_shortest_path_length.py | 56 + .../functions/path/tests/test_bridges.py | 158 + .../functions/path/tests/test_diameter.py | 143 + easygraph/functions/path/tests/test_mst.py | 176 ++ easygraph/functions/path/tests/test_path.py | 200 ++ .../functions/structural_holes/AP_Greedy.py | 402 +++ easygraph/functions/structural_holes/HAM.py | 308 ++ easygraph/functions/structural_holes/HIS.py | 154 + easygraph/functions/structural_holes/ICC.py | 302 ++ easygraph/functions/structural_holes/MaxD.py | 447 +++ easygraph/functions/structural_holes/NOBE.py | 179 ++ .../functions/structural_holes/SHII_metric.py | 294 ++ .../functions/structural_holes/__init__.py | 9 + .../functions/structural_holes/evaluation.py | 403 +++ .../functions/structural_holes/maxBlock.py | 611 ++++ .../functions/structural_holes/metrics.py | 394 +++ .../structural_holes/tests/test_AP_Greedy.py | 85 + .../structural_holes/tests/test_HAM.py | 71 + .../structural_holes/tests/test_HIS.py | 87 + .../structural_holes/tests/test_ICC.py | 72 + .../structural_holes/tests/test_MaxD.py | 64 + .../structural_holes/tests/test_NOBE.py | 75 + .../tests/test_SHII_metric.py | 61 + .../structural_holes/tests/test_evaluation.py | 72 + .../structural_holes/tests/test_maxBlock.py | 66 + .../structural_holes/tests/test_metrics.py | 105 + .../structural_holes/tests/test_weakTie.py | 59 + .../functions/structural_holes/weakTie.py | 338 +++ easygraph/functions/tests/__init__.py | 0 easygraph/functions/tests/test_isolate.py | 93 + easygraph/ml_metrics/__init__.py | 45 + easygraph/ml_metrics/base.py | 202 ++ easygraph/ml_metrics/classification.py | 162 + easygraph/ml_metrics/hypergraphs/__init__.py | 1 + .../ml_metrics/hypergraphs/hypergraph.py | 47 + easygraph/model/__init__.py | 19 + easygraph/model/hypergraphs/__init__.py | 11 + easygraph/model/hypergraphs/dhcf.py | 95 + easygraph/model/hypergraphs/dhne.py | 70 + easygraph/model/hypergraphs/hgnn.py | 45 + easygraph/model/hypergraphs/hgnnp.py | 44 + easygraph/model/hypergraphs/hnhn.py | 44 + easygraph/model/hypergraphs/hwnn.py | 60 + easygraph/model/hypergraphs/hypergcn.py | 67 + easygraph/model/hypergraphs/setgnn.py | 289 ++ easygraph/model/hypergraphs/unignn.py | 214 ++ easygraph/nn/__init__.py | 23 + easygraph/nn/convs/__init__.py | 1 + easygraph/nn/convs/common.py | 136 + easygraph/nn/convs/hypergraphs/__init__.py | 10 + easygraph/nn/convs/hypergraphs/dhcf_conv.py | 54 + .../nn/convs/hypergraphs/halfnlh_conv.py | 112 + easygraph/nn/convs/hypergraphs/hgnn_conv.py | 57 + easygraph/nn/convs/hypergraphs/hgnnp_conv.py | 67 + easygraph/nn/convs/hypergraphs/hnhn_conv.py | 53 + easygraph/nn/convs/hypergraphs/hwnn_conv.py | 58 + .../nn/convs/hypergraphs/hypergcn_conv.py | 61 + easygraph/nn/convs/hypergraphs/unignn_conv.py | 289 ++ easygraph/nn/convs/pma.py | 180 ++ easygraph/nn/loss.py | 46 + easygraph/nn/regularization.py | 32 + easygraph/nn/tests/__init__.py | 0 easygraph/nn/tests/test_gatconv.py | 0 easygraph/nn/tests/test_gcnconv.py | 0 easygraph/nn/tests/test_graphsageconv.py | 0 easygraph/nn/tests/test_regularization.py | 16 + easygraph/readwrite/__init__.py | 9 + easygraph/readwrite/edgelist.py | 463 +++ easygraph/readwrite/gexf.py | 1018 +++++++ easygraph/readwrite/gml.py | 803 +++++ easygraph/readwrite/graphml.py | 1057 +++++++ easygraph/readwrite/graphviz.py | 180 ++ easygraph/readwrite/json_graph/__init__.py | 16 + easygraph/readwrite/json_graph/node_link.py | 111 + easygraph/readwrite/pajek.py | 337 +++ easygraph/readwrite/pickle.py | 15 + easygraph/readwrite/tests/__init__.py | 0 easygraph/readwrite/tests/test_edgelist.py | 318 ++ easygraph/readwrite/tests/test_gexf.py | 447 +++ easygraph/readwrite/tests/test_gml.py | 589 ++++ easygraph/readwrite/tests/test_graphml.py | 1490 ++++++++++ easygraph/readwrite/tests/test_graphviz.py | 58 + easygraph/readwrite/tests/test_pajek.py | 307 ++ easygraph/readwrite/tests/test_pickle.py | 53 + easygraph/readwrite/tests/test_ucinet.py | 340 +++ easygraph/readwrite/ucinet.py | 327 ++ easygraph/test.emb | 4 + easygraph/tests/__init__.py | 0 easygraph/tests/script_test_cpp_easygraph.py | 221 ++ .../teddy_test_cpp_easygraph_sanity_check.py | 180 ++ easygraph/tests/test_convert.py | 153 + easygraph/tests/test_cpp_easygraph.py | 12 + easygraph/tests/test_hif.py | 117 + easygraph/utils/HIF.py | 266 ++ easygraph/utils/__init__.py | 14 + easygraph/utils/alias.py | 119 + easygraph/utils/convert_class.py | 19 + easygraph/utils/convert_to_matrix.py | 1002 +++++++ easygraph/utils/decorators.py | 1145 +++++++ easygraph/utils/download.py | 95 + easygraph/utils/exception.py | 43 + easygraph/utils/index_of_node.py | 12 + easygraph/utils/logging.py | 44 + easygraph/utils/mapped_queue.py | 186 ++ easygraph/utils/misc.py | 222 ++ easygraph/utils/relabel.py | 106 + easygraph/utils/sparse.py | 39 + easygraph/utils/type_change.py | 147 + examples/README.md | 8 + f8 | 2 + gpu_easygraph/CMakeLists.txt | 24 + gpu_easygraph/common/common.h | 23 + gpu_easygraph/common/err.cpp | 31 + gpu_easygraph/common/err.h | 20 + gpu_easygraph/functions/centrality/baseline | 423 +++ .../functions/centrality/bc_mem_prev | 399 +++ .../centrality/betweenness_centrality.cu | 426 +++ .../centrality/betweenness_centrality.cuh | 64 + .../functions/centrality/centrality.cpp | 83 + .../centrality/closeness_centrality.cu | 246 ++ .../centrality/closeness_centrality.cuh | 53 + gpu_easygraph/functions/core/core.cpp | 25 + gpu_easygraph/functions/core/k_core.cu | 239 ++ gpu_easygraph/functions/core/k_core.cuh | 39 + gpu_easygraph/functions/path/path.cpp | 63 + gpu_easygraph/functions/path/sssp_dijkstra.cu | 233 ++ .../functions/path/sssp_dijkstra.cuh | 20 + .../functions/structural_holes/constraint.cpp | 31 + .../functions/structural_holes/constraint.cu | 341 +++ .../functions/structural_holes/constraint.cuh | 20 + .../structural_holes/effective_size.cpp | 31 + .../structural_holes/effective_size.cu | 346 +++ .../structural_holes/effective_size.cuh | 20 + .../functions/structural_holes/hierarchy.cpp | 31 + .../functions/structural_holes/hierarchy.cu | 369 +++ .../functions/structural_holes/hierarchy.cuh | 19 + gpu_easygraph/gpu_easygraph.h | 100 + pyproject.toml | 195 ++ pytest.ini | 4 + requirements.txt | 15 + scripts/README.md | 90 + scripts/Solution.md | 29 + scripts/build_easygraph_linux.sh | 20 + scripts/build_easygraph_macos.sh | 34 + scripts/build_easygraph_windows.bat | 29 + scripts/build_packages_linux.sh | 22 + scripts/check_installation.py | 19 + scripts/upload_easygraph.sh | 18 + setup.py | 171 ++ tox-conda-test.ini | 9 + tox-conda.ini | 14 + tox-test.ini | 8 + tox.ini | 19 + 473 files changed, 72932 insertions(+) create mode 100644 .bumpversion.cfg create mode 100644 .flake8 create mode 100644 .github/ISSUE_TEMPLATE/---bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/---documentation.md create mode 100644 .github/ISSUE_TEMPLATE/---everything-else.md create mode 100644 .github/ISSUE_TEMPLATE/---feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/archive/release-all-mlwb.yaml create mode 100644 .github/workflows/archive/release-macos.yaml create mode 100644 .github/workflows/archive/release-manylinux.yaml create mode 100644 .github/workflows/benchmarking.yaml create mode 100644 .github/workflows/diagram.yml create mode 100644 .github/workflows/pr_code_check.yaml create mode 100644 .github/workflows/pre-commit.yaml create mode 100644 .github/workflows/stale.yaml create mode 100644 .github/workflows/test.yaml create mode 100644 .github/workflows/translator.yaml create mode 100644 .github/workflows/wheel_publish.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .pre-commit-config.yaml create mode 100644 CMakeLists.txt create mode 100644 CONTRIBUTING.md create mode 100644 EG_framework.png create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 Makefile create mode 100644 README.md create mode 100644 README.rst create mode 100644 README.wehub.md create mode 100644 _typos.toml create mode 100644 cpp_easygraph/CMakeLists.txt create mode 100644 cpp_easygraph/classes/__init__.h create mode 100644 cpp_easygraph/classes/coo_graph.h create mode 100644 cpp_easygraph/classes/csr_graph.h create mode 100644 cpp_easygraph/classes/directed_graph.cpp create mode 100644 cpp_easygraph/classes/directed_graph.h create mode 100644 cpp_easygraph/classes/graph.cpp create mode 100644 cpp_easygraph/classes/graph.h create mode 100644 cpp_easygraph/classes/linkgraph.h create mode 100644 cpp_easygraph/classes/operation.cpp create mode 100644 cpp_easygraph/classes/operation.h create mode 100644 cpp_easygraph/classes/segment_tree.cpp create mode 100644 cpp_easygraph/common/common.cpp create mode 100644 cpp_easygraph/common/common.h create mode 100644 cpp_easygraph/common/utils.cpp create mode 100644 cpp_easygraph/common/utils.h create mode 100644 cpp_easygraph/cpp_easygraph.cpp create mode 100644 cpp_easygraph/functions/__init__.h create mode 100644 cpp_easygraph/functions/basic/__init__.h create mode 100644 cpp_easygraph/functions/basic/avg_degree.cpp create mode 100644 cpp_easygraph/functions/basic/avg_degree.h create mode 100644 cpp_easygraph/functions/basic/cluster.cpp create mode 100644 cpp_easygraph/functions/basic/cluster.h create mode 100644 cpp_easygraph/functions/centrality/__init__.h create mode 100644 cpp_easygraph/functions/centrality/betweenness.cpp create mode 100644 cpp_easygraph/functions/centrality/centrality.h create mode 100644 cpp_easygraph/functions/centrality/closeness.cpp create mode 100644 cpp_easygraph/functions/centrality/degree.cpp create mode 100644 cpp_easygraph/functions/centrality/eigenvector.cpp create mode 100644 cpp_easygraph/functions/centrality/katz_centrality.cpp create mode 100644 cpp_easygraph/functions/community/LPA.cpp create mode 100644 cpp_easygraph/functions/community/LPA.h create mode 100644 cpp_easygraph/functions/community/__init__.h create mode 100644 cpp_easygraph/functions/community/ego_graph.cpp create mode 100644 cpp_easygraph/functions/community/ego_graph.h create mode 100644 cpp_easygraph/functions/community/graph_coloring.cpp create mode 100644 cpp_easygraph/functions/community/graph_coloring.h create mode 100644 cpp_easygraph/functions/community/greedy_modularity.cpp create mode 100644 cpp_easygraph/functions/community/greedy_modularity.h create mode 100644 cpp_easygraph/functions/community/indexed_heap.h create mode 100644 cpp_easygraph/functions/community/localsearch.cpp create mode 100644 cpp_easygraph/functions/community/localsearch.h create mode 100644 cpp_easygraph/functions/community/louvain.cpp create mode 100644 cpp_easygraph/functions/community/louvain.h create mode 100644 cpp_easygraph/functions/community/modularity.cpp create mode 100644 cpp_easygraph/functions/community/modularity.h create mode 100644 cpp_easygraph/functions/community/motif.cpp create mode 100644 cpp_easygraph/functions/community/motif.h create mode 100644 cpp_easygraph/functions/community/subgraph.cpp create mode 100644 cpp_easygraph/functions/community/subgraph.h create mode 100644 cpp_easygraph/functions/community/tests/__init__.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_LPA_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_ego_graph_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_enumerate_subgraph_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_greedy_modularity_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_localsearch_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_louvain_test.py create mode 100644 cpp_easygraph/functions/community/tests/cpp_modularity_test.py create mode 100644 cpp_easygraph/functions/community/tests/run_all_tests.py create mode 100644 cpp_easygraph/functions/components/__init__.h create mode 100644 cpp_easygraph/functions/components/biconnected.cpp create mode 100644 cpp_easygraph/functions/components/biconnected.h create mode 100644 cpp_easygraph/functions/components/connected.cpp create mode 100644 cpp_easygraph/functions/components/connected.h create mode 100644 cpp_easygraph/functions/components/strongly_connected.cpp create mode 100644 cpp_easygraph/functions/components/strongly_connected.h create mode 100644 cpp_easygraph/functions/cores/__init__.h create mode 100644 cpp_easygraph/functions/cores/k_cores.cpp create mode 100644 cpp_easygraph/functions/cores/k_cores.h create mode 100644 cpp_easygraph/functions/pagerank/__init__.h create mode 100644 cpp_easygraph/functions/pagerank/pagerank.cpp create mode 100644 cpp_easygraph/functions/pagerank/pagerank.h create mode 100644 cpp_easygraph/functions/path/__init__.h create mode 100644 cpp_easygraph/functions/path/average_shortest_path_length.cpp create mode 100644 cpp_easygraph/functions/path/diameter.cpp create mode 100644 cpp_easygraph/functions/path/mst.cpp create mode 100644 cpp_easygraph/functions/path/mst.h create mode 100644 cpp_easygraph/functions/path/path.cpp create mode 100644 cpp_easygraph/functions/path/path.h create mode 100644 cpp_easygraph/functions/structural_holes/__init__.h create mode 100644 cpp_easygraph/functions/structural_holes/evaluation.cpp create mode 100644 cpp_easygraph/functions/structural_holes/evaluation.h create mode 100644 diagram.svg create mode 100644 easygraph/__init__.py create mode 100644 easygraph/_global.py create mode 100644 easygraph/classes/__init__.py create mode 100644 easygraph/classes/base.py create mode 100644 easygraph/classes/directed_graph.py create mode 100644 easygraph/classes/directed_multigraph.py create mode 100644 easygraph/classes/graph.py create mode 100644 easygraph/classes/graphviews.py create mode 100644 easygraph/classes/hypergraph.py create mode 100644 easygraph/classes/multigraph.py create mode 100644 easygraph/classes/operation.py create mode 100644 easygraph/classes/test_base_graph_class.py create mode 100644 easygraph/classes/tests/__init__.py create mode 100644 easygraph/classes/tests/test_base.py create mode 100644 easygraph/classes/tests/test_directed_graph.py create mode 100644 easygraph/classes/tests/test_graph.py create mode 100644 easygraph/classes/tests/test_graphV2.py create mode 100644 easygraph/classes/tests/test_hypergraph.py create mode 100644 easygraph/classes/tests/test_multidigraph.py create mode 100644 easygraph/classes/tests/test_multigraph.py create mode 100644 easygraph/classes/tests/test_operation.py create mode 100644 easygraph/convert.py create mode 100644 easygraph/datapipe/__init__.py create mode 100644 easygraph/datapipe/common.py create mode 100644 easygraph/datapipe/loader.py create mode 100644 easygraph/datapipe/normalize.py create mode 100644 easygraph/datasets/__init__.py create mode 100644 easygraph/datasets/amazon_photo.py create mode 100644 easygraph/datasets/arxiv.py create mode 100644 easygraph/datasets/citation_graph.py create mode 100644 easygraph/datasets/coauthor.py create mode 100644 easygraph/datasets/dynamic/__init__.py create mode 100644 easygraph/datasets/dynamic/email_enron.py create mode 100644 easygraph/datasets/dynamic/email_eu.py create mode 100644 easygraph/datasets/dynamic/hospital_lyon.py create mode 100644 easygraph/datasets/dynamic/load_dataset.py create mode 100644 easygraph/datasets/facebook_ego.py create mode 100644 easygraph/datasets/flickr.py create mode 100644 easygraph/datasets/get_sample_graph.py create mode 100644 easygraph/datasets/github.py create mode 100644 easygraph/datasets/gnn_benchmark.py create mode 100644 easygraph/datasets/graph_dataset_base.py create mode 100644 easygraph/datasets/hypergraph/House_Committees.py create mode 100644 easygraph/datasets/hypergraph/Yelp.py create mode 100644 easygraph/datasets/hypergraph/__init__.py create mode 100644 easygraph/datasets/hypergraph/_global.py create mode 100644 easygraph/datasets/hypergraph/cat_edge_Cooking.py create mode 100644 easygraph/datasets/hypergraph/coauthorship.py create mode 100644 easygraph/datasets/hypergraph/cocitation.py create mode 100644 easygraph/datasets/hypergraph/contact_primary_school.py create mode 100644 easygraph/datasets/hypergraph/cooking_200.py create mode 100644 easygraph/datasets/hypergraph/hypergraph_dataset_base.py create mode 100644 easygraph/datasets/hypergraph/loadDeepSetDatasets.py create mode 100644 easygraph/datasets/hypergraph/mathoverflow_answers.py create mode 100644 easygraph/datasets/hypergraph/senate_committees.py create mode 100644 easygraph/datasets/hypergraph/trivago_clicks.py create mode 100644 easygraph/datasets/hypergraph/walmart_trips.py create mode 100644 easygraph/datasets/karate.py create mode 100644 easygraph/datasets/ppi.py create mode 100644 easygraph/datasets/reddit.py create mode 100644 easygraph/datasets/roadnet.py create mode 100644 easygraph/datasets/samples/blogcatalog.mat create mode 100644 easygraph/datasets/twitter_ego.py create mode 100644 easygraph/datasets/utils.py create mode 100644 easygraph/datasets/web_google.py create mode 100644 easygraph/datasets/wiki_topcats.py create mode 100644 easygraph/exception.py create mode 100644 easygraph/experiments/__init__.py create mode 100644 easygraph/experiments/base.py create mode 100644 easygraph/experiments/hypergraphs/__init__.py create mode 100644 easygraph/experiments/hypergraphs/hypergraph.py create mode 100644 easygraph/experiments/vertex_classification.py create mode 100644 easygraph/functions/__init__.py create mode 100644 easygraph/functions/basic/__init__.py create mode 100644 easygraph/functions/basic/avg_degree.py create mode 100644 easygraph/functions/basic/cluster.py create mode 100644 easygraph/functions/basic/localassort.py create mode 100644 easygraph/functions/basic/predecessor_path_based.py create mode 100644 easygraph/functions/basic/tests/__init__.py create mode 100644 easygraph/functions/basic/tests/test_avg_degree.py create mode 100644 easygraph/functions/basic/tests/test_cluster.py create mode 100644 easygraph/functions/basic/tests/test_localassort.py create mode 100644 easygraph/functions/basic/tests/test_predecessor.py create mode 100644 easygraph/functions/centrality/__init__.py create mode 100644 easygraph/functions/centrality/betweenness.py create mode 100644 easygraph/functions/centrality/closeness.py create mode 100644 easygraph/functions/centrality/degree.py create mode 100644 easygraph/functions/centrality/ego_betweenness.py create mode 100644 easygraph/functions/centrality/eigenvector.py create mode 100644 easygraph/functions/centrality/flowbetweenness.py create mode 100644 easygraph/functions/centrality/katz_centrality.py create mode 100644 easygraph/functions/centrality/laplacian.py create mode 100644 easygraph/functions/centrality/pagerank.py create mode 100644 easygraph/functions/centrality/tests/__init__.py create mode 100644 easygraph/functions/centrality/tests/test_betweenness.py create mode 100644 easygraph/functions/centrality/tests/test_closeness.py create mode 100644 easygraph/functions/centrality/tests/test_degree.py create mode 100644 easygraph/functions/centrality/tests/test_egobetweenness.py create mode 100644 easygraph/functions/centrality/tests/test_flowbetweenness.py create mode 100644 easygraph/functions/centrality/tests/test_laplacian.py create mode 100644 easygraph/functions/centrality/tests/test_pagerank.py create mode 100644 easygraph/functions/community/LPA.py create mode 100644 easygraph/functions/community/__init__.py create mode 100644 easygraph/functions/community/ego_graph.py create mode 100644 easygraph/functions/community/localsearch.py create mode 100644 easygraph/functions/community/louvain.py create mode 100644 easygraph/functions/community/modularity.py create mode 100644 easygraph/functions/community/modularity_max_detection.py create mode 100644 easygraph/functions/community/motif.py create mode 100644 easygraph/functions/community/tests/__init__.py create mode 100644 easygraph/functions/community/tests/test_LPA.py create mode 100644 easygraph/functions/community/tests/test_LS.py create mode 100644 easygraph/functions/community/tests/test_ego_graph.py create mode 100644 easygraph/functions/community/tests/test_louvian.py create mode 100644 easygraph/functions/community/tests/test_modularity.py create mode 100644 easygraph/functions/community/tests/test_modularity_max_detection.py create mode 100644 easygraph/functions/community/tests/test_motif.py create mode 100644 easygraph/functions/components/__init__.py create mode 100644 easygraph/functions/components/biconnected.py create mode 100644 easygraph/functions/components/connected.py create mode 100644 easygraph/functions/components/strongly_connected.py create mode 100644 easygraph/functions/components/tests/__init__.py create mode 100644 easygraph/functions/components/tests/test_biconnected.py create mode 100644 easygraph/functions/components/tests/test_connected.py create mode 100644 easygraph/functions/components/tests/test_strongly_connected.py create mode 100644 easygraph/functions/components/tests/test_weakly_connected.py create mode 100644 easygraph/functions/components/weakly_connected.py create mode 100644 easygraph/functions/core/__init__.py create mode 100644 easygraph/functions/core/k_core.py create mode 100644 easygraph/functions/core/tests/__init__.py create mode 100644 easygraph/functions/core/tests/test_k_core.py create mode 100644 easygraph/functions/drawing/__init__.py create mode 100644 easygraph/functions/drawing/defaults.py create mode 100644 easygraph/functions/drawing/drawing.py create mode 100644 easygraph/functions/drawing/geometry.py create mode 100644 easygraph/functions/drawing/layout.py create mode 100644 easygraph/functions/drawing/plot.py create mode 100644 easygraph/functions/drawing/positioning.py create mode 100644 easygraph/functions/drawing/simulator.py create mode 100644 easygraph/functions/drawing/tests/__init__.py create mode 100644 easygraph/functions/drawing/tests/test_drawing.py create mode 100644 easygraph/functions/drawing/tests/test_geometry.py create mode 100644 easygraph/functions/drawing/tests/test_plot.py create mode 100644 easygraph/functions/drawing/tests/test_positioning.py create mode 100644 easygraph/functions/drawing/utils.py create mode 100644 easygraph/functions/graph_embedding/NOBE.py create mode 100644 easygraph/functions/graph_embedding/__init__.py create mode 100644 easygraph/functions/graph_embedding/deepwalk.py create mode 100644 easygraph/functions/graph_embedding/line.py create mode 100644 easygraph/functions/graph_embedding/n2v_citesee.pdf create mode 100644 easygraph/functions/graph_embedding/net_emb_example_citeseer.py create mode 100644 easygraph/functions/graph_embedding/node2vec.py create mode 100644 easygraph/functions/graph_embedding/sdne.py create mode 100644 easygraph/functions/graph_embedding/tests/__init__.py create mode 100644 easygraph/functions/graph_embedding/tests/test.emb create mode 100644 easygraph/functions/graph_embedding/tests/test_deepwalk.py create mode 100644 easygraph/functions/graph_embedding/tests/test_line.py create mode 100644 easygraph/functions/graph_embedding/tests/test_nobe.py create mode 100644 easygraph/functions/graph_embedding/tests/test_node2vec.py create mode 100644 easygraph/functions/graph_embedding/tests/test_sdne.py create mode 100644 easygraph/functions/graph_generator/RandomNetwork.py create mode 100644 easygraph/functions/graph_generator/__init__.py create mode 100644 easygraph/functions/graph_generator/classic.py create mode 100644 easygraph/functions/graph_generator/tests/__init__.py create mode 100644 easygraph/functions/graph_generator/tests/test_Random_Network.py create mode 100644 easygraph/functions/graph_generator/tests/test_classic.py create mode 100644 easygraph/functions/hypergraph/__init__.py create mode 100644 easygraph/functions/hypergraph/assortativity.py create mode 100644 easygraph/functions/hypergraph/centrality/__init__.py create mode 100644 easygraph/functions/hypergraph/centrality/cycle_ratio.py create mode 100644 easygraph/functions/hypergraph/centrality/degree.py create mode 100644 easygraph/functions/hypergraph/centrality/hypercoreness.py create mode 100644 easygraph/functions/hypergraph/centrality/s_centrality.py create mode 100644 easygraph/functions/hypergraph/centrality/tests/test_cycle_ratio.py create mode 100644 easygraph/functions/hypergraph/centrality/tests/test_degree.py create mode 100644 easygraph/functions/hypergraph/centrality/tests/test_hypercoreness.py create mode 100644 easygraph/functions/hypergraph/centrality/tests/test_s_centrality.py create mode 100644 easygraph/functions/hypergraph/centrality/tests/test_vector_centrality.py create mode 100644 easygraph/functions/hypergraph/centrality/vector_centrality.py create mode 100644 easygraph/functions/hypergraph/hypergraph_clustering.py create mode 100644 easygraph/functions/hypergraph/hypergraph_operation.py create mode 100644 easygraph/functions/hypergraph/null_model/__init__.py create mode 100644 easygraph/functions/hypergraph/null_model/hypergraph_classic.py create mode 100644 easygraph/functions/hypergraph/null_model/lattice.py create mode 100644 easygraph/functions/hypergraph/null_model/random.py create mode 100644 easygraph/functions/hypergraph/null_model/simple.py create mode 100644 easygraph/functions/hypergraph/null_model/tests/__init__.py create mode 100644 easygraph/functions/hypergraph/null_model/tests/test_classic.py create mode 100644 easygraph/functions/hypergraph/null_model/tests/test_lattice.py create mode 100644 easygraph/functions/hypergraph/null_model/tests/test_simple.py create mode 100644 easygraph/functions/hypergraph/null_model/uniform.py create mode 100644 easygraph/functions/hypergraph/tests/__init__.py create mode 100644 easygraph/functions/hypergraph/tests/test_assortativity.py create mode 100644 easygraph/functions/hypergraph/tests/test_centrality.py create mode 100644 easygraph/functions/hypergraph/tests/test_hypergraph_clustering.py create mode 100644 easygraph/functions/hypergraph/tests/test_hypergraph_operation.py create mode 100644 easygraph/functions/isolate.py create mode 100644 easygraph/functions/path/__init__.py create mode 100644 easygraph/functions/path/average_shortest_path_length.py create mode 100644 easygraph/functions/path/bridges.py create mode 100644 easygraph/functions/path/diameter.py create mode 100644 easygraph/functions/path/mst.py create mode 100644 easygraph/functions/path/path.py create mode 100644 easygraph/functions/path/tests/__init__.py create mode 100644 easygraph/functions/path/tests/test_average_shortest_path_length.py create mode 100644 easygraph/functions/path/tests/test_bridges.py create mode 100644 easygraph/functions/path/tests/test_diameter.py create mode 100644 easygraph/functions/path/tests/test_mst.py create mode 100644 easygraph/functions/path/tests/test_path.py create mode 100644 easygraph/functions/structural_holes/AP_Greedy.py create mode 100644 easygraph/functions/structural_holes/HAM.py create mode 100644 easygraph/functions/structural_holes/HIS.py create mode 100644 easygraph/functions/structural_holes/ICC.py create mode 100644 easygraph/functions/structural_holes/MaxD.py create mode 100644 easygraph/functions/structural_holes/NOBE.py create mode 100644 easygraph/functions/structural_holes/SHII_metric.py create mode 100644 easygraph/functions/structural_holes/__init__.py create mode 100644 easygraph/functions/structural_holes/evaluation.py create mode 100644 easygraph/functions/structural_holes/maxBlock.py create mode 100644 easygraph/functions/structural_holes/metrics.py create mode 100644 easygraph/functions/structural_holes/tests/test_AP_Greedy.py create mode 100644 easygraph/functions/structural_holes/tests/test_HAM.py create mode 100644 easygraph/functions/structural_holes/tests/test_HIS.py create mode 100644 easygraph/functions/structural_holes/tests/test_ICC.py create mode 100644 easygraph/functions/structural_holes/tests/test_MaxD.py create mode 100644 easygraph/functions/structural_holes/tests/test_NOBE.py create mode 100644 easygraph/functions/structural_holes/tests/test_SHII_metric.py create mode 100644 easygraph/functions/structural_holes/tests/test_evaluation.py create mode 100644 easygraph/functions/structural_holes/tests/test_maxBlock.py create mode 100644 easygraph/functions/structural_holes/tests/test_metrics.py create mode 100644 easygraph/functions/structural_holes/tests/test_weakTie.py create mode 100644 easygraph/functions/structural_holes/weakTie.py create mode 100644 easygraph/functions/tests/__init__.py create mode 100644 easygraph/functions/tests/test_isolate.py create mode 100644 easygraph/ml_metrics/__init__.py create mode 100644 easygraph/ml_metrics/base.py create mode 100644 easygraph/ml_metrics/classification.py create mode 100644 easygraph/ml_metrics/hypergraphs/__init__.py create mode 100644 easygraph/ml_metrics/hypergraphs/hypergraph.py create mode 100644 easygraph/model/__init__.py create mode 100644 easygraph/model/hypergraphs/__init__.py create mode 100644 easygraph/model/hypergraphs/dhcf.py create mode 100644 easygraph/model/hypergraphs/dhne.py create mode 100644 easygraph/model/hypergraphs/hgnn.py create mode 100644 easygraph/model/hypergraphs/hgnnp.py create mode 100644 easygraph/model/hypergraphs/hnhn.py create mode 100644 easygraph/model/hypergraphs/hwnn.py create mode 100644 easygraph/model/hypergraphs/hypergcn.py create mode 100644 easygraph/model/hypergraphs/setgnn.py create mode 100644 easygraph/model/hypergraphs/unignn.py create mode 100644 easygraph/nn/__init__.py create mode 100644 easygraph/nn/convs/__init__.py create mode 100644 easygraph/nn/convs/common.py create mode 100644 easygraph/nn/convs/hypergraphs/__init__.py create mode 100644 easygraph/nn/convs/hypergraphs/dhcf_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/halfnlh_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/hgnn_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/hgnnp_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/hnhn_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/hwnn_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/hypergcn_conv.py create mode 100644 easygraph/nn/convs/hypergraphs/unignn_conv.py create mode 100644 easygraph/nn/convs/pma.py create mode 100644 easygraph/nn/loss.py create mode 100644 easygraph/nn/regularization.py create mode 100644 easygraph/nn/tests/__init__.py create mode 100644 easygraph/nn/tests/test_gatconv.py create mode 100644 easygraph/nn/tests/test_gcnconv.py create mode 100644 easygraph/nn/tests/test_graphsageconv.py create mode 100644 easygraph/nn/tests/test_regularization.py create mode 100644 easygraph/readwrite/__init__.py create mode 100644 easygraph/readwrite/edgelist.py create mode 100644 easygraph/readwrite/gexf.py create mode 100644 easygraph/readwrite/gml.py create mode 100644 easygraph/readwrite/graphml.py create mode 100644 easygraph/readwrite/graphviz.py create mode 100644 easygraph/readwrite/json_graph/__init__.py create mode 100644 easygraph/readwrite/json_graph/node_link.py create mode 100644 easygraph/readwrite/pajek.py create mode 100644 easygraph/readwrite/pickle.py create mode 100644 easygraph/readwrite/tests/__init__.py create mode 100644 easygraph/readwrite/tests/test_edgelist.py create mode 100644 easygraph/readwrite/tests/test_gexf.py create mode 100644 easygraph/readwrite/tests/test_gml.py create mode 100644 easygraph/readwrite/tests/test_graphml.py create mode 100644 easygraph/readwrite/tests/test_graphviz.py create mode 100644 easygraph/readwrite/tests/test_pajek.py create mode 100644 easygraph/readwrite/tests/test_pickle.py create mode 100644 easygraph/readwrite/tests/test_ucinet.py create mode 100644 easygraph/readwrite/ucinet.py create mode 100644 easygraph/test.emb create mode 100644 easygraph/tests/__init__.py create mode 100644 easygraph/tests/script_test_cpp_easygraph.py create mode 100644 easygraph/tests/teddy_test_cpp_easygraph_sanity_check.py create mode 100644 easygraph/tests/test_convert.py create mode 100644 easygraph/tests/test_cpp_easygraph.py create mode 100644 easygraph/tests/test_hif.py create mode 100644 easygraph/utils/HIF.py create mode 100644 easygraph/utils/__init__.py create mode 100644 easygraph/utils/alias.py create mode 100644 easygraph/utils/convert_class.py create mode 100644 easygraph/utils/convert_to_matrix.py create mode 100644 easygraph/utils/decorators.py create mode 100644 easygraph/utils/download.py create mode 100644 easygraph/utils/exception.py create mode 100644 easygraph/utils/index_of_node.py create mode 100644 easygraph/utils/logging.py create mode 100644 easygraph/utils/mapped_queue.py create mode 100644 easygraph/utils/misc.py create mode 100644 easygraph/utils/relabel.py create mode 100644 easygraph/utils/sparse.py create mode 100644 easygraph/utils/type_change.py create mode 100644 examples/README.md create mode 100644 f8 create mode 100644 gpu_easygraph/CMakeLists.txt create mode 100644 gpu_easygraph/common/common.h create mode 100644 gpu_easygraph/common/err.cpp create mode 100644 gpu_easygraph/common/err.h create mode 100644 gpu_easygraph/functions/centrality/baseline create mode 100644 gpu_easygraph/functions/centrality/bc_mem_prev create mode 100644 gpu_easygraph/functions/centrality/betweenness_centrality.cu create mode 100644 gpu_easygraph/functions/centrality/betweenness_centrality.cuh create mode 100644 gpu_easygraph/functions/centrality/centrality.cpp create mode 100644 gpu_easygraph/functions/centrality/closeness_centrality.cu create mode 100644 gpu_easygraph/functions/centrality/closeness_centrality.cuh create mode 100644 gpu_easygraph/functions/core/core.cpp create mode 100644 gpu_easygraph/functions/core/k_core.cu create mode 100644 gpu_easygraph/functions/core/k_core.cuh create mode 100644 gpu_easygraph/functions/path/path.cpp create mode 100644 gpu_easygraph/functions/path/sssp_dijkstra.cu create mode 100644 gpu_easygraph/functions/path/sssp_dijkstra.cuh create mode 100644 gpu_easygraph/functions/structural_holes/constraint.cpp create mode 100644 gpu_easygraph/functions/structural_holes/constraint.cu create mode 100644 gpu_easygraph/functions/structural_holes/constraint.cuh create mode 100644 gpu_easygraph/functions/structural_holes/effective_size.cpp create mode 100644 gpu_easygraph/functions/structural_holes/effective_size.cu create mode 100644 gpu_easygraph/functions/structural_holes/effective_size.cuh create mode 100644 gpu_easygraph/functions/structural_holes/hierarchy.cpp create mode 100644 gpu_easygraph/functions/structural_holes/hierarchy.cu create mode 100644 gpu_easygraph/functions/structural_holes/hierarchy.cuh create mode 100644 gpu_easygraph/gpu_easygraph.h create mode 100644 pyproject.toml create mode 100644 pytest.ini create mode 100644 requirements.txt create mode 100644 scripts/README.md create mode 100644 scripts/Solution.md create mode 100644 scripts/build_easygraph_linux.sh create mode 100644 scripts/build_easygraph_macos.sh create mode 100644 scripts/build_easygraph_windows.bat create mode 100644 scripts/build_packages_linux.sh create mode 100644 scripts/check_installation.py create mode 100644 scripts/upload_easygraph.sh create mode 100644 setup.py create mode 100644 tox-conda-test.ini create mode 100644 tox-conda.ini create mode 100644 tox-test.ini create mode 100644 tox.ini diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 0000000..dd171dd --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,10 @@ +[bumpversion] +current_version = 0.2a47 +commit = True +tag = True +parse = (?P\d+)\.(?P\d+)a(?P\d+) +serialize = {major}.{minor}a{patch} + +[bumpversion:file:setup.py] +search = version="{current_version}" +replace = version="{new_version}" diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..daa7560 --- /dev/null +++ b/.flake8 @@ -0,0 +1,69 @@ +[flake8] +min_python_version = 3.7.0 +max-line-length = 88 +ban-relative-imports = true +# flake8-use-fstring: https://github.com/MichaelKim0407/flake8-use-fstring#--percent-greedy-and---format-greedy +format-greedy = 1 +inline-quotes = double +enable-extensions = TC, TC1 +type-checking-exempt-modules = typing, typing-extensions +eradicate-whitelist-extend = ^-.*; +extend-ignore = + # E203: Whitespace before ':' (pycqa/pycodestyle#373) + E203, + # SIM106: Handle error-cases first + SIM106, + # ANN101: Missing type annotation for self in method + ANN101, + # ANN102: Missing type annotation for cls in classmethod + ANN102, + F401, + F403, + I252, + SIM115, + N806, + N803, + B007, + E501, + C408, + SIM113, + N802, + N400, + E501, + E802, + E800, + B001, + B006, + B020, + C414, + C416, + E402, + E711, + E712, + E722, + E741, + F405, + F541, + F811, + F821, + F841, + FS001, + FS002, + I250, + N801, + N804, + N812, + N816, + Q002, + SIM102, + SIM105, + SIM111, + SIM114, + SIM118, + SIM201, + SIM203, + SIM300, + SIM401, + TC002 + + diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md new file mode 100644 index 0000000..2839b7a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---bug-report.md @@ -0,0 +1,32 @@ +--- +name: "\U0001F41E Bug Report" +about: Did you find a bug? +title: '' +labels: Bug, Triage +assignees: '' + +--- + + + + +- [ ] I am on the [latest](https://github.com/easy-graph/Easy-Graph/releases/latest) EasyGraph version. +- [ ] I have searched the [issues](https://github.com/easy-graph/Easy-Graph/issues) of this repo and believe that this is not a duplicate. + + + +- **OS version and name**: +- **EasyGraph version**: + + +## Issue + diff --git a/.github/ISSUE_TEMPLATE/---documentation.md b/.github/ISSUE_TEMPLATE/---documentation.md new file mode 100644 index 0000000..24277b6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---documentation.md @@ -0,0 +1,22 @@ +--- +name: "\U0001F4DA Documentation" +about: Did you find errors, problems, or anything unintelligible in the docs (https://easy-graph.github.io/)? +title: '' +labels: Documentation, Triage +assignees: '' + +--- + + + + +- [ ] I have searched the [issues](https://github.com/easy-graph/Easy-Graph/issues) of this repo and believe that this is not a duplicate. + +## Issue + diff --git a/.github/ISSUE_TEMPLATE/---everything-else.md b/.github/ISSUE_TEMPLATE/---everything-else.md new file mode 100644 index 0000000..3de8b9c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---everything-else.md @@ -0,0 +1,20 @@ +--- +name: "\U0001F5C3 Everything Else" +about: For questions and issues that do not fall in any of the other categories. This + can include questions about EasyGraph's roadmap. For support questions, please post + on StackOverflow. +title: '' +labels: '' +assignees: '' + +--- + + + + + +- [ ] I have searched the [issues](https://github.com/easy-graph/Easy-Graph/issues) of this repo and believe that this is not a duplicate. +- [ ] I have searched the [documentation](https://easy-graph.github.io/) and believe that my question is not covered. + +## Issue + diff --git a/.github/ISSUE_TEMPLATE/---feature-request.md b/.github/ISSUE_TEMPLATE/---feature-request.md new file mode 100644 index 0000000..c7eb2db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---feature-request.md @@ -0,0 +1,23 @@ +--- +name: "\U0001F381 Feature Request" +about: Do you have ideas for new features and improvements? +title: '' +labels: Feature, Triage +assignees: '' + +--- + + + + +- [ ] I have searched the [issues](https://github.com/easy-graph/Easy-Graph/issues) of this repo and believe that this is not a duplicate. +- [ ] I have searched the [documentation](https://easy-graph.github.io/) and believe that my question is not covered. + +## Feature Request + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..a1249f1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser +blank_issues_enabled: true +contact_links: +- name: '💬 Discord Server' + url: https://discord.gg/JV6N8Whe + about: | + Chat with the community, ask questions and learn about best practices. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7a4ac0c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +# Pull Request Check List + +Resolves: #issue-number-here + + + +- [ ] Added **tests** for changed code. +- [ ] Updated **documentation** for changed code. + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..4eeafeb --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/archive/release-all-mlwb.yaml b/.github/workflows/archive/release-all-mlwb.yaml new file mode 100644 index 0000000..5eb1cab --- /dev/null +++ b/.github/workflows/archive/release-all-mlwb.yaml @@ -0,0 +1,44 @@ +# https://github.com/marketplace/actions/manylinux-wheel-builder +name: pypi deployer +on: + workflow_dispatch + # push + # push: + # tags: + # - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 +jobs: + Linux-build: + runs-on: ubuntu-22.04 + env: + TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + steps: + - uses: actions/checkout@v2 + - name: build and upload manylinux wheels + # cSpell:disable + uses: Niraj-Kamdar/manylinux-wheel-builder@master + # cSpell:enable + Matrix-build: + runs-on: ${{ matrix.os }} + env: + TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + strategy: + matrix: + python-version: [3.6, 3.7, 3.8, 3.9] + os: [macos-latest, windows-latest] + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: build wheel + run: | + pip install wheel + python setup.py bdist_wheel + - name: upload wheel + run: | + pip install twine + twine upload dist/* + continue-on-error: true diff --git a/.github/workflows/archive/release-macos.yaml b/.github/workflows/archive/release-macos.yaml new file mode 100644 index 0000000..8379682 --- /dev/null +++ b/.github/workflows/archive/release-macos.yaml @@ -0,0 +1,41 @@ +name: Build and Publish to PyPI (macOS) + +# on: push +# disabled on push cuz Error: Container action is only supported on Linux +# no solution found yet +on: workflow_dispatch + +jobs: + build-n-publish: + # name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI + name: Build and publish Python 🐍 distributions 📦 to PyPI + # runs-on: ubuntu-22.04 + runs-on: macos-latest + strategy: + matrix: + python-version: ["3.6", "3.7", "3.8", "3.9"] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + - name: Publish distribution 📦 to PyPI + # if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/archive/release-manylinux.yaml b/.github/workflows/archive/release-manylinux.yaml new file mode 100644 index 0000000..40773ba --- /dev/null +++ b/.github/workflows/archive/release-manylinux.yaml @@ -0,0 +1,50 @@ +name: Build and Publish to PyPI (manylinux) + +on: workflow_dispatch + +jobs: + build-n-publish: + # name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI + name: Build and publish Python 🐍 distributions 📦 to PyPI + # runs-on: ubuntu-22.04 + runs-on: ubuntu-22.04 + # strategy: + # matrix: + # python-version: ["3.6", "3.7", "3.8", "3.9"] + steps: + - uses: actions/checkout@v2 + # - name: Set up Python ${{ matrix.python-version }} + # uses: actions/setup-python@v2 + # with: + # python-version: ${{ matrix.python-version }} + # - name: Install pypa/build + # run: >- + # python -m + # pip install + # build + # --user + # - name: Build a binary wheel and a source tarball + # run: >- + # python -m + # build + # --sdist + # --wheel + # --outdir dist/ + # . + # cSpell:disable + - name: Build on manylinux + uses: RalfG/python-wheels-manylinux-build@v0.4.2-manylinux2014_x86_64 + # cSpell:enable + with: + python-versions: "cp36-cp36m cp37-cp37m cp38-cp38m cp39-cp39m" + # build-requirements: "cython numpy" + # system-packages: "lrzip-devel zlib-devel" + # pre-build-command: "sh pre-build-script.sh" + # package-path: "my_project" + # pip-wheel-args: "-w ./dist --no-deps" + # pip-wheel-args: "--sdist --wheel --outdir dist/" + - name: Publish distribution 📦 to PyPI + # if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/benchmarking.yaml b/.github/workflows/benchmarking.yaml new file mode 100644 index 0000000..a58a3a2 --- /dev/null +++ b/.github/workflows/benchmarking.yaml @@ -0,0 +1,15 @@ +name: "Run Teddy's benchmarking workflow" +on: + # push: + # pull_request: + workflow_dispatch: + +jobs: + trigger: + permissions: write-all + name: "Trigger Teddy's benchmarking workflow" + uses: tddschn/easygraph-bench/.github/workflows/bench-all.yaml@master + secrets: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + releaseTag: "CI-easygraph-bench" diff --git a/.github/workflows/diagram.yml b/.github/workflows/diagram.yml new file mode 100644 index 0000000..622115f --- /dev/null +++ b/.github/workflows/diagram.yml @@ -0,0 +1,16 @@ +name: Create diagram +on: + workflow_dispatch: {} + # push: + # branches: + # - master +jobs: + get_data: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Update diagram + uses: githubocto/repo-visualizer@main + with: + excluded_paths: "ignore,.github" diff --git a/.github/workflows/pr_code_check.yaml b/.github/workflows/pr_code_check.yaml new file mode 100644 index 0000000..9ed8768 --- /dev/null +++ b/.github/workflows/pr_code_check.yaml @@ -0,0 +1,50 @@ +name: PR code review + +on: + workflow_dispatch: + pull_request: + branches: + - pybind11 + push: + branches: + - pybind11 + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + strategy: + fail-fast: false + matrix: + platform: [windows-latest, macos-latest, ubuntu-latest] + python-version: ["3.9", "3.12"] + + runs-on: ${{ matrix.platform }} + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Installing dependencies + uses: py-actions/py-dependency-install@v4 + with: + path: "requirements.txt" + + - name: Add requirements + run: python -m pip install --upgrade setuptools wheel build packaging + + - name: Build and install + run: pip install --verbose . + + - name: Smoke test + run: python -c "import os, tempfile; os.chdir(tempfile.gettempdir()); import easygraph as eg; G = eg.Graph(); G.add_edge(1, 2); assert G.number_of_nodes() == 2; assert G.number_of_edges() == 1" diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml new file mode 100644 index 0000000..dfffd26 --- /dev/null +++ b/.github/workflows/pre-commit.yaml @@ -0,0 +1,38 @@ +name: pre-commit + +on: + workflow_dispatch: + pull_request: + branches: + - pybind11 + push: + branches: + - pybind11 + +jobs: + pre-commit: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install pre-commit + run: python -m pip install pre-commit + + - name: Run pre-commit on changed files + shell: bash + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + base_ref="${{ github.event.pull_request.base.sha }}" + elif [[ -n "${{ github.event.before }}" && ! "${{ github.event.before }}" =~ ^0+$ ]]; then + base_ref="${{ github.event.before }}" + else + base_ref="$(git rev-parse HEAD~1)" + fi + + pre-commit run --show-diff-on-failure --color=always --from-ref "$base_ref" --to-ref "${{ github.sha }}" diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 0000000..9968375 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,19 @@ +name: "Close stale issues and PRs" +on: + schedule: + - cron: "30 1 * * *" + +jobs: + stale: + runs-on: ubuntu-22.04 + steps: + - uses: actions/stale@v4 + with: + stale-issue-message: "This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days." + stale-pr-message: "This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days." + close-issue-message: "This issue was closed because it has been stalled for 5 days with no activity." + close-pr-message: "This PR was closed because it has been stalled for 10 days with no activity." + days-before-issue-stale: 30 + days-before-pr-stale: 45 + days-before-issue-close: 5 + days-before-pr-close: 10 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..33ff418 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,46 @@ +name: Test the package with pytest + +on: + workflow_dispatch: + pull_request: + branches: + - pybind11 + push: + branches: + - pybind11 + +jobs: + pytest: + name: Test with pytest + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + # ubuntu 22.04 has deprecated python 3.6 + python-version: [ "3.8", "3.9", "3.10","3.11", "3.12"] + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Installing dependencies + uses: py-actions/py-dependency-install@v4 + with: + path: "requirements.txt" + + - name: Installing test dependencies + run: | + pip install pytest + + - name: Build and install package + run: | + pip install . + + - name: Test with pytest + run: | + pytest easygraph --disable-warnings diff --git a/.github/workflows/translator.yaml b/.github/workflows/translator.yaml new file mode 100644 index 0000000..0ae2e53 --- /dev/null +++ b/.github/workflows/translator.yaml @@ -0,0 +1,34 @@ +#name: 'issue-translator' +#on: +# issue_comment: +# types: [created] +# issues: +# types: [opened] +# +#jobs: +# build: +# runs-on: ubuntu-latest +# steps: +# - uses: usthe/issues-translate-action@v2.7 +# with: +# IS_MODIFY_TITLE: false +# # not require, default false, . Decide whether to modify the issue title +# # if true, the robot account @Issues-translate-bot must have modification permissions, invite @Issues-translate-bot to your project or use your custom bot. +# CUSTOM_BOT_NOTE: Bot detected the issue body's language is not English, translate it automatically. 👯👭🏻🧑‍🤝‍🧑👫🧑🏿‍🤝‍🧑🏻👩🏾‍🤝‍👨🏿👬🏿 +# # not require. Customize the translation robot prefix message. +name: 'issue-translator' +on: + issue_comment: + types: [created] + issues: + types: [opened] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: usthe/issues-translate-action@v2.7 + with: + CUSTOM_BOT_NOTE: hello + BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }} + diff --git a/.github/workflows/wheel_publish.yml b/.github/workflows/wheel_publish.yml new file mode 100644 index 0000000..2065873 --- /dev/null +++ b/.github/workflows/wheel_publish.yml @@ -0,0 +1,75 @@ +name: Build,download and publish wheels +on: workflow_dispatch +jobs: + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + # sdist used to compile in user local environment + - name: Build sdist + run: pipx run build --sdist + + - uses: actions/upload-artifact@v4 + with: + name: cibw-sdist + path: dist/*.tar.gz + + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + # macos-13 is closing down, macos-15 is apple silicon + # macos-15-intel is for the x86_64 + # note: Apple has discontinued support for the x86_64 (Intel) architecture + os: [ ubuntu-latest, windows-latest, macos-15, macos-15-intel] +# modify python version in project.toml + steps: + # 检出代码 + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: true + + - uses: actions/setup-python@v5 + + # You can test your matrix by printing the current Python version + - name: Display Python version + run: python -c "import sys; print(sys.version)" + - name: Install dependencies + run: python -m pip install --upgrade pip setuptools wheel build packaging + + + - name: Build wheels + uses: pypa/cibuildwheel@v2.23.3 + with: + output-dir: dist/ + + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} + path: dist/*.whl + + + upload_pypi: + needs: [build_wheels, build_sdist] + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + # unpacks all CIBW artifacts into dist/ + pattern: cibw-* + path: dist + merge-multiple: true + + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@v1.12.4 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + skip-existing: true + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7398e80 --- /dev/null +++ b/.gitignore @@ -0,0 +1,212 @@ +*.tmp +.vscode +__pycache__ +test/ +related-repos/ +tmp_test/test.py +tmp_test/dynamic_hypergraph.pdf +tmp_test/hypergraph_learning_tutorial.py +tmp_test/visulation_test.py +hypergraph-bench/ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# End of https://www.toptal.com/developers/gitignore/api/python +.idea/ + +# Visual Studio project files +x64/ +.vs/ +*.sln +*.vcxproj +*.vcxproj.filters +*.vcxproj.user + +workspace/ +.DS_Store# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +tmp_test/allset_test.py +tmp_test/ +RandomNetwork.txt +TEST/ +CON_TEST/ +Comm_TEST/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..523376d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "cpp_easygraph/pybind11"] + path = cpp_easygraph/pybind11 + url = https://github.com/pybind/pybind11.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..c653558 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,94 @@ +ci: + autofix_prs: false + +repos: + # - repo: https://github.com/pre-commit/pre-commit-hooks + # rev: v4.3.0 + # hooks: + # - id: trailing-whitespace + # - id: end-of-file-fixer + # exclude: ^.*\.egg-info/ + # - id: check-merge-conflict + # - id: check-case-conflict + # - id: check-json + # - id: check-toml + # - id: check-yaml + # - id: pretty-format-json + # args: [--autofix, --no-ensure-ascii, --no-sort-keys] + # - id: check-ast + # - id: debug-statements + # - id: check-docstring-first + + # - repo: https://github.com/pre-commit/pygrep-hooks + # rev: v1.9.0 + # hooks: + # - id: python-check-mock-methods + # - id: python-use-type-annotations + # - id: python-check-blanket-noqa + + # - repo: https://github.com/asottile/yesqa + # rev: v1.3.0 + # hooks: + # - id: yesqa + # additional_dependencies: &flake8_deps + # - flake8-annotations==2.9.0 + # - flake8-broken-line==0.4.0 + # - flake8-bugbear==22.4.25 + # - flake8-comprehensions==3.10.0 + # - flake8-eradicate==1.2.1 + # - flake8-quotes==3.3.1 + # - flake8-simplify==0.19.2 + # - flake8-tidy-imports==4.8.0 + # - flake8-type-checking==1.5.0 + # - flake8-typing-imports==1.12.0 + # - flake8-use-fstring==1.3 + # - pep8-naming==0.12.1 + + # - repo: https://github.com/asottile/pyupgrade + # rev: v2.37.1 + # hooks: + # - id: pyupgrade + # args: [--py36-plus] + # exclude: ^(install|get)-poetry.py$ + + # - repo: https://github.com/hadialqattan/pycln + # rev: v2.0.4 + # hooks: + # - id: pycln + # args: [--all] + + - repo: https://github.com/pycqa/isort + # rev: 5.10.1 + # https://stackoverflow.com/questions/75269700/pre-commit-fails-to-install-isort-5-11-4-with-error-runtimeerror-the-poetry-co + rev: 5.12.0 + hooks: + - id: isort + name: "isort (python)" + types: [python] + args: [] + # args: [--add-import, from __future__ import annotations] + # exclude: | + # (?x)( + # ^(install|get)-poetry.py$ + # | ^src/poetry/__init__.py$ + # ) + # - id: isort + # name: "isort (pyi)" + # types: [pyi] + # args: [--lines-after-imports, "-1"] + + - repo: https://github.com/psf/black + rev: 22.6.0 + hooks: + - id: black + + # - repo: https://github.com/pycqa/flake8 + # rev: 4.0.1 + # hooks: + # - id: flake8 + # additional_dependencies: *flake8_deps + + - repo: https://github.com/pre-commit/pre-commit + rev: v2.20.0 + hooks: + - id: validate_manifest diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ca28feb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.23) + +project(easygraph) + +option(EASYGRAPH_ENABLE_OPENMP "Enable OpenMP acceleration (auto-detect)" ON) + +option(EASYGRAPH_ENABLE_GPU "EASYGRAPH_ENABLE_GPU" OFF) + +add_subdirectory(cpp_easygraph) + +if (EASYGRAPH_ENABLE_GPU) + message("easygraph gpu module is enabled") + add_subdirectory(gpu_easygraph) + target_include_directories(cpp_easygraph + PRIVATE gpu_easygraph + ) +else() + message("easygraph gpu module is disabled") +endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..281a957 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,253 @@ +# Contributing to easygraph + +First off, thanks for taking the time to contribute! + +The following is a set of guidelines for contributing to easygraph on GitHub. These are mostly guidelines, not rules. Use your best judgement, and feel free to propose changes to this document in a pull request. + +#### Table of contents + +[How to contribute](#how-to-contribute) + + * [Reporting bugs](#reporting-bugs) + * [Suggesting enhancements](#suggesting-enhancements) + * [Contributing to documentation](#contributing-to-documentation) + * [Contributing to code](#contributing-to-code) + * [Issue triage](#issue-triage) + * [Git workflow](#git-workflow) + + +## How to contribute + +### Reporting bugs + +This section guides you through submitting a bug report for easygraph. +Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports. + +Before creating bug reports, please check [this list](#before-submitting-a-bug-report) to be sure that you need to create one. When you are creating a bug report, please include as many details as possible. Fill out the [required template](https://github.com/easy-graph/Easy-Graph/blob/master/.github/ISSUE_TEMPLATE/---bug-report.md), the information it asks helps the maintainers resolve the issue faster. + +> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. + +#### Before submitting a bug report + + +* **Check that your issue does not already exist in the [issue tracker](https://github.com/easy-graph/Easy-Graph/issues)**. + +#### How do I submit a bug report? + +Bugs are tracked on the [official issue tracker](https://github.com/easy-graph/Easy-Graph/issues) where you can create a new one and provide the following information by filling in [the template](https://github.com/easy-graph/Easy-Graph/blob/master/.github/ISSUE_TEMPLATE/---bug-report.md). + +Explain the problem and include additional details to help maintainers reproduce the problem: + +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Describe the exact steps which reproduce the problem** in as many details as possible. + +* **Provide specific examples to demonstrate the steps to reproduce the issue**. Include links to files or GitHub projects, or copy-paste-able snippets, which you use in those examples. +* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. +* **Explain which behavior you expected to see instead and why.** + + +Provide more context by answering these questions: + +* **Did the problem start happening recently** (e.g. after updating to a new version of easygraph) or was this always a problem? +* If the problem started happening recently, **can you reproduce the problem in an older version of easygraph?** What's the most recent version in which the problem doesn't happen? +* **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens. + +Include details about your configuration and environment: + +* **Which version of easygraph are you using?** +* **Which Python version easygraph has been installed for?** +* **What's the name and version of the OS you're using**? + + +### Suggesting enhancements + +This section guides you through submitting an enhancement suggestion for easygraph, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions. + +Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-an-enhancement-suggestion). Fill in [the template](https://github.com/easy-graph/Easy-Graph/blob/master/.github/ISSUE_TEMPLATE/---feature-request.md), including the steps that you imagine you would take if the feature you're requesting existed. + +#### Before submitting an enhancement suggestion + + +* **Check that your issue does not already exist in the [issue tracker](https://github.com/easy-graph/Easy-Graph/issues)**. + +#### How do I submit an Enhancement suggestion? + +Enhancement suggestions are tracked on the [official issue tracker](https://github.com/easy-graph/Easy-Graph/issues) where you can create a new one and provide the following information: + +* **Use a clear and descriptive title** for the issue to identify the suggestion. +* **Provide a step-by-step description of the suggested enhancement** in as many details as possible. +* **Provide specific examples to demonstrate the steps**.. +* **Describe the current behavior** and **explain which behavior you expected to see instead** and why. + +### Contributing to documentation + +One of the simplest ways to get started contributing to a project is through improving documentation. easygraph is constantly evolving, this means that sometimes our documentation has gaps. You can help by +adding missing sections, editing the existing content so it is more accessible or creating new content (tutorials, FAQs, etc). + +> **Note:** A great way to understand easygraph's design and how it all fits together, is to add FAQ entries for commonly +> asked questions. easygraph members usually mark issues with [candidate/faq](https://github.com/easy-graph/Easy-Graph/issues?q=is%3Aissue+label%3Acandidate%2Ffaq+) to indicate that the issue either contains a response +> that explains how something works or might benefit from an entry in the FAQ. + +Issues pertaining to the documentation are usually marked with the [Documentation](https://github.com/easy-graph/Easy-Graph/labels/Documentation) label. + +### Contributing to code + +#### Picking an issue + +> **Note:** If you are a first time contributor, and are looking for an issue to take on, you might want to look for [Good First Issue](https://github.com/easy-graph/Easy-Graph/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Issue%22) +> labelled issues. We do our best to label such issues, however we might fall behind at times. So, ask us. + + +the code base, join us on our [Discord Server](https://discord.gg/ppgcw2wUPg). + +#### Local development + +You will need easygraph to start contributing on the easygraph codebase. Refer to the [documentation](https://easy-graph.github.io/) to start using easygraph. + +> **Note:** Local development of easygraph requires Python 3.8 or newer. + +You will first need to clone the repository using `git` and place yourself in its directory: + +```bash +git clone git@github.com:python-easygraph/easygraph.git +cd easygraph +``` + +> **Note:** We recommend that you use a personal [fork](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/fork-a-repo) for this step. If you are new to GitHub collaboration, +> you can refer to the [Forking Projects Guide](https://guides.github.com/activities/forking/). + +Now, you will need to install the required dependency for easygraph and be sure that the current +tests are passing on your machine: + +```bash +pytest +``` + + + +easygraph uses the [black](https://github.com/psf/black) coding style and you must ensure that your +code follows it. If not, the CI will fail and your Pull Request will not be merged. + +Similarly, the import statements are sorted with [isort](https://github.com/timothycrosley/isort) +and special care must be taken to respect it. If you don't, the CI will fail as well. + +To make sure that you don't accidentally commit code that does not follow the coding style, you can +install a [pre-commit](https://pre-commit.com/) hook that will check that everything is in order: + +```bash +pre-commit install +``` + +You can also run it anytime using: + +```bash +pre-commit run --all-files +``` + +Your code must always be accompanied by corresponding tests, if tests are not present your code +will not be merged. + +#### Run the Tests Locally + +- Install [tox](https://tox.readthedocs.io/) and [pyenv](https://github.com/pyenv/pyenv) +- Use pyenv to install python 3.6 to 3.10, and make sure that `python3.6`, `python3.7`, ..., `python3.10` is in your `$PATH`. +- Run `tox` to run the tests across python 3.6 to 3.10. +- To only run tox on python3.9 and 3.10, run `tox -e py39,py310`. + +#### Pull requests + +* Fill in [the required template](https://github.com/easy-graph/Easy-Graph/blob/master/.github/PULL_REQUEST_TEMPLATE.md) +* Be sure that your pull request contains tests that cover the changed or added code. +* If your changes warrant a documentation change, the pull request must also update the documentation. + +> **Note:** Make sure your branch is [rebased](https://docs.github.com/en/free-pro-team@latest/github/using-git/about-git-rebase) against the latest main branch. A maintainer might ask you to ensure the branch is +> up-to-date prior to merging your Pull Request if changes have conflicts. + +All pull requests, unless otherwise instructed, need to be first accepted into the main branch (`master`). + +### Issue triage + + + +If you are helping with the triage of reported issues, this section provides some useful information to assist you in your contribution. + +#### Triage steps + + +1. Attempt to reproduce the issue with the reported easygraph version or request further clarification from the issue author. +1. Ensure the issue is not already resolved. You can attempt to reproduce using the latest preview release and/or easygraph from the main branch. +1. If the issue cannot be reproduced, + 1. clarify with the issue's author, + +1. If the issue can be reproduced, + 1. comment on the issue confirming so + + 1. if possible, identify the root cause of the issue. + 1. if interested, attempt to fix it via a pull request. + + + +### Git Workflow + +All development work is performed against easygraph's main branch (`master`). All changes are expected to be submitted and accepted to this +branch. + +#### Release branch + +When a release is ready, the following are required before a release is tagged. + +1. A release branch with the prefix `release-`, eg: `release-1.1.0rc1`. +1. A pull request from the release branch to the main branch (`master`) if it's a minor or major release. Otherwise, to the bug fix branch (eg: `1.0`). + 1. The pull request description MUST include the change log corresponding to the release (eg: [#2971](https://github.com/easy-graph/Easy-Graph/pull/2971)). + 1. The pull request must contain a commit that updates [CHANGELOG.md](CHANGELOG.md) and bumps the project version (eg: [#2971](https://github.com/easy-graph/Easy-Graph/pull/2971/commits/824e7b79defca435cf1d765bb633030b71b9a780)). + 1. The pull request must have the `Release` label specified. + + + +1. Tag the branch with the version identifier (eg: `1.1.0rc1`). +2. Merge the pull request once the release is created and assets are uploaded by the CI. + +> **Note:** In this case, we prefer a merge commit instead of squash or rebase merge. + +#### Bug fix branch + +Once a minor version (eg: `1.1.0`) is released, a new branch for the minor version (eg: `1.1`) is created for the bug fix releases. Changes identified +or acknowledged by the easygraph team as requiring a bug fix can be submitted as a pull requests against this branch. + +At the time of writing only issues meeting the following criteria may be accepted into a bug fix branch. Trivial fixes may be accepted on a +case-by-case basis. + +1. The issue breaks a core functionality and/or is a critical regression. +1. The change set does not introduce a new feature or changes an existing functionality. +1. A new minor release is not expected within a reasonable time frame. +1. If the issue affects the next minor/major release, a corresponding fix has been accepted into the main branch. + +> **Note:** This is subject to the interpretation of a maintainer within the context of the issue. diff --git a/EG_framework.png b/EG_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..0acc21382e105fd1aaca3b5dfe9d022350bae260 GIT binary patch literal 186349 zcmeFY1CwRT)-Jrtwr#tMUAAr8w!3V*s>`-*yQ_;`wr%^X{oe1qapUZL&M&wtVn*hg z@yr>SBS(%LcxJe~tQZ_LHZ%YLfRhjxRs;aRD**ryKSa{4J^(O5FH1KEExqQFriZzb=Gk%QJ1z7k#4}=|GkKTlWbP$;G{juj)2hKF|xQZItBH!U>#Su)9 zBQIdoJgfoC(T8Yo1gLlMrl_765GL96dyu#cc`9g$9~>meJsA10{MwalQgwHLIwOe` zelQhiI{(JKUK?=qn47IJF%`^xH-*?C1!@Qd;1nW+--&bw4oj{>prXaC8B9jx67-@P zWW?_s|A=9Jw0m0ydE?f-0H_`oAy+ZhX>0aoy!oaa_(~c0=WmAc;3~({QcL{gtK6=7 zyJnJ<4sMl7z{9AiWE~_J1a?^m;-?}OQ7&J>XWjkvz1F7}($Ecvffn45IgEr9%%KkZ zhieQ+01VR_-4Uq+5<8foQP?5O{`MGlMs)qP1h$^}kC>=|g`=r!W9lABJp|O}GHbX` zocOqk?U5t0{3PcvD#TUv$hjTDVxcqgDY=-LC0GU|hn*K2;|Nldw`N2ND6;rGOP@*( zG4%MtItH4g$HPb))bKV3?9LkTB;=xM1lNcur6B~TK6)6kvp+ugdEUm>zVyHb>aCn^ zXKnHc>6P2hgmlm{iZw%2vjL#dJhpVSVag{}L=OoV6jlp679#de<X|+=RC0mPY}bf0&W{AdCqyApI*u=X!{BSV{aBjpczq z{KO&mKu!f!8U*EG@AbeNPbz3e6@H^vsO|-pAYuey$^&|6lq*O?pw5LHGHvl z4?!hCZ2cttE`nU!4;WmNWQ0rV-H9Jums3(YgY2#o`TP15mg^SPkixkjU_tbmWvfDmJwesI$FCNj^gP zvWH9R6C58kA7vk>PTGjK3yJspcB4{dQ^K7@M5NigIU#>)Lv7kX&JC;&-~jd;MBg9p z*%aOQ$fgpM7?mV(0+R6+kA}sM=`6Jg2q?QLir) zp8Kq{A6P9=3?l);76>puBqYQPA%3ABEF-$A2IylOtTd=nAFVv}cpq{tawQN>uW2pb z8SpDV2nVdJAM+M*D{OUOhyA0oUurH+CrB4$KpY}=Kfg4h)F8Zr05>8!a!?RSoj7uW zzcEo;7^niFQv7%E@Aa@6f!2bSab2SVd!UZ^7DBcp2=TIea5qpx^3;}o=>-o*@=3w< zGng!3c!3A`DAUN!^zD#U!WA=F<~*LjU17Rnt23$Q2;hu16Oax4+Dz!feLHp1v=E5~ zb9LV;fh&ejYRR9t^oCaI=+8)G2eCL%+=96{pyh_1pFq7iyAkyQ?M6g0&`7lwd!QIe1lt?i8``7WBflYYglJ367jwu3RaB((NYY4>l*HR-*~j0n zYHn_BYR+-ZZ&vpzb}f3qKX+O|XyQ}6FPl_`cVSTx&=Fo2<&o`@`5{#>b7n!*D6NTP zgH#pbn(*NF;6It$G1KM@^aH#rLRYRw(6>lvp>EFLG-{q|rfhn-#z~??Dz(z8=GV;r zvFu{iEKjMIQj1t@9=kMyZjHQM-UfWvt>@Ie#LL6W_6zWP+e^m1+zFqlJ}eG+XrI}H zfwe)VsWT=b94>4txCi(?cn7Q|Tsz!7To>#dECrS-7Cw_TdwOMR}E9e)zv zJC-`uDw|~ratbRuI=iMzyE91lw9D3mxl_!2>elw*V`ul2x_l?e}SE5O; zq&}T-)-B0X@XPNjuCvFP&5@o_-<;1JplYCJATHo+1UF22+-{SnUH(&k-L2x@2SQVM z)#>5f2mK0tU3-_S0>lhNfzgFHGiwT0d@qVul~S)#+B^OuuNXcv>_c}{W#de*lsTQzh% z<9<+oNC|}L2j?nbQfiZXr=X-Y&>ni&>R;Tf$tu*A3jQHG2wM!(I~3Ws8THB`$myZ$ zsUhsrcgs^XP~8>??q@Pu^cm@50qM>m9WoWFmALbp^SvLyk{?kH< zi^fNVj}C#RhUS}=#^&%z+9i=7L6?|C!I1V=Nt(ZxO7(>Lk#ta|s$?efgCm;9X3p8z z^Wp9Qi;ekU@+b}KyVEP}c;%Z$&u`b9F6#$9r`bc6->f-YP8Yj5#J=TpMXBSGc9Sq^ zEe5>2dfYuO{)YkcFx@Fo)qesqd99(byl z&tEi|T47ZF=#j0x7=MYocfpxpPqKSzROq~3C?1u$pMRJ~%LvbiWanE?Xx=|#sMND; zPPe7od@;!|)_Q#?JTI~Iwz70hJ6G3^T%fk(a*NsU@K9T-9_CzZm+6RhO}zy2LiN%; z`@Q02q&Lxh@Lu`u(zEj3{s7qJ*Wgj)YwPY1_%pqcHnZf)_@eKm#6RaRWErxyI%!TYMeYRf+1CC-NHo#a(AirPSRcH3~5 z>$T_FeKSrOyX`vekB0Y@t%ciFuok^ds_r>2w*#L3uKL&ZM;iPzp3;x?N+O#Q+5T>DOPy1OiQoRfVo z`zHOO{XBFmHMf{n^Y{Y&`clY^C3jEl*XMt*2e>lD0W`t_Fl+4!q7)wks0IGKS3vuJ z2F<_cOL_xJ11~Sbb*|12$N^r>y$>)qr@gwY{^0x(1pGWa5Fw&_-?Q;8>8a0@AQ4_( zHu|%p8*%*@q+VV;D_&o^twZ|yH?CWS*8{18A-zJPxAp2_8v1&WTzp@2V)!=vzX3B` z?Y`@QN5_>jSSJ#E1s~QX>Jp|hG63qYJ|qAX2pa(Q)dTvvc!6;Kw=W7r2>|(@`(FV| zs09G@|HsIFwSWEMzOKKX`9CdiF7Uq);FY-`|LTMIeIWoyj~>@w4V1mOh7$mQPWIOY zB%w%p1px2^B!mT&-GR=sATpKbpC9eAnj5+rXwPOVDDlc70>EkyWmuX^C0HJW3z)E@ z!_$3XU1k0VD;UW{fx%FsBNn=WT6EM}>oxzrXk6Xcbh?6(3tE?AT{|WFvj|%&V@OLBp=eMNw z63P0B^a{NJJ3amv6d=;i8{zL`_}?e|g)+Y&p-*537fgQ}>HngD(1D)u|HE|t2NcTj z1wpumnOHaa=Slw$iWc~W=f6tE0hksTe+MJ2W8}ZcPaSm6>!0NMuhHV}fU1LX4>B;i z#r}iz|AnfB9DV$cOY{Ze7=)^YbPvx2|{`Cr6FZXbrCk939D)4Rs=?`rU` zf&8^N#Dtq5|EMef2egGq(M!BVHD=r zwS16i#aPh6E32y{@uL^(9XL2R1Lx;eOY_(f!ud8f=QHLLEOe{QWMh3&b1Vd8a+;c! zqNb*Vh@<1<^nw3L1NHveybNZ8-+jzMaYy_o)RdGO z3Oc=ir?Z-vm@JhpwKX&sgL4ul@oKoT#GXC=>SM8ERFRW<1O=XcS5_f2nX1Q~s~s?4 z#%9yh+NG0`hr%Pd*ur$&+dp)pqo16bBKYn&c!fmLfr^%#lJfHYL4a+1!SK(DY)=R^ zI?V-d{6iZ9g@XgCwSV*AcgC+@zxbZ?`yxz!Sy>Ui%n$B5$fyKR_0j9xM6{#s9hlso z%oUhfNVwWcii%1~PG8C?D9r);|}gK$jLcwNpJ*R8%AnrGf5jaKrTv z0`}Gd)&B)8q>5f`$dW#J=D~X9Z29;4NFRRk&_8uEguGma(IWK^Vt}C4@lA2j!GK$4@ z+DoERdbv9eG&fWp4gV+Q?)CXHXInnto{Z=t#9MvtDy=fF@qj;V<}B^j%QtGeKfAo2 zBV0}wnpqZK-@B1WAn>_N-u!?-AmC5b*63oW-gD=dWnqD{^QV~+!knS+coS}G!zr-J zVf(6g1;8zQ1W!?*30cz``SM=kDRRA{c&S`CrMSQ49TK~{2axRigccUFKJ5>b4^-Ds zLDOruevR0#*z`H=a5|p`OwxmUT@5-OfAo>)?5V-*%ec zME74~3r?AFn6=@rvd`L&f_RMh^mxZfbIfj&AJUr9LX;|LPdJ zxq-nV4r_1`cNAlaM}o`tU=1^3h6BGPjgii&MmBPWe+ABfEhinK2cp&@srDJ1Lo7iW_=~3*|f-PYGZden&-AMCkB^w zeD|6(a!c+XPg}iU{#ij65q_!qyv?#Si0PCq4x@^1U^N=X5B;ejsQjJ!MyqToqtePG zu-f08hGv5FpH$L&J$h`u+!CMFptd)=EWfavD$Qo= zOehotGhJGU2JI;*iKLymk3S{Mc(8xPU2zABmNG~|D1rvXHrdM-YCuY`B(Ws^;SU15 zPHUJ4G&RAQm}upAIL>_PdKa~Q&rHr@H#xaZB$wg5c-pOt8%=cyj%EHQFJmdvkL>%^ zD@iOm(%3;S1z5LVx^>uCr9C8rJ0M{Tq9FYSvI#+#7Tz$xV%&?PQ@>=VeX!Ms$#Ax^ zt9+Yblj_T7>rr~seqJO4&{;25>r|*#^{;f>zpvI?1TG%pe6PQJk|-iuk3_u6NK8Bc zA4`}O+lBv_5fsG?tF43pC)Z37s&o*J@q-R<>Y<$}!<;jhmnL`fn!<LMV z`xVg6lv(&oV@wqkw#0~a6lTW$k2v_`z{G63>eRlZ}!yc^12iL*-m)Y2{y zHhek3=^YiwkEI=~rJeO*ejt+ImbsE5jK9`ThHxReI_C+!o-XzBhZp&9h1;gFqrIA+ z4S<^ra5)RB1v|s!+i>o{$Nj-fr$^kE-&H6OU$W0Bn>J`6UAgS#!m�Wzzb_B%fjG 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