From bcbd41db7bfc2d9f15045cb305d11842833a6c5b Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 13:20:04 -0700 Subject: [PATCH 01/21] Add pre-commit changes --- .pre-commit-config.yaml | 76 +++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a8fb6b95b..af50a586d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,32 +1,82 @@ ## https://pre-commit.com/ # # Before first use: `pre-commit install` -# To run: `pre-commit run --all-files` +# To run: `make lint` +# To update: `make lint-update` +# - &flake8_dependencies below needs updated manually exclude: '^thirdparty' +fail_fast: true # TODO flip off +default_language_version: + python: python3 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v5.0.0 hooks: - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks + - id: check-ast + - id: check-toml + - id: check-yaml - id: debug-statements - id: end-of-file-fixer + exclude_types: [svg] - id: mixed-line-ending + - id: no-commit-to-branch + args: [-p, "^branch-2....$"] - id: trailing-whitespace - repo: https://github.com/PyCQA/flake8 rev: 7.1.1 hooks: - id: flake8 - args: ["--config=.flake8"] - files: nx_cugraph.*$ - types: [file] - types_or: [python] # TODO: Enable [python, cython] - additional_dependencies: ["flake8-force"] + args: ["--config=.flake8"] # uses config + additional_dependencies: &flake8_dependencies + # These versions need updated manually + - flake8==7.1.1 + - flake8-bugbear==24.8.19 + - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa rev: v1.3.0 hooks: - id: yesqa - additional_dependencies: - - flake8==7.1.1 + additional_dependencies: *flake8_dependencies + - repo: https://github.com/abravalheri/validate-pyproject + rev: v0.19 + hooks: + - id: validate-pyproject + name: Validate pyproject.toml + - repo: https://github.com/PyCQA/autoflake + rev: v2.3.1 + hooks: + - id: autoflake + args: [--in-place] + - repo: https://github.com/pycqa/isort + rev: 5.13.2 + hooks: + - id: isort + - repo: https://github.com/asottile/pyupgrade + rev: v3.17.0 + hooks: + - id: pyupgrade + args: [--py310-plus] + - repo: https://github.com/psf/black + rev: 24.8.0 + hooks: + - id: black + # - id: black-jupyter + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + types_or: [python, rst, markdown] + additional_dependencies: [tomli] + files: ^(nx_cugraph|docs)/ + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.7 + hooks: + - id: ruff + args: [--show-fixes] - repo: https://github.com/pre-commit/mirrors-clang-format rev: v16.0.6 hooks: @@ -39,16 +89,14 @@ repos: - id: verify-copyright files: | (?x) - [.](cmake|cpp|cu|cuh|h|hpp|sh|pxd|py|pyx)$| - CMakeLists[.]txt$| - CMakeLists_standalone[.]txt$| + [.](sh|py)$| [.]flake8[.]cython$| meta[.]yaml$| setup[.]cfg$ - id: verify-alpha-spec args: ["--fix"] - repo: https://github.com/rapidsai/dependency-file-generator - rev: v1.13.11 + rev: v1.16.0 hooks: - id: rapids-dependency-file-generator args: ["--clean"] @@ -61,7 +109,7 @@ repos: types: [python] language: python pass_filenames: false - additional_dependencies: ["networkx>=3.3"] + additional_dependencies: ["networkx>=3.4"] - repo: local hooks: - id: nx-cugraph-readme-update From 6eabafa27f6f7a0981f252ae166cd8fa215cb335 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 18:31:11 -0700 Subject: [PATCH 02/21] Add flake8 exceptions for benchmarking script used to generate HTML reports --- .flake8 | 1 + 1 file changed, 1 insertion(+) diff --git a/.flake8 b/.flake8 index 28d4f21a4..22f52e7e9 100644 --- a/.flake8 +++ b/.flake8 @@ -14,3 +14,4 @@ per-file-ignores = __init__.py:F401,F403, _nx_cugraph/__init__.py:E501, nx_cugraph/__init__.py:E402,F401,F403, + benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py:E501,W605, From 6a4b71cecef0d300bd2f14d275a5d9e84ab0a6bb Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 18:35:39 -0700 Subject: [PATCH 03/21] Add pre-commit suggestions --- .pre-commit-config.yaml | 5 -- .../create_results_summary_page.py | 17 ++-- .../pytest-based/get_graph_bench_dataset.py | 4 +- docs/nx-cugraph/source/conf.py | 77 ++++++++++--------- 4 files changed, 53 insertions(+), 50 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af50a586d..d84726a80 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,11 +72,6 @@ repos: types_or: [python, rst, markdown] additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.7 - hooks: - - id: ruff - args: [--show-fixes] - repo: https://github.com/pre-commit/mirrors-clang-format rev: v16.0.6 hooks: diff --git a/benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py b/benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py index f1cc4b06c..bbe449c86 100644 --- a/benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py +++ b/benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py @@ -12,17 +12,17 @@ # limitations under the License. -import re -import pathlib import json +import pathlib import platform -import psutil +import re import socket import subprocess +import psutil + def get_formatted_time_value(time): - res = "" if time < 1: if time < 0.001: units = "us" @@ -40,7 +40,8 @@ def get_all_benchmark_info(): # Populate benchmarks dir from .json files for json_file in logs_dir.glob("*.json"): try: - data = json.loads(open(json_file).read()) + with open(json_file) as file: + data = json.loads(file.read()) except json.decoder.JSONDecodeError: continue @@ -155,8 +156,8 @@ def get_system_info(): if __name__ == "__main__": logs_dir = pathlib.Path("logs") - dataset_patt = re.compile(".*ds=([\w-]+).*") - backend_patt = re.compile(".*backend=(\w+).*") + dataset_patt = re.compile(r".*ds=([\w-]+).*") + backend_patt = re.compile(r".*backend=(\w+).*") k_patt = re.compile(".*k=(10*).*") # Organize all benchmark runs by the following hierarchy: algo -> backend -> dataset @@ -266,7 +267,7 @@ def get_system_info(): f" {nx_formatted} / {cg_formatted}
{speedup}
{runtime_delta}" ) else: - print(f" ") + print(" ") # If a comparison between cugraph and NX cannot be made, output empty cells # for each dataset diff --git a/benchmarks/nx-cugraph/pytest-based/get_graph_bench_dataset.py b/benchmarks/nx-cugraph/pytest-based/get_graph_bench_dataset.py index 5a0a15da8..4732e5b84 100644 --- a/benchmarks/nx-cugraph/pytest-based/get_graph_bench_dataset.py +++ b/benchmarks/nx-cugraph/pytest-based/get_graph_bench_dataset.py @@ -18,14 +18,14 @@ Positional Arguments: 1) dataset name (e.g. 'email_Eu_core', 'cit-patents') - available datasets can be found here: `python/cugraph/cugraph/datasets/__init__.py` + available datasets can be found here: + - `python/cugraph/cugraph/datasets/__init__.py` """ import sys import cugraph.datasets as cgds - if __name__ == "__main__": # download and store dataset (csv) by using the Datasets API dataset = sys.argv[1].replace("-", "_") diff --git a/docs/nx-cugraph/source/conf.py b/docs/nx-cugraph/source/conf.py index 66bc3137f..b5f721a6a 100644 --- a/docs/nx-cugraph/source/conf.py +++ b/docs/nx-cugraph/source/conf.py @@ -19,17 +19,16 @@ import os import sys -from packaging.version import Version - import cugraph +from github_link import make_linkcode_resolve +from packaging.version import Version # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory # is relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. -sys.path.insert(0, os.path.abspath('sphinxext')) +sys.path.insert(0, os.path.abspath("sphinxext")) -from github_link import make_linkcode_resolve # noqa # -- General configuration ------------------------------------------------ @@ -47,8 +46,8 @@ "sphinx.ext.autosummary", "numpydoc", "sphinx_markdown_tables", - 'sphinx.ext.doctest', - 'sphinx.ext.linkcode', + "sphinx.ext.doctest", + "sphinx.ext.linkcode", "IPython.sphinxext.ipython_console_highlighting", "IPython.sphinxext.ipython_directive", "nbsphinx", @@ -57,10 +56,10 @@ ] -ipython_mplbackend = 'str' +ipython_mplbackend = "str" # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: @@ -69,12 +68,12 @@ source_suffix = {".rst": "restructuredtext", ".md": "markdown"} # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'cugraph' -copyright = '2019-2023, NVIDIA Corporation' -author = 'NVIDIA Corporation' +project = "cugraph" +copyright = "2019-2023, NVIDIA Corporation" +author = "NVIDIA Corporation" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -84,14 +83,15 @@ # The short X.Y version. version = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}" # The full version, including alpha/beta/rc tags. -release = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}.{CUGRAPH_VERSION.micro:02}" +release = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}.\ + {CUGRAPH_VERSION.micro:02}" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = 'en' +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -99,7 +99,7 @@ exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -111,7 +111,7 @@ # a list of builtin themes. # -html_theme = 'pydata_sphinx_theme' +html_theme = "pydata_sphinx_theme" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -131,13 +131,13 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = 'cugraphdoc' +htmlhelp_basename = "cugraphdoc" # -- Options for LaTeX output --------------------------------------------- @@ -146,15 +146,12 @@ # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -164,8 +161,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'cugraph.tex', 'cugraph Documentation', - 'NVIDIA Corporation', 'manual'), + ( + master_doc, + "cugraph.tex", + "cugraph Documentation", + "NVIDIA Corporation", + "manual", + ), ] @@ -173,10 +175,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'cugraph', 'cugraph Documentation', - [author], 1) -] +man_pages = [(master_doc, "cugraph", "cugraph Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- @@ -185,9 +184,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'cugraph', 'cugraph Documentation', - author, 'cugraph', 'GPU-accelerated graph analysis.', - 'Miscellaneous'), + ( + master_doc, + "cugraph", + "cugraph Documentation", + author, + "cugraph", + "GPU-accelerated graph analysis.", + "Miscellaneous", + ), ] # Connect docs in other projects @@ -209,11 +214,13 @@ def setup(app): app.add_css_file("https://docs.rapids.ai/assets/css/custom.css") - app.add_js_file("https://docs.rapids.ai/assets/js/custom.js", loading_method="defer") + app.add_js_file( + "https://docs.rapids.ai/assets/js/custom.js", loading_method="defer" + ) app.add_css_file("references.css") -source_suffix = ['.rst', '.md'] +source_suffix = [".rst", ".md"] # The following is used by sphinx.ext.linkcode to provide links to github linkcode_resolve = make_linkcode_resolve( @@ -221,9 +228,9 @@ def setup(app): ) breathe_projects = { - 'libcugraph': os.environ['XML_DIR_LIBCUGRAPH'], - 'libcugraphops': os.environ['XML_DIR_LIBCUGRAPHOPS'], - 'libwholegraph': os.environ['XML_DIR_LIBWHOLEGRAPH'] + "libcugraph": os.environ["XML_DIR_LIBCUGRAPH"], + "libcugraphops": os.environ["XML_DIR_LIBCUGRAPHOPS"], + "libwholegraph": os.environ["XML_DIR_LIBWHOLEGRAPH"], } breathe_default_project = "libcugraph" From c0c41382cb109a0f6f2a98c845d8f0e3a524b6b5 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 18:49:40 -0700 Subject: [PATCH 04/21] Remove unused import --- benchmarks/nx-cugraph/pytest-based/bench_algos.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py index f88d93c3f..03f16fc1a 100644 --- a/benchmarks/nx-cugraph/pytest-based/bench_algos.py +++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py @@ -11,12 +11,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import random - import networkx as nx import pandas as pd import pytest from cugraph import datasets + import nx_cugraph as nxcg # Attempt to import the NetworkX dispatching module, which is only needed when From 11b991ce207962f2c754065c0cdee20a01c0bc41 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 18:55:52 -0700 Subject: [PATCH 05/21] Make pre-commit suggestions --- .pre-commit-config.yaml | 1 + .../source/sphinxext/github_link.py | 41 ++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d84726a80..55c9ecb28 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,6 +72,7 @@ repos: types_or: [python, rst, markdown] additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ + args: ["-L thirdparty"] - repo: https://github.com/pre-commit/mirrors-clang-format rev: v16.0.6 hooks: diff --git a/docs/nx-cugraph/source/sphinxext/github_link.py b/docs/nx-cugraph/source/sphinxext/github_link.py index cc28dc6e8..c118c19cd 100644 --- a/docs/nx-cugraph/source/sphinxext/github_link.py +++ b/docs/nx-cugraph/source/sphinxext/github_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2023, NVIDIA CORPORATION. +# Copyright (c) 2019-2024, NVIDIA CORPORATION. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -31,7 +31,7 @@ def isfunction(obj): new_val = hasattr(type(obj), "__code__") - if (orig_val != new_val): + if orig_val != new_val: return new_val return orig_val @@ -39,19 +39,18 @@ def isfunction(obj): inspect.isfunction = isfunction -REVISION_CMD = 'git rev-parse --short HEAD' +REVISION_CMD = "git rev-parse --short HEAD" -source_regex = re.compile(r"^File: (.*?) \(starting at line ([0-9]*?)\)$", - re.MULTILINE) +source_regex = re.compile(r"^File: (.*?) \(starting at line ([0-9]*?)\)$", re.MULTILINE) def _get_git_revision(): try: revision = subprocess.check_output(REVISION_CMD.split()).strip() except (subprocess.CalledProcessError, OSError): - print('Failed to execute git to get revision') + print("Failed to execute git to get revision") return None - return revision.decode('utf-8') + return revision.decode("utf-8") def _linkcode_resolve(domain, info, url_fmt, revision): @@ -71,14 +70,14 @@ def _linkcode_resolve(domain, info, url_fmt, revision): if revision is None: return - if domain != 'py': + if domain != "py": return - if not info.get('module') or not info.get('fullname'): + if not info.get("module") or not info.get("fullname"): return - class_name = info['fullname'].split('.')[0] - module = __import__(info['module'], fromlist=[class_name]) - obj = attrgetter(info['fullname'])(module) + class_name = info["fullname"].split(".")[0] + module = __import__(info["module"], fromlist=[class_name]) + obj = attrgetter(info["fullname"])(module) # Unwrap the object to get the correct source # file in case that is wrapped by a decorator @@ -91,7 +90,7 @@ def _linkcode_resolve(domain, info, url_fmt, revision): if not obj_module: print(f"could not infer source code link for: {info}") return - module_name = obj_module.__name__.split('.')[0] + module_name = obj_module.__name__.split(".")[0] module_dir_dict = { "cugraph_dgl": "cugraph-dgl", @@ -107,24 +106,22 @@ def _linkcode_resolve(domain, info, url_fmt, revision): return obj_path = "/".join(obj_module.__name__.split(".")[1:]) - obj_file_ext = obj_module.__file__.split('.')[-1] + obj_file_ext = obj_module.__file__.split(".")[-1] source_ext = "pyx" if obj_file_ext == "so" else "py" fn = f"{module_dir}/{module_name}/{obj_path}.{source_ext}" # Get the line number if we need it. (Can work without it) - if (lineno is None): + if lineno is None: try: lineno = inspect.getsourcelines(obj)[1] except Exception: # Can happen if its a cyfunction. See if it has `__code__` - if (hasattr(obj, "__code__")): + if hasattr(obj, "__code__"): lineno = obj.__code__.co_firstlineno else: - lineno = '' - return url_fmt.format(revision=revision, - path=fn, - lineno=lineno) + lineno = "" + return url_fmt.format(revision=revision, path=fn, lineno=lineno) def make_linkcode_resolve(url_fmt): @@ -137,6 +134,4 @@ def make_linkcode_resolve(url_fmt): '{path}#L{lineno}') """ revision = _get_git_revision() - return partial(_linkcode_resolve, - revision=revision, - url_fmt=url_fmt) + return partial(_linkcode_resolve, revision=revision, url_fmt=url_fmt) From 8fc4925233da679e525041eb72471abff85f5ec8 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 19:01:58 -0700 Subject: [PATCH 06/21] Delete unused docs --- .../source/basics/cugraph_cascading.md | 53 ----- .../nx-cugraph/source/basics/cugraph_intro.md | 68 ------ docs/nx-cugraph/source/basics/index.rst | 11 - .../source/basics/nx_transition.rst | 181 -------------- .../source/graph_support/DGL_support.md | 61 ----- .../source/graph_support/PyG_support.md | 3 - .../source/graph_support/algorithms.md | 95 -------- .../graph_support/algorithms/Centrality.md | 40 ---- .../graph_support/algorithms/Similarity.md | 38 --- .../algorithms/betweenness_centrality.md | 42 ---- .../cpp_algorithms/centrality_cpp.md | 81 ------- .../algorithms/cpp_algorithms/linear_cpp.md | 37 --- .../cpp_algorithms/traversal_cpp.md | 56 ----- .../algorithms/degree_centrality.md | 32 --- .../algorithms/eigenvector_centrality.md | 41 ---- .../algorithms/jaccard_similarity.md | 34 --- .../algorithms/katz_centrality.md | 28 --- .../algorithms/overlap_similarity.md | 32 --- .../algorithms/sorensen_coefficient.md | 34 --- .../source/graph_support/compatibility.rst | 8 - .../source/graph_support/cugraph_service.rst | 9 - .../graph_support/cugraphops_support.rst | 10 - .../source/graph_support/datastores.rst | 8 - .../source/graph_support/feature_stores.md | 3 - .../source/graph_support/gnn_support.rst | 12 - .../source/graph_support/graph_algorithms.rst | 8 - .../nx-cugraph/source/graph_support/index.rst | 13 - .../source/graph_support/knowledge_stores.md | 3 - .../source/graph_support/pg_example.png | Bin 242398 -> 0 bytes .../source/graph_support/property_graph.md | 50 ---- .../graph_support/wholegraph_support.md | 4 - .../source/installation/getting_cugraph.md | 67 ------ docs/nx-cugraph/source/installation/index.rst | 10 - .../source/installation/source_build.md | 222 ------------------ .../source/references/cugraph_ref.md | 45 ---- docs/nx-cugraph/source/references/datasets.md | 21 -- docs/nx-cugraph/source/references/index.rst | 2 - 37 files changed, 1462 deletions(-) delete mode 100644 docs/nx-cugraph/source/basics/cugraph_cascading.md delete mode 100644 docs/nx-cugraph/source/basics/cugraph_intro.md delete mode 100644 docs/nx-cugraph/source/basics/index.rst delete mode 100644 docs/nx-cugraph/source/basics/nx_transition.rst delete mode 100644 docs/nx-cugraph/source/graph_support/DGL_support.md delete mode 100644 docs/nx-cugraph/source/graph_support/PyG_support.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/Centrality.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/Similarity.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md delete mode 100644 docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md delete mode 100644 docs/nx-cugraph/source/graph_support/compatibility.rst delete mode 100644 docs/nx-cugraph/source/graph_support/cugraph_service.rst delete mode 100644 docs/nx-cugraph/source/graph_support/cugraphops_support.rst delete mode 100644 docs/nx-cugraph/source/graph_support/datastores.rst delete mode 100644 docs/nx-cugraph/source/graph_support/feature_stores.md delete mode 100644 docs/nx-cugraph/source/graph_support/gnn_support.rst delete mode 100644 docs/nx-cugraph/source/graph_support/graph_algorithms.rst delete mode 100644 docs/nx-cugraph/source/graph_support/index.rst delete mode 100644 docs/nx-cugraph/source/graph_support/knowledge_stores.md delete mode 100644 docs/nx-cugraph/source/graph_support/pg_example.png delete mode 100644 docs/nx-cugraph/source/graph_support/property_graph.md delete mode 100644 docs/nx-cugraph/source/graph_support/wholegraph_support.md delete mode 100644 docs/nx-cugraph/source/installation/getting_cugraph.md delete mode 100644 docs/nx-cugraph/source/installation/index.rst delete mode 100644 docs/nx-cugraph/source/installation/source_build.md delete mode 100644 docs/nx-cugraph/source/references/cugraph_ref.md delete mode 100644 docs/nx-cugraph/source/references/datasets.md diff --git a/docs/nx-cugraph/source/basics/cugraph_cascading.md b/docs/nx-cugraph/source/basics/cugraph_cascading.md deleted file mode 100644 index bad3d7fa6..000000000 --- a/docs/nx-cugraph/source/basics/cugraph_cascading.md +++ /dev/null @@ -1,53 +0,0 @@ - -# Method Cascading and cuGraph - -BLUF: cuGraph does not support method cascading - -[Method Cascading](https://en.wikipedia.org/wiki/Method_cascading) is a popular, and useful, functional programming concept and is a great way to make code more readable. Python supports method cascading ... _for the most part_. There are a number of Python built-in classes that do not support cascading. - -An example, from cuDF, is a sequence of method calls for loading data and then finding the largest values from a subset of the data (yes there are other ways this could be done): - -``` -gdf = cudf.from_pandas(df).query(‘val > 200’).nlargest(‘va’3) -``` - -cuGraph does not support method cascading for two main reasons: (1) the object-oriented nature of the Graph data object leverages in-place methods, and (2) the fact that algorithms operate on graphs rather than graphs running algorithms. - -## Graph Data Objects -cuGraph follows an object-oriented design for the Graph objects. Users create a Graph and can then add data to object, but every add method call returns `None`. - -_Why Inplace methods?_
-cuGraph focuses on the big graph problems where there are 10s of millions to trillions of edges (Giga bytes to Terabytes of data). At that scale, creating a copy of the data becomes memory inefficient. - -_Why not return `self` rather than `None`?_
-It would be simple to modify the methods to return `self` rather than `None`, however it opens the methods to misinterpretation. Consider the following code: - -``` -# cascade flow - makes sense -G = cugraph.Graph().from_cudf_edgelist(df) - -# non-cascaded code can be confusing -G = cugraph.Graph() -G2 = G.from_cudf_edgelist(df) -G3 = G.from_cudf_edgelist(df2) -``` -The confusion with the non-cascade code is that G, G1, and G3 are all the same object with the same data. Users could be confused since it is not obvious that changing G3 would also change both G2 and G. To prevent confusion, cuGraph has opted to not return `self`. - -_Why not add a flag "return_self" to the methods?_
-``` -# cascade flow - makes sense -G = cugraph.Graph().from_cudf_edgelist(df, return_self=True) -``` -The fact that a developer would explicitly add a "return_self" flag to the method indicates that the developer is aware that the method returns None. It is just as easy for the developer to use a non-cascading workflow. - -### Algorithms -Algorithms operate on graph objects. -``` -cugraph.pagerank(G) and not G.pagerank() -``` -This pattern allows cuGraph to maintain a particular object-oriented model, where Graph objects simply maintain graph data, and algorithm functions operate independently on Graph objects. While this model has benefits that simplify the overall design and its usability in the majority of use cases, it does mean that the developer cannot cascade graph creation into an algorithm call. - -``` -# will not work -G = cugraph.Graph().from_cudf_edgelist(df).pagerank() -``` diff --git a/docs/nx-cugraph/source/basics/cugraph_intro.md b/docs/nx-cugraph/source/basics/cugraph_intro.md deleted file mode 100644 index 7ad282560..000000000 --- a/docs/nx-cugraph/source/basics/cugraph_intro.md +++ /dev/null @@ -1,68 +0,0 @@ - -# cuGraph Introduction -The Data Scientist has a collection of techniques within their -proverbial toolbox. Data engineering, statistical analysis, and -machine learning are among the most commonly known. However, there -are numerous cases where the focus of the analysis is on the -relationship between data elements. In those cases, the data is best -represented as a graph. Graph analysis, also called network analysis, -is a collection of algorithms for answering questions posed against -graph data. Graph analysis is not new. - -The first graph problem was posed by Euler in 1736, the [Seven Bridges of -Konigsberg](https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg), -and laid the foundation for the mathematical field of graph theory. -The application of graph analysis covers a wide variety of fields, including -marketing, biology, physics, computer science, sociology, and cyber to name a few. - -RAPIDS cuGraph is a library of graph algorithms that seamlessly integrates -into the RAPIDS data science ecosystem and allows the data scientist to easily -call graph algorithms using data stored in a GPU DataFrame, NetworkX Graphs, or even -CuPy or SciPy sparse Matrix. - - -## Vision -The vision of RAPIDS cuGraph is to ___make graph analysis ubiquitous to the -point that users just think in terms of analysis and not technologies or -frameworks___. This is a goal that many of us on the cuGraph team have been -working on for almost twenty years. Many of the early attempts focused on -solving one problem or using one technique. Those early attempts worked for -the initial goal but tended to break as the scope changed (e.g., shifting -to solving a dynamic graph problem with a static graph solution). The limiting -factors usually came down to compute power, ease-of-use, or choosing a data -structure that was not suited for all problems. NVIDIA GPUs, CUDA, and RAPIDS -have totally changed the paradigm and the goal of an accelerated unified graph -analytic library is now possible. - -The compute power of the latest NVIDIA GPUs (RAPIDS supports Pascal and later -GPU architectures) make graph analytics 1000x faster on average over NetworkX. -Moreover, the internal memory speed within a GPU allows cuGraph to rapidly -switch the data structure to best suit the needs of the analytic rather than -being restricted to a single data structure. cuGraph is working with several -frameworks for both static and dynamic graph data structures so that we always -have a solution to any graph problem. Since Python has emerged as the de facto -language for data science, allowing interactivity and the ability to run graph -analytics in Python makes cuGraph familiar and approachable. RAPIDS wraps all -the graph analytic goodness mentioned above with the ability to perform -high-speed ETL, statistics, and machine learning. To make things even better, -RAPIDS and DASK allows cuGraph to scale to multiple GPUs to support -multi-billion edge graphs. - - -## Terminology - -cuGraph is a collection of GPU accelerated graph algorithms and graph utility -functions. The application of graph analysis covers a lot of areas. -For Example: -* [Network Science](https://en.wikipedia.org/wiki/Network_science) -* [Complex Network](https://en.wikipedia.org/wiki/Complex_network) -* [Graph Theory](https://en.wikipedia.org/wiki/Graph_theory) -* [Social Network Analysis](https://en.wikipedia.org/wiki/Social_network_analysis) - -cuGraph does not favor one field over another. Our developers span the -breadth of fields with the focus being to produce the best graph library -possible. However, each field has its own argot (jargon) for describing the -graph (or network). In our documentation, we try to be consistent. In Python -documentation we will mostly use the terms __Node__ and __Edge__ to better -match NetworkX preferred term use, as well as other Python-based tools. At -the CUDA/C layer, we favor the mathematical terms of __Vertex__ and __Edge__. diff --git a/docs/nx-cugraph/source/basics/index.rst b/docs/nx-cugraph/source/basics/index.rst deleted file mode 100644 index 7bba301b6..000000000 --- a/docs/nx-cugraph/source/basics/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -====== -Basics -====== - - -.. toctree:: - :maxdepth: 2 - - cugraph_intro - nx_transition - cugraph_cascading diff --git a/docs/nx-cugraph/source/basics/nx_transition.rst b/docs/nx-cugraph/source/basics/nx_transition.rst deleted file mode 100644 index 9da2fe9b4..000000000 --- a/docs/nx-cugraph/source/basics/nx_transition.rst +++ /dev/null @@ -1,181 +0,0 @@ -************************************** -NetworkX by calling cuGraph Algorithms -************************************** - - -*Note: this is a work in progress and will be updatred and changed as we better flesh out -compatibility issues* - -Latest Update -############# - -Last Update: March 7th, 2024 -Release: 24.04 - -**CuGraph is now a registered backend for networkX. This is described in the following blog: -`Accelerating NetworkX on NVIDIA GPUs for High Performance Graph Analytics -`_ - - -Easy Path – Use NetworkX Graph Objects, Accelerated Algorithms -############################################################## - -Rather than updating all of your existing code, simply update the calls to -graph algorithms by replacing the module name. This allows all the complicated -ETL code to be unchanged while still seeing significate performance -improvements. Again this will be deprecated since networkX dispatching to nx_cugraph -has many advantages. - - -.. image:: ../images/Nx_Cg_1.png - :width: 600 - -It is that easy. All algorithms in cuGraph support a NetworkX graph object as -input and match the NetworkX API list of arguments. - -Currently, cuGraph accepts both NetworkX Graph and DiGraph objects. We will be -adding support for Bipartite graph and Multigraph over the next few releases. - -Differences in Algorithms -########################## - -Since cuGraph currently does not support attribute rich graphs, those -algorithms that return simple scores (centrality, clustering, etc.) best match -the NetworkX process. Algorithms that return a subgraph will do so without -any additional attributes on the nodes or edges. - -Algorithms that exactly match -***************************** - -+-------------------------------+------------------------+ -| Algorithm | Differences | -+===============================+========================+ -| Core Number | None | -+-------------------------------+------------------------+ -| HITS | None | -+-------------------------------+------------------------+ -| PageRank | None | -+-------------------------------+------------------------+ -| Personal PageRank | None | -+-------------------------------+------------------------+ -| Strongly Connected Components | None | -+-------------------------------+------------------------+ -| Weakly Connected Components | None | -+-------------------------------+------------------------+ - -| - - - -Algorithms that do not copy over additional attributes -************************************************************************ - -+-------------------------------+-------------------------------------+ -| Algorithm | Differences | -+===============================+=====================================+ -| K-Truss | Does not copy over attributes | -+-------------------------------+-------------------------------------+ -| K-Core | Does not copy over attributes | -+-------------------------------+-------------------------------------+ -| Subgraph Extraction | Does not copy over attributes | -+-------------------------------+-------------------------------------+ - -| - - -Algorithms not in NetworkX -************************** - -+--------------------------------------+----------------------------+ -| Algorithm | Differences | -+======================================+============================+ -| Ensemble Clustering for Graphs (ECG) | Currently not in NetworkX | -+--------------------------------------+----------------------------+ -| Force Atlas 2 | Currently not in NetworkX | -+--------------------------------------+----------------------------+ -| Leiden | Currently not in NetworkX | -+--------------------------------------+----------------------------+ -| Louvain | Currently not in NetworkX | -+--------------------------------------+----------------------------+ -| Overlap coefficient | Currently not in NetworkX | -+--------------------------------------+----------------------------+ -| Spectral Clustering | Currently not in NetworkX | -+--------------------------------------+----------------------------+ - -| - - -Algorithm where not all arguments are supported -*********************************************** - -+----------------------------+-------------------------------------------------+ -| Algorithm | Differences | -+============================+=================================================+ -|Betweenness Centrality | weight is currently not supported – ignored | -| | endpoints is currently not supported – ignored | -+----------------------------+-------------------------------------------------+ -|Edge Betweenness Centrality | weight is currently not supported – ignored | -+----------------------------+-------------------------------------------------+ -| Katz Centrality | beta is currently not supported – ignored | -| | max_iter defaults to 100 versus 1000 | -+----------------------------+-------------------------------------------------+ - -| - -Algorithms where the results are different -****************************************** - - -For example, the NetworkX traversal algorithms typically return a generator -rather than a dictionary. - - -+----------------------------+-------------------------------------------------+ -| Algorithm | Differences | -+============================+=================================================+ -| Triangle Counting | this algorithm simply returns the total number | -| | of triangle and not the number per vertex | -| | (on roadmap to update) | -+----------------------------+-------------------------------------------------+ -| Jaccard coefficient | Currently we only do a 1-hop computation rather | -| | than an all-pairs. Fix is on roadmap | -+----------------------------+-------------------------------------------------+ -| Breadth First Search (BFS) | Returns a Pandas DataFrame with: | -| | [vertex][distance][predecessor] | -+----------------------------+-------------------------------------------------+ -| Single Source | Returns a Pandas DataFrame with: | -| Shortest Path (SSSP) | [vertex][distance][predecessor] | -+----------------------------+-------------------------------------------------+ - -| - -Graph Building -############## - -The biggest difference between NetworkX and cuGraph is with how Graph objects -are built. NetworkX, for the most part, stores graph data in a dictionary. -That structure allows easy insertion of new records. Consider the following -code for building a NetworkX Graph:: - - # Read the node data - df = pd.read_csv( data_file) - - # Construct graph from edge list. - G = nx.DiGraph() - - for row in df.iterrows(): - G.add_edge( - row[1]["1"], row[1]["2"], count=row[1]["3"] - ) - - -The code block is perfectly fine for NetworkX. However, the process of iterating over the dataframe and adding one node at a time is problematic for GPUs and something that we try and avoid. cuGraph stores data in columns (i.e. arrays). Resizing an array requires allocating a new array one element larger, copying the data, and adding the new value. That is not very efficient. - -If your code follows the above model of inserting one element at a time, the we suggest either rewriting that code or using it as is within NetworkX and just accelerating the algorithms with cuGraph. - -Now, if your code bulk loads the data from Pandas, then RAPIDS can accelerate that process by orders of magnitude. - -.. image:: ../images/Nx_Cg_2.png - :width: 600 - -The above cuGraph code will create cuGraph.Graph object and not a NetworkX.Graph object. diff --git a/docs/nx-cugraph/source/graph_support/DGL_support.md b/docs/nx-cugraph/source/graph_support/DGL_support.md deleted file mode 100644 index ba9a28e31..000000000 --- a/docs/nx-cugraph/source/graph_support/DGL_support.md +++ /dev/null @@ -1,61 +0,0 @@ -# cugraph_dgl - -## Description - -[RAPIDS](https://rapids.ai) cugraph_dgl provides a duck-typed version of the [DGLGraph](https://docs.dgl.ai/api/python/dgl.DGLGraph.html#dgl.DGLGraph) class, which uses cugraph for storing graph structure and node/edge feature data. Using cugraph as the backend allows DGL users to access a collection of GPU accelerated algorithms for graph analytics, such as centrality computation and community detection. - -## Conda - -Install and update cugraph-dgl and the required dependencies using the command: - -``` -conda install mamba -n base -c conda-forge -mamba install cugraph-dgl -c rapidsai-nightly -c rapidsai -c pytorch -c conda-forge -c nvidia -c dglteam -``` - -## Build from Source - -### Create the conda development environment -``` -conda env create -n cugraph_dgl_dev --file conda/environments/all_cuda-125_arch-x86_64.yaml -``` - -### Install in editable mode -``` -pip install -e . -``` - -### Run tests - -``` -pytest tests/* -``` - - -## Usage -```diff - -from cugraph_dgl.convert import cugraph_storage_from_heterograph -cugraph_g = cugraph_storage_from_heterograph(dgl_g) - -sampler = dgl.dataloading.NeighborSampler( - [15, 10, 5], prefetch_node_feats=['feat'], prefetch_labels=['label']) - -train_dataloader = dgl.dataloading.DataLoader( -cugraph_g, -train_idx, -sampler, -device=device, -batch_size=1024, -shuffle=True, -drop_last=False, -num_workers=0) -``` - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/PyG_support.md b/docs/nx-cugraph/source/graph_support/PyG_support.md deleted file mode 100644 index b57ce7fcc..000000000 --- a/docs/nx-cugraph/source/graph_support/PyG_support.md +++ /dev/null @@ -1,3 +0,0 @@ -# cugraph_pyg - -[RAPIDS](https://rapids.ai) cugraph_pyg enables the ability to use cugraph graph storage and sampling with PyTorch Geometric (PyG). PyG users will have access to cuGraph through the PyG GraphStore, FeatureStore, and Sampler interfaces. diff --git a/docs/nx-cugraph/source/graph_support/algorithms.md b/docs/nx-cugraph/source/graph_support/algorithms.md deleted file mode 100644 index 2aac61325..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms.md +++ /dev/null @@ -1,95 +0,0 @@ -# List of Supported and Planned Algorithms - -## Supported Graph - -| Type | Description | -| ---------- | ----------------------------------------------------------- | -| Graph | A directed or undirected Graph (use directed={True, False}) | -| Multigraph | A Graph with multiple edges between a vertex pair | -| | | - -ALL Algorithms support Graphs and MultiGraph (directed and undirected) - ---- - -
- -# Supported Algorithms - -_Italic_ algorithms are planned for future releases. - -Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called MNMG). - -| Category | Notebooks | Scale | Notes | -| ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | -| [Centrality](./algorithms/Centrality.html ) | [Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb) | | | -| | [Katz](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Katz.ipynb) | __Multi-GPU__ | | -| | [Betweenness Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) | __Multi-GPU__ | MG as of 23.06 | -| | [Edge Betweenness Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) | __Multi-GPU__ | MG as of 23.08 | -| | [Eigenvector Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Eigenvector.ipynb) | __Multi-GPU__ | | -| | [Degree Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Degree.ipynb) | __Multi-GPU__ | Python only | -| Community | | | | -| | [Leiden](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Louvain.ipynb) | __Multi-GPU__ | MG as of 23.06 | -| | [Louvain](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Louvain.ipynb) | __Multi-GPU__ | | -| | [Ensemble Clustering for Graphs](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/ECG.ipynb) | Single-GPU | MG planned for 24.02 | -| | [Spectral-Clustering - Balanced Cut](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Spectral-Clustering.ipynb) | Single-GPU | | -| | [Spectral-Clustering - Modularity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Spectral-Clustering.ipynb) | Single-GPU | | -| | [Subgraph Extraction](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Subgraph-Extraction.ipyn) | Single-GPU | | -| | [Triangle Counting](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Triangle-Counting.ipynb) | __Multi-GPU__ | | -| | [K-Truss](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/ktruss.ipynb) | Single-GPU | MG planned for 2024 | -| Components | | | | -| | [Weakly Connected Components](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/components/ConnectedComponents.ipynb) | __Multi-GPU__ | | -| | [Strongly Connected Components](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/components/ConnectedComponents.ipynb) | Single-GPU | | -| Core | | | | -| | [K-Core](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/cores/kcore.ipynb) | __Multi-GPU__ | | -| | [Core Number](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/cores/core-number.ipynb) | __Multi-GPU__ | | -| _Flow_ | | | | -| | _MaxFlow_ | --- | | -| _Influence_ | | | | -| | _Influence Maximization_ | --- | | -| Layout | | | | -| | [Force Atlas 2](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/layout/Force-Atlas2.ipynb) | Single-GPU | | -| Linear Assignment | | | | -| | [Hungarian](https://docs.rapids.ai/api/cugraph/nightly/api_docs/cugraph/linear_assignment/#hungarian) | Single-GPU | [README](./algorithms/cpp_algorithms/linear_cpp.html) | -| Link Analysis | | | | -| | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](./algorithms/cpp_algorithms/centrality_cpp.html#Pagerank) | -| | [Personal Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](./algorithms/cpp_algorithms/centrality_cpp.html#Personalized-Pagerank) | -| | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | __Multi-GPU__ | | -| [Link Prediction](algorithms/Similarity.html) | | | | -| | [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) | __Multi-GPU__ | Directed graph only | -| | [Weighted Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) | Single-GPU | | -| | [Overlap Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Overlap-Similarity.ipynb) | **Multi-GPU** | | -| | [Sorensen Coefficient](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Sorensen_coefficient.ipynb) | __Multi-GPU__ | MG is unweighted only | -| | _Local Clustering Coefficient_ | --- | | -| Sampling | | | | -| | [Uniform Random Walks RW](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/sampling/RandomWalk.ipynb) | __Multi-GPU__ | | -| | *Biased Random Walks (RW)* | --- | | -| | Egonet | __Multi-GPU__ | | -| | Node2Vec | __Multi-GPU__ | | -| | Neighborhood sampling | __Multi-GPU__ | | -| Traversal | | | | -| | Breadth First Search (BFS) | __Multi-GPU__ | [C++ README](algorithms/cpp_algorithms/traversal_cpp.html#BFS) | -| | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](algorithms/cpp_algorithms/traversal_cpp.html#SSSP) | -| | _ASSP / APSP_ | --- | | -| Tree | | | | -| | Minimum Spanning Tree | Single-GPU | | -| | Maximum Spanning Tree | Single-GPU | | -| Other | | | | -| | Renumbering | __Multi-GPU__ | multiple columns, any data type | -| | Symmetrize | __Multi-GPU__ | | -| | Path Extraction | | Extract paths from BFS/SSP results in parallel | -| | Two Hop Neighbors | __Multi-GPU__ | | -| Data Generator | | | | -| | RMAT | __Multi-GPU__ | | -| | _Barabasi-Albert_ | --- | | -| | | | | - -

- -___ -Copyright (c) 2019 - 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/Centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/Centrality.md deleted file mode 100644 index 8119e6552..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/Centrality.md +++ /dev/null @@ -1,40 +0,0 @@ - -# cuGraph Centrality Notebooks - - - -The RAPIDS cuGraph Centrality folder contains a collection of Jupyter Notebooks that demonstrate algorithms to identify and quantify the importance of vertices to the structure of the graph. In the diagram above, the highlighted vertices are highly important and are likely answers to questions like: - -* Which vertices have the highest degree (most direct links) ? -* Which vertices are on the most efficient paths through the graph? -* Which vertices connect the most important vertices to each other? - -But which vertices are most important? The answer depends on which measure/algorithm is run. Manipulation of the data before or after the graph analytic is not covered here. Extended, more problem focused, notebooks are being created and available https://github.com/rapidsai/notebooks-extended - -## Summary - -|Algorithm |Notebooks Containing |Description | -| --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -|[Degree Centrality](./degree_centrality.md)| [Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb), [Degree](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Degree.ipynb) |Measure based on counting direct connections for each vertex| -|[Betweenness Centrality](./betweenness_centrality.md)| [Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb), [Betweenness](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) |Number of shortest paths through the vertex| -|[Eigenvector Centrality](./eigenvector_centrality.md)|[Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb), [Eigenvector](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Eigenvector.ipynb)|Measure of connectivity to other important vertices (which also have high connectivity) often referred to as the influence measure of a vertex| -|[Katz Centrality](./katz_centrality.md)|[Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb), [Katz](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Katz.ipynb) |Similar to Eigenvector but has tweaks to measure more weakly connected graph | -|Pagerank|[Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb), [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) |Classified as both a link analysis and centrality measure by quantifying incoming links from central vertices. | - -[System Requirements](https://github.com/rapidsai/cugraph/blob/main/notebooks/README.md#requirements) - - - -| Author Credit | Date | Update | cuGraph Version | Test Hardware | -| --------------|------------|------------------|-----------------|----------------| -| Brad Rees | 04/19/2021 | created | 0.19 | GV100, CUDA 11.0 -| Don Acosta | 07/05/2022 | tested / updated | 22.08 nightly | DGX Tesla V100 CUDA 11.5 - -## Copyright - -Copyright (c) 2019 - 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/Similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/Similarity.md deleted file mode 100644 index 96adc25ea..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/Similarity.md +++ /dev/null @@ -1,38 +0,0 @@ - -# cuGraph Similarity Notebooks - -The RAPIDS cuGraph Similarity folder contain a collection of Jupyter Notebooks that demonstrate algorithms to quantify the similarity between pairs of vertices in the graph. -Results of Similarity algorithms are often used to answer questions like: -* Could two vertices be duplicates or aliases of the same actor? -* Can we predict missing edges based of the similarity between two nodes? -* Are multiple similar communities within the graph? -* Can I create recommendations based on the similarity between vertices in the graph. - - -Manipulation of the data before or after the graph analytic is not covered here. Extended, more problem focused, notebooks are being created and available https://github.com/rapidsai/notebooks-extended - -## Summary - -|Algorithm |Notebooks Containing |Description | -| --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -|[Jaccard Smiliarity](./jaccard_similarity.html)| [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) || -|[Overlap Similarity](./overlap_similarity.html)| [Overlap Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Overlap-Similarity.ipynb) || -|[Sorensen](./sorensen_coefficient.html)|[Sorensen Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Sorensen_coefficient.ipynb)|| -|Personal Pagerank|[Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) || - - -[System Requirements](../../README.md#requirements) - -| Author Credit | Date | Update | cuGraph Version | Test Hardware | -| --------------|------------|------------------|-----------------|----------------| -| Brad Rees | 04/19/2021 | created | 0.19 | GV100, CUDA 11.0 -| Don Acosta | 07/05/2022 | tested / updated | 22.08 nightly | DGX Tesla V100 CUDA 11.5 - -## Copyright - -Copyright (c) 2019 - 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md deleted file mode 100644 index 89e5e0bdb..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md +++ /dev/null @@ -1,42 +0,0 @@ -# Betweenness Centrality (BC) - -Betweenness centrality is a measure of the relative importance based on measuring the number of shortest paths that pass through each vertex or over each edge. High betweenness centrality vertices have a greater number of path cross through the vertex. Likewise, high centrality edges have more shortest paths that pass over the edge. - -See [Betweenness on Wikipedia](https://en.wikipedia.org/wiki/Betweenness_centrality) for more details on the algorithm. - -Betweenness centrality of a node 𝑣 is the sum of the fraction of all-pairs shortest paths that pass through 𝑣 - -$c_B(v) =\sum_{s,t \in V} \frac{\sigma(s, t|v)}{\sigma(s, t)}$ - - -## When to use BC -Betweenness centrality is often used to answer questions like: -* Which vertices are most influential in the network? -* What are the bridge vertices in a network? -* How robust/redundant is the network? -* In a social network analysis, betweenness centrality can be used to identify roles in an organization. - -## When not to use BC -Betweenness Centrality is less efficient in certain circumstances: -* Large graphs may require approximationing betweenness centrality as the computational cost increases. -* Disconnected networks or networks with many isolated components limit the value of betweenness centrality -* Betweenness centality is more costly and less useful in weighted graphs. -* In networks with hierarchical structure, BC might not accurately reflect true influence -* Networks with multiple edge types often require a seperate method of measuring influence for each edge type. - - -## How computationally expensive is BC? -While cuGraph's parallelism migigates run time, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm costs. -* The cost is O(V(E+V)) for a non-weighted graph and O(V(E+V)log(V)) for a weighted graph. -* A breadth-first search is done to determine shortest paths betweeb all nodes prior to calculating BC. - -## Sample benchmarks -Coming Soon - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md deleted file mode 100644 index b3f7ac17d..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md +++ /dev/null @@ -1,81 +0,0 @@ -# Centrality algorithms -cuGraph Pagerank is implemented using our graph primitive library - -## Pagerank - -The unit test code is the best place to search for examples on calling pagerank. - - * [SG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/link_analysis/pagerank_test.cpp) - * [MG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/link_analysis/mg_pagerank_test.cpp) - -## Simple pagerank - -The example assumes that you create an SG or MG graph somehow. The caller must create the pageranks vector in device memory and pass in the raw pointer to that vector into the pagerank function. - -```cpp -#include -... -using vertex_t = int32_t; // or int64_t, whichever is appropriate -using weight_t = float; // or double, whichever is appropriate -using result_t = weight_t; // could specify float or double also -raft::handle_t handle; // Must be configured if MG -auto graph_view = graph.view(); // assumes you have created a graph somehow - -result_t constexpr alpha{0.85}; -result_t constexpr epsilon{1e-6}; - -rmm::device_uvector pageranks_v(graph_view.number_of_vertices(), handle.get_stream()); - -// pagerank optionally supports three additional parameters: -// max_iterations - maximum number of iterations, if pagerank doesn't coverge by -// then we abort -// has_initial_guess - if true, values in the pagerank array when the call is initiated -// will be used as the initial pagerank values. These values will -// be normalized before use. If false (the default), the values -// in the pagerank array will be set to 1/num_vertices before -// starting the computation. -// do_expensive_check - perform extensive validation of the input data before -// executing algorithm. Off by default. Note: turning this on -// is expensive -cugraph::pagerank(handle, graph_view, nullptr, nullptr, nullptr, vertex_t{0}, - pageranks_v.data(), alpha, epsilon); -``` - -## Personalized Pagerank - -The example assumes that you create an SG or MG graph somehow. The caller must create the pageranks vector in device memory and pass in the raw pointer to that vector into the pagerank function. Additionally, the caller must create personalization_vertices and personalized_values vectors in device memory, populate them and pass in the raw pointers to those vectors. - -```cpp -#include -... -using vertex_t = int32_t; // or int64_t, whichever is appropriate -using weight_t = float; // or double, whichever is appropriate -using result_t = weight_t; // could specify float or double also -raft::handle_t handle; // Must be configured if MG -auto graph_view = graph.view(); // assumes you have created a graph somehow -vertex_t number_of_personalization_vertices; // Provided by caller - -result_t constexpr alpha{0.85}; -result_t constexpr epsilon{1e-6}; - -rmm::device_uvector pageranks_v(graph_view.number_of_vertices(), handle.get_stream()); -rmm::device_uvector personalization_vertices(number_of_personalization_vertices, handle.get_stream()); -rmm::device_uvector personalization_values(number_of_personalization_vertices, handle.get_stream()); - -// Populate personalization_vertices, personalization_values with user provided data - -// pagerank optionally supports three additional parameters: -// max_iterations - maximum number of iterations, if pagerank doesn't coverge by -// then we abort -// has_initial_guess - if true, values in the pagerank array when the call is initiated -// will be used as the initial pagerank values. These values will -// be normalized before use. If false (the default), the values -// in the pagerank array will be set to 1/num_vertices before -// starting the computation. -// do_expensive_check - perform extensive validation of the input data before -// executing algorithm. Off by default. Note: turning this on -// is expensive -cugraph::pagerank(handle, graph_view, nullptr, personalization_vertices.data(), - personalization_values.data(), number_of_personalization_vertices, - pageranks_v.data(), alpha, epsilon); -``` diff --git a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md deleted file mode 100644 index 8af4a5042..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md +++ /dev/null @@ -1,37 +0,0 @@ -# LAP - -Implementation of ***O(n^3) Alternating Tree Variant*** of Hungarian Algorithm on NVIDIA CUDA-enabled GPU. - -This implementation solves a batch of ***k*** **Linear Assignment Problems (LAP)**, each with ***nxn*** matrix of single floating point cost values. At optimality, the algorithm produces an assignment with ***minimum*** cost. - -The API can be used to query optimal primal and dual costs, optimal assignment vector, and optimal row/column dual vectors for each subproblem in the batch. - -cuGraph exposes the Hungarian algorithm, the actual implementation is contained in the RAFT library which contains some common tools and kernels shared between cuGraph and cuML. - -Following parameters can be used to tune the performance of algorithm: - -1. epsilon: (in raft/lap/lap_kernels.cuh) This parameter controls the tolerance on the floating point precision. Setting this too small will result in increased solution time because the algorithm will search for precise solutions. Setting it too high may cause some inaccuracies. - -2. BLOCKDIMX, BLOCKDIMY: (in raft/lap/lap_functions.cuh) These parameters control threads_per_block to be used along the given dimension. Set these according to the device specifications and occupancy calculation. - -***This library is licensed under Apache License 2.0. Please cite our paper, if this library helps you in your research.*** - -- Harvard citation style - - Date, K. and Nagi, R., 2016. GPU-accelerated Hungarian algorithms for the Linear Assignment Problem. Parallel Computing, 57, pp.52-72. - -- BibTeX Citation block to be used in LaTeX bibliography file: - -``` -@article{date2016gpu, - title={GPU-accelerated Hungarian algorithms for the Linear Assignment Problem}, - author={Date, Ketan and Nagi, Rakesh}, - journal={Parallel Computing}, - volume={57}, - pages={52--72}, - year={2016}, - publisher={Elsevier} -} -``` - -The paper is available online on [ScienceDirect](https://www.sciencedirect.com/science/article/abs/pii/S016781911630045X). diff --git a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md deleted file mode 100644 index 6480d885a..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md +++ /dev/null @@ -1,56 +0,0 @@ -# Traversal -cuGraph traversal algorithms are contained in this directory - -## SSSP - -The unit test code is the best place to search for examples on calling SSSP. - - * [SG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/traversal/sssp_test.cpp) - * [MG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/traversal/mg_sssp_test.cpp) - -## Simple SSSP - -The example assumes that you create an SG or MG graph somehow. The caller must create the distances and predecessors vectors in device memory and pass in the raw pointers to those vectors into the SSSP function. - -```cpp -#include -... -using vertex_t = int32_t; // or int64_t, whichever is appropriate -using weight_t = float; // or double, whichever is appropriate -using result_t = weight_t; // could specify float or double also -raft::handle_t handle; // Must be configured if MG -auto graph_view = graph.view(); // assumes you have created a graph somehow -vertex_t source; // Initialized by user - -rmm::device_uvector distances_v(graph_view.number_of_vertices(), handle.get_stream()); -rmm::device_uvector predecessors_v(graph_view.number_of_vertices(), handle.get_stream()); - -cugraph::sssp(handle, graph_view, distances_v.begin(), predecessors_v.begin(), source, std::numeric_limits::max(), false); -``` - -## BFS - -The unit test code is the best place to search for examples on calling BFS. - - * [SG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/traversal/bfs_test.cpp) - * [MG Implementation](https://github.com/rapidsai/cugraph/blob/main/cpp/tests/traversal/mg_bfs_test.cpp) - -## Simple BFS - -The example assumes that you create an SG or MG graph somehow. The caller must create the distances and predecessors vectors in device memory and pass in the raw pointers to those vectors into the BFS function. - -```cpp -#include -... -using vertex_t = int32_t; // or int64_t, whichever is appropriate -using weight_t = float; // or double, whichever is appropriate -using result_t = weight_t; // could specify float or double also -raft::handle_t handle; // Must be configured if MG -auto graph_view = graph.view(); // assumes you have created a graph somehow -vertex_t source; // Initialized by user - -rmm::device_uvector distances_v(graph_view.number_of_vertices(), handle.get_stream()); -rmm::device_uvector predecessors_v(graph_view.number_of_vertices(), handle.get_stream()); - -cugraph::bfs(handle, graph_view, d_distances.begin(), d_predecessors.begin(), source, false, std::numeric_limits::max(), false); -``` diff --git a/docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md deleted file mode 100644 index 9253c665f..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md +++ /dev/null @@ -1,32 +0,0 @@ -# Degree Centrality -Degree centrality is the simplest measure of the relative importance based on counting the connections with each vertex. Vertices with the most connections are the most central by this measure. - -See [Degree Centrality on Wikipedia](https://en.wikipedia.org/wiki/Degree_centrality) for more details on the algorithm. - -Degree centrality of a vertex 𝑣 is the sum of the edges incident on that node. - - - -## When to use Degree Centrality -* When you need a really quick identifcation of important nodes on very simply structured data. -* In cases like collaboration networks where all links have equal importance. -* In many biologic and transportation networks, shear number of connections is important to itentify critical nodes whether they be proteins or airports. -* In huge graphs, Degree centrality is a the quickest - -## When not to use Degree Centrality -* When weights, edge direction or edge types matter -* Graphs with self loops -* Multi-graphs ( graphs with multiple edges between the same two nodes) -* In general Degree Centrality falls short in most cases where the data is complex or nuanced. - -## How computationally expensive is it? -While cuGraph's parallelism migigates run time, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm costs. - -The cost of Degree Centrality is O(n) where n is the number of nodes. -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md deleted file mode 100644 index 8a9c7c7c7..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md +++ /dev/null @@ -1,41 +0,0 @@ -# Eigenvector Centrality - -Eigenvector centrality computes the centrality for a vertex based on the -centrality of its neighbors. The Eigenvector of a node measures influence within a graph by taking into account a vertex's connections to other highly connected vertices. - - -See [Eigenvector Centrality on Wikipedia](https://en.wikipedia.org/wiki/Eigenvector_centrality) for more details on the algorithm. - -The eigenvector centrality for node i is the -i-th element of the vector x defined by the eigenvector equation. - - - - -Where M(v) is the adjacency list for the set of vertices(v) and λ is a constant. - -[Learn more about EigenVector Centrality](https://www.sci.unich.it/~francesc/teaching/network/eigenvector.html) - -## When to use Eigenvector Centrality -* When the quality and quantity of edges matters, in other words, connections to other high-degree nodes is important -* To calculate influence in nuanced networks like social and financial networks. - -## When not to use Eigenvector Centrality -* in graphs with many disconnected groups -* in graphs containing many distinct and different communities -* in networks with negative weights -* in huge networks eigenvector centrality can become computationally infeasible in single threaded systems. - - -## How computationally expensive is it? -While cuGraph's parallelism migigates run time, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm costs. - -O(VE) where V is the number of vertices(nodes) and Eis the number of edges. - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md deleted file mode 100644 index dde98d71e..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md +++ /dev/null @@ -1,34 +0,0 @@ -# Jaccard Similarity - -The Jaccard similarity between two sets is defined as the ratio of the volume of their intersection divided by the volume of their union. - -The Jaccard Similarity can then be defined as - -Jaccard similarity coefficient = $\frac{|A \cap B|}{|A \cup B|}$ - -In graphs, the sets refer to the set of connected nodes or neighborhood of nodes A and B. - -[Learn more about Jaccard Similarity](https://en.wikipedia.org/wiki/Jaccard_index) - -## When to use Jaccard Similarity -* You want to find whether two nodes in a graph are in similar communities. -* You want to compare the structure of two graphs. -* You have a set of graphs and want to classify them as particular types - -## When not to use Jaccard Similarity -* In directed graphs -* in very large sparse graphs -* Graphs with large disparities in node degrees - -## How computationally expensive is it? -While cuGraph's parallelism mitigates run cost, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm costs. - -The cost of calculating the Jaccard Similarity for a graph is O(d * n) where d is the average degree of the nodes and n is the number of nodes. - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md deleted file mode 100644 index 69b5d6b27..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md +++ /dev/null @@ -1,28 +0,0 @@ -# Katz Centrality - -Katz centrality is a measure of the relative importance of a vertex within the graph based on measuring the influence across the total number of walks between vertex pairs. Katz is similar to Eigenvector centrality. The main difference is that Katz also takes into account indirect relationships. The Katz calculation includes a user-controlled attenuation variable that controls the weight of indirect relationships. Otherwise it shares many of the advantages and disadvantages of Eigenvector centrality. - -$C_{katz}(i) = \sum_{k=1}^{\infty} \sum_{j=1}^{n} \alpha ^k(A^k)_{ji}$ - -See [Katz on Wikipedia](https://en.wikipedia.org/wiki/Katz_centrality) for more details on the algorithm. - -## When to use Katz Centrality -* in disconnected graphs -* in sparse graphs -* in graphs with multi-hop propogation like innovation - -## When not to use Katz Centrality -* in graphs with heavy cyclical dependency (feedback loops), Katz Centrality might not converge preventing usable results. -* when a graph contains multiple distinct influence factors Katz can blur them. -* Katz is very expensive so use in large graphs depends on cuGraph parallelism to be viable. - -## How computationally expensive is it? -Katz centraility has several stages with costs that add up as the graph gets larger. The overall cost is often O(n2) to O(n3) where n is the number of nodes. - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md deleted file mode 100644 index d9f9f681e..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md +++ /dev/null @@ -1,32 +0,0 @@ -# Overlap Similarity - -The Overlap Coefficient, also known as th Szymkiewicz–Simpson coefficient, between two sets is defined as the ratio of the volume of their intersection divided by the volume of the smaller set. -The Overlap Coefficient can be defined as - -$overlap(A,B) = \frac{|A \cap B|}{min(|A|,|B|)}$ - -[Learn more about Overlap Similarity](https://en.wikipedia.org/wiki/Overlap_coefficient) - -## When to use Overlap Similarity -* You want to find similarty based on shared neighbors instead of the sets as a whole. -* You want to partition a graph into non-overlapping clusters. -* You want to compare subgraphs within a graph - -## When not to use Overlap Similarity -* You are trying to compare graphs of extremely different sizes -* In overly sparse or dense graph can overlap similarity can miss relationships or give fals positives respectively. -* In directed graphs, there are better algorithms to use. - - -## How computationally expensive is it? -While cuGraph's parallelism migigates run time, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm costs. - -The cost to compute overlap similarity is O(n*d) where n is the number of nodes and d is the average degree of the nodes. - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md b/docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md deleted file mode 100644 index 67d981815..000000000 --- a/docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md +++ /dev/null @@ -1,34 +0,0 @@ -# Sørensen Coefficient - -The Sørensen Coefficient, also called the Sørensen-Dice similarity coefficient, quantifies the similarity and overlap between two samples. - -It is defined as two times the size of the set intersection divided by the sum of the size of the two sets. The value ranges from 0 to 1. - -Sørensen coefficient = $\left(2 * |A \cap B| \right) \over \left(|A| + |B| \right)$ - - -In graphs, the sets refer to the set of connected nodes or neighborhood of nodes A and B. - -[Learn more about Sørensen Coefficient](https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient) - -## When to use Sørensen Coefficient -* When you want to compare nodes with vastly different sized neighborhoods. -* When the intersection of the node neigborhoods is more important than the overall similarity - - -## When not to use Sørensen Coefficient -* In directed graphs -* Comparing graphs with different underlying data relationships. -* In weighted graphs, while cuGraph does have a weighted Sørensen implementation, the algorithm did not originally use weights. - -## How computationally expensive is it? -While cuGraph's parallelism mitigates run cost, [Big O notation](https://en.wikipedia.org/wiki/Big_O_notation) is still the standard to compare algorithm execution time. -The cost to run O(n * m) where n is the number of nodes in the graph and m is the number of groups to test. - -___ -Copyright (c) 2023, NVIDIA CORPORATION. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -___ diff --git a/docs/nx-cugraph/source/graph_support/compatibility.rst b/docs/nx-cugraph/source/graph_support/compatibility.rst deleted file mode 100644 index ddb3f1d5f..000000000 --- a/docs/nx-cugraph/source/graph_support/compatibility.rst +++ /dev/null @@ -1,8 +0,0 @@ -Compatibility -============= - - -.. toctree:: - :maxdepth: 3 - -Compatibility document coming soon diff --git a/docs/nx-cugraph/source/graph_support/cugraph_service.rst b/docs/nx-cugraph/source/graph_support/cugraph_service.rst deleted file mode 100644 index 658f9e731..000000000 --- a/docs/nx-cugraph/source/graph_support/cugraph_service.rst +++ /dev/null @@ -1,9 +0,0 @@ -=============== -CuGraph Service -=============== - - -.. toctree:: - :maxdepth: 3 - -Cugraph Service for remote access to a server-based cuGraph(https://github.com/rapidsai/cugraph/blob/branch-23.04/python/cugraph-service/README.md) diff --git a/docs/nx-cugraph/source/graph_support/cugraphops_support.rst b/docs/nx-cugraph/source/graph_support/cugraphops_support.rst deleted file mode 100644 index 96b13f62a..000000000 --- a/docs/nx-cugraph/source/graph_support/cugraphops_support.rst +++ /dev/null @@ -1,10 +0,0 @@ -================== -cugraphops Support -================== - -cugraph-ops aims to be a low-level, framework agnostic library providing commonly used computational primitives for GNNs and other graph operations. - -.. toctree:: - :maxdepth: 3 - - https://github.com/rapidsai/cugraph/blob/branch-24.06/readme_pages/cugraph_ops.md diff --git a/docs/nx-cugraph/source/graph_support/datastores.rst b/docs/nx-cugraph/source/graph_support/datastores.rst deleted file mode 100644 index 50d8461e7..000000000 --- a/docs/nx-cugraph/source/graph_support/datastores.rst +++ /dev/null @@ -1,8 +0,0 @@ -Data Stores -=========== -.. toctree:: - :maxdepth: 3 - - property_graph.md - knowledge_stores.md - feature_stores.md diff --git a/docs/nx-cugraph/source/graph_support/feature_stores.md b/docs/nx-cugraph/source/graph_support/feature_stores.md deleted file mode 100644 index ef9358c4c..000000000 --- a/docs/nx-cugraph/source/graph_support/feature_stores.md +++ /dev/null @@ -1,3 +0,0 @@ -# Feature Store - -Coming Soon diff --git a/docs/nx-cugraph/source/graph_support/gnn_support.rst b/docs/nx-cugraph/source/graph_support/gnn_support.rst deleted file mode 100644 index 639b657c6..000000000 --- a/docs/nx-cugraph/source/graph_support/gnn_support.rst +++ /dev/null @@ -1,12 +0,0 @@ -============================ -Graph Neural Network Support -============================ - - -.. toctree:: - :maxdepth: 2 - - PyG_support.md - DGL_support.md - cugraphops_support.rst - wholegraph_support.md diff --git a/docs/nx-cugraph/source/graph_support/graph_algorithms.rst b/docs/nx-cugraph/source/graph_support/graph_algorithms.rst deleted file mode 100644 index 38dd8ccc2..000000000 --- a/docs/nx-cugraph/source/graph_support/graph_algorithms.rst +++ /dev/null @@ -1,8 +0,0 @@ -========== -Algorithms -========== - -.. toctree:: - :maxdepth: 3 - - algorithms.md diff --git a/docs/nx-cugraph/source/graph_support/index.rst b/docs/nx-cugraph/source/graph_support/index.rst deleted file mode 100644 index 67aba7428..000000000 --- a/docs/nx-cugraph/source/graph_support/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -============= -Graph Support -============= - - -.. toctree:: - :maxdepth: 3 - - graph_algorithms.rst - compatibility.rst - gnn_support.rst - datastores.rst - cugraph_service.rst diff --git a/docs/nx-cugraph/source/graph_support/knowledge_stores.md b/docs/nx-cugraph/source/graph_support/knowledge_stores.md deleted file mode 100644 index 1749eb2b4..000000000 --- a/docs/nx-cugraph/source/graph_support/knowledge_stores.md +++ /dev/null @@ -1,3 +0,0 @@ -# Knowledge Store - -Coming Soon diff --git a/docs/nx-cugraph/source/graph_support/pg_example.png b/docs/nx-cugraph/source/graph_support/pg_example.png deleted file mode 100644 index 5ce8a0f20549deaa34b968787f0b711ed8bc71fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242398 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

SA$se&RAg!z)vItsoyZ(+_ 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

Gu$r2h3*h?XjEqP~ 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 YT>1_}|7E?P7l? diff --git a/docs/nx-cugraph/source/graph_support/property_graph.md b/docs/nx-cugraph/source/graph_support/property_graph.md deleted file mode 100644 index 94d170c18..000000000 --- a/docs/nx-cugraph/source/graph_support/property_graph.md +++ /dev/null @@ -1,50 +0,0 @@ -# Property Graph - -Part of [RAPIDS](https://rapids.ai) cuGraph, Property Graph allows all the great benefits of cuGraph to be applied to property-rich datasets stored in a graph structure. A Property Graph is really a data model rather than a type of graph. Within the cuGraph ecosystem, a Property Graph is a meta-graph that can encapsulate and instantiate all the other graph types. That view stems from property graphs being originally created for database systems. Conceptually a Property Graph can be viewed as a property rich structure that can be projected onto any graph types. The Dataversity, has a good definition of [Property Graph](https://www.dataversity.net/what-is-a-property-graph) which contains definitions from a collection of resources. - -![Sample Property Graph](../images/pg_example.png) - - -Property Graph enables: - -* Multiple edge and node types as seen in the Property Graph API -* Subgraph extractions based on properties and/or edge and node types as seen below. -* Storage of properties either within the graph structure on gpu or using GNN-centric storage extensions on host storage. -* Adding additional properties, nodes and edges into the property graph to store derived data like analytic results. -* Client access managed by a remote server allowing shared access and remote operations using [CuGraph Service](./cugraph_service.md). - -This is an example of using the cuGraph Property Graph in a two stage analysis. - -``` -import cudf -import cugraph -from cugraph.experimental import PropertyGraph - -# Import a built-in dataset -from cugraph.datasets import karate - -# Read edgelist data into a DataFrame, load into PropertyGraph as edge data. -# Create a graph using the imported Dataset object -graph = cugraph.Graph(directed=False) -G = karate.get_graph(create_using=graph,fetch=True) - -df = G.edgelist.edgelist_df -pG = PropertyGraph() -pG. add_edge_data(df, vertex_col_names=("src", "dst")) - -# Run Louvain to get the partition number for each vertex. -# Set resolution accordingly to identify two primary partitions. -(partition_info, _) = cugraph.louvain(pG.extract_subgraph(create_using=graph), resolution=0.6) - -# Add the partition numbers back to the Property Graph as vertex properties -pG.add_vertex_data(partition_info, vertex_col_name="vertex") - -# Use the partition properties to extract a Graph for each partition. -G0 = pG.extract_subgraph(selection=pG.select_vertices("partition == 0")) -G1 = pG.extract_subgraph(selection=pG. select_vertices("partition == 1")) -# Run pagerank on each graph, print results. -pageranks0 = cugraph.pagerank(G0) -pageranks1 = cugraph.pagerank(G1) -print(pageranks0.sort_values (by="pagerank", ascending=False).head(3)) -print(pageranks1.sort_values (by="pagerank", ascending=False).head(3)) -``` diff --git a/docs/nx-cugraph/source/graph_support/wholegraph_support.md b/docs/nx-cugraph/source/graph_support/wholegraph_support.md deleted file mode 100644 index d1c5eaf72..000000000 --- a/docs/nx-cugraph/source/graph_support/wholegraph_support.md +++ /dev/null @@ -1,4 +0,0 @@ -# WholeGraph - -[RAPIDS](https://rapids.ai) [WholeGraph](https://github.com/rapidsai/wholegraph) is designed to help train large-scale Graph Neural Networks(GNN). -Please see [WholeGraph Introduction](https://github.com/rapidsai/wholegraph/blob/main/README.md) for more details diff --git a/docs/nx-cugraph/source/installation/getting_cugraph.md b/docs/nx-cugraph/source/installation/getting_cugraph.md deleted file mode 100644 index 01bc9e379..000000000 --- a/docs/nx-cugraph/source/installation/getting_cugraph.md +++ /dev/null @@ -1,67 +0,0 @@ - -# Getting cuGraph Packages - -Start by reading the [RAPIDS Instalation guide](https://docs.rapids.ai/install) -and checkout the [RAPIDS install selector](https://rapids.ai/start.html) for a pick list of install options. - - -There are 4 ways to get cuGraph packages: -1. [Quick start with Docker Repo](#docker) -2. [Conda Installation](#conda) -3. [Pip Installation](#pip) -4. [Build from Source](./source_build.md) - - -
- -## Docker -The RAPIDS Docker containers contain all RAPIDS packages, including all from cuGraph, as well as all required supporting packages. To download a RAPIDS container, please see the [Docker Hub page for rapidsai/base](https://hub.docker.com/r/rapidsai/base), choosing a tag based on the NVIDIA CUDA version you're running. Also, the [rapidsai/notebooks](https://hub.docker.com/r/rapidsai/notebooks) container provides a ready to run Docker container with example notebooks and data, showcasing how you can utilize all of the RAPIDS libraries: cuDF, cuML, and cuGraph. - -
- - -## Conda -It is easy to install cuGraph using conda. You can get a minimal conda installation with [miniforge](https://github.com/conda-forge/miniforge). - -cuGraph Conda packages - * cugraph - this will also import: - * pylibcugraph - * libcugraph - * cugraph-service-client - * cugraph-service-server - * cugraph-dgl - * cugraph-pyg - * cugraph-equivariant - * nx-cugraph - -Replace the package name in the example below to the one you want to install. - - -Install and update cuGraph using the conda command: - -```bash -conda install -c rapidsai -c conda-forge -c nvidia cugraph cuda-version=12.0 -``` - -Alternatively, use `cuda-version=11.8` for packages supporting CUDA 11. - -Note: This conda installation only applies to Linux and Python versions 3.10/3.11/3.12. - -
- -## PIP -cuGraph, and all of RAPIDS, is available via pip. - -``` -pip install cugraph-cu12 --extra-index-url=https://pypi.nvidia.com -``` - -Replace `-cu12` with `-cu11` for packages supporting CUDA 11. - -Also available: - * cugraph-dgl-cu12 - * cugraph-pyg-cu12 - * cugraph-equivariant-cu12 - * nx-cugraph-cu12 - -
diff --git a/docs/nx-cugraph/source/installation/index.rst b/docs/nx-cugraph/source/installation/index.rst deleted file mode 100644 index 8ad12c589..000000000 --- a/docs/nx-cugraph/source/installation/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -============ -Installation -============ - - -.. toctree:: - :maxdepth: 3 - - getting_cugraph - source_build diff --git a/docs/nx-cugraph/source/installation/source_build.md b/docs/nx-cugraph/source/installation/source_build.md deleted file mode 100644 index 243a62e5c..000000000 --- a/docs/nx-cugraph/source/installation/source_build.md +++ /dev/null @@ -1,222 +0,0 @@ -# Building from Source - -These instructions are tested on supported versions/distributions of Linux, -CUDA, and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) -for the list of supported environments. Other environments _might be_ -compatible, but are not currently tested. - -## Prerequisites - -__Compilers:__ -* `gcc` version 9.3+ -* `nvcc` version 11.5+ - -__CUDA:__ -* CUDA 11.8+ -* NVIDIA GPU, Volta architecture or later, with [compute capability](https://developer.nvidia.com/cuda-gpus) 7.0+ - -Further details and download links for these prerequisites are available on the -[RAPIDS System Requirements page](https://docs.rapids.ai/install#system-req). - -## Setting up the development environment - -### Clone the repository: -```bash -CUGRAPH_HOME=$(pwd)/cugraph -git clone https://github.com/rapidsai/cugraph.git $CUGRAPH_HOME -cd $CUGRAPH_HOME -``` - -### Create the conda environment - -Using conda is the easiest way to install both the build and runtime -dependencies for cugraph. While it is possible to build and run cugraph without -conda, the required packages occasionally change, making it difficult to -document here. The best way to see the current dependencies needed for a build -and run environment is to examine the list of packages in the [conda -environment YAML -files](https://github.com/rapidsai/cugraph/blob/main/conda/environments). - -```bash -# for CUDA 11.x -conda env create --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-118_arch-x86_64.yaml - -# for CUDA 12.x -conda env create --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-125_arch-x86_64.yaml - - -# activate the environment -conda activate cugraph_dev - -# to deactivate an environment -conda deactivate -``` - -The environment can be updated as cugraph adds/removes/updates its dependencies. To do so, run: - -```bash -# for CUDA 11.x -conda env update --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-118_arch-x86_64.yaml -conda activate cugraph_dev - -# for CUDA 12.x -conda env update --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-125_arch-x86_64.yaml -conda activate cugraph_dev - - - -``` - -### Build and Install - -#### Build and install using `build.sh` -Using the `build.sh` script, located in the `$CUGRAPH_HOME` directory, is the -recommended way to build and install the cugraph libraries. By default, -`build.sh` will build and install a predefined set of targets -(packages/libraries), but can also accept a list of targets to build. - -For example, to build only the cugraph C++ library (`libcugraph`) and the -high-level python library (`cugraph`) without building the C++ test binaries, -run this command: - -```bash -$ cd $CUGRAPH_HOME -$ ./build.sh libcugraph pylibcugraph cugraph --skip_cpp_tests -``` - -There are several other options available on the build script for advanced -users. Refer to the output of `--help` for details. - -Note that libraries will be installed to the location set in `$PREFIX` if set -(i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. - -#### Updating the RAFT branch - -`libcugraph` uses the [RAFT](https://github.com/rapidsai/raft) library and -there are times when it might be desirable to build against a different RAFT -branch, such as when working on new features that might span both RAFT and -cuGraph. - -For local development, the `CPM_raft_SOURCE=` option can -be passed to the `cmake` command to enable `libcugraph` to use the local RAFT -branch. The `build.sh` script calls `cmake` to build the C/C++ targets, but -developers can call `cmake` directly in order to pass it options like those -described here. Refer to the `build.sh` script to see how to call `cmake` and -other commands directly. - -To have CI test a `cugraph` pull request against a different RAFT branch, -modify the bottom of the `cpp/cmake/thirdparty/get_raft.cmake` file as follows: - -```cmake -# Change pinned tag and fork here to test a commit in CI -# To use a different RAFT locally, set the CMake variable -# RPM_raft_SOURCE=/path/to/local/raft -find_and_configure_raft(VERSION ${CUGRAPH_MIN_VERSION_raft} - FORK - PINNED_TAG - - # When PINNED_TAG above doesn't match cugraph, - # force local raft clone in build directory - # even if it's already installed. - CLONE_ON_PIN ON - ) -``` - -When the above change is pushed to a pull request, the continuous integration -servers will use the specified RAFT branch to run the cuGraph tests. After the -changes in the RAFT branch are merged to the release branch, remember to revert -the `get_raft.cmake` file back to the original cuGraph branch. - - -## Run tests - -If you already have the datasets: - - ```bash - export RAPIDS_DATASET_ROOT_DIR= - ``` - If you do not have the datasets: - - ```bash - cd $CUGRAPH_HOME/datasets - source get_test_data.sh #This takes about 10 minutes and downloads 1GB data (>5 GB uncompressed) - ``` - -Run either the C++ or the Python tests with datasets - - - **Python tests with datasets** - - - ```bash - pip install python-louvain #some tests require this package to run - cd $CUGRAPH_HOME - cd python - pytest - ``` - - **C++ stand alone tests** - - From the build directory : - - ```bash - # Run the cugraph tests - cd $CUGRAPH_HOME - cd cpp/build - gtests/GDFGRAPH_TEST # this is an executable file - ``` - - **C++ tests with larger datasets** - - - - Run the C++ tests on large input: - - ```bash - cd $CUGRAPH_HOME/cpp/build - #test one particular analytics (eg. pagerank) - gtests/PAGERANK_TEST - #test everything - make test - ``` - -Note: This conda installation only applies to Linux and Python versions 3.10, 3.11, and 3.12. - -### (OPTIONAL) Set environment variable on activation - -It is possible to configure the conda environment to set environment variables -on activation. Providing instructions to set PATH to include the CUDA toolkit -bin directory and LD_LIBRARY_PATH to include the CUDA lib64 directory will be -helpful. - -```bash -cd ~/anaconda3/envs/cugraph_dev - -mkdir -p ./etc/conda/activate.d -mkdir -p ./etc/conda/deactivate.d -touch ./etc/conda/activate.d/env_vars.sh -touch ./etc/conda/deactivate.d/env_vars.sh -``` - -Next the env_vars.sh file needs to be edited - -```bash -vi ./etc/conda/activate.d/env_vars.sh - -#!/bin/bash -export PATH=/usr/local/cuda-11.0/bin:$PATH # or cuda-11.1 if using CUDA 11.1 and cuda-11.2 if using CUDA 11.2, respectively -export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH # or cuda-11.1 if using CUDA 11.1 and cuda-11.2 if using CUDA 11.2, respectively -``` - -``` -vi ./etc/conda/deactivate.d/env_vars.sh - -#!/bin/bash -unset PATH -unset LD_LIBRARY_PATH -``` - -## Creating documentation - -Python API documentation can be generated from _./docs/cugraph directory_. Or -through using "./build.sh docs" - -## Attribution -Portions adopted from https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md diff --git a/docs/nx-cugraph/source/references/cugraph_ref.md b/docs/nx-cugraph/source/references/cugraph_ref.md deleted file mode 100644 index 845436a60..000000000 --- a/docs/nx-cugraph/source/references/cugraph_ref.md +++ /dev/null @@ -1,45 +0,0 @@ -# References - -## Architecture - -2-D Data Partitioning - -- Kang, S., Fender, A., Eaton, J., & Rees, B. (2020, September) *Computing PageRank Scores of Web Crawl Data Using DGX A100 Clusters*. In 2020 IEEE High Performance Extreme Computing Conference (HPEC) (pp. 1-4). IEEE. - -- S. Kang, J. Nke and B. Rees, (2022 September) *Analyzing Multi-trillion Edge Graphs on Large GPU Clusters: A Case Study with PageRank*, In 2022 IEEE High Performance Extreme Computing Conference (HPEC), Waltham, MA, USA, 2022, pp. 1-7, doi: 10.1109/HPEC55821.2022.9926341. - -

- -## Algorithms - -### Betweenness Centrality -- Brandes, U. (2001). *A faster algorithm for betweenness centrality*. Journal of mathematical sociology, 25(2), 163-177. -- Brandes, U. (2008). *On variants of shortest-path betweenness centrality and their generic computation*. Social Networks, 30(2), 136-145. -- McLaughlin, A., & Bader, D. A. (2018). *Accelerating GPU betweenness centrality*. Communications of the ACM, 61(8), 85-92. - -### Katz -- Katz, L. (1953). *A new status index derived from sociometric analysis*. Psychometrika, 18(1), 39-43. -- Foster, K.C., Muth, S.Q., Potterat, J.J. et al. *A faster Katz status score algorithm*. Computational & Mathematical Organization Theory (2001) 7: 275. - -### K-Truss -- J. Cohen, *Trusses: Cohesive subgraphs for social network analysis* National security agency technical report, 2008 -- O. Green, J. Fox, E. Kim, F. Busato, et al. *Quickly Finding a Truss in a Haystack* IEEE High Performance Extreme Computing Conference (HPEC), 2017 https://doi.org/10.1109/HPEC.2017.8091038 -- O. Green, P. Yalamanchili, L.M. Munguia, *Fast Triangle Counting on GPU* Irregular Applications: Architectures and Algorithms (IA3), 2014 - -### Hungarian Algorithm -- Date, K., & Nagi, R. (2016). GPU-accelerated Hungarian algorithms for the Linear Assignment Problem. Parallel Computing, 57, 52-72. - - -### Leiden -- Traag, V. A., Waltman, L., & Van Eck, N. J. (2019). *From Louvain to Leiden: guaranteeing well-connected communities*. Scientific reports, 9(1), 1-12. - -### Louvain -- VD Blondel, J-L Guillaume, R Lambiotte and E Lefebvre. *Fast unfolding of community hierarchies in large networks*. J Stat Mech P10008 (2008) - -

- -## Other Papers -- Hricik, T., Bader, D., & Green, O. (2020, September). *Using RAPIDS AI to Accelerate Graph Data Science Workflows*. In 2020 IEEE High Performance Extreme Computing Conference (HPEC) (pp. 1-4). IEEE. - - -

diff --git a/docs/nx-cugraph/source/references/datasets.md b/docs/nx-cugraph/source/references/datasets.md deleted file mode 100644 index 35234de87..000000000 --- a/docs/nx-cugraph/source/references/datasets.md +++ /dev/null @@ -1,21 +0,0 @@ -# Data Sets - -karate - - W. W. Zachary, *An information flow model for conflict and fission in small groups*, Journal of Anthropological Research 33, 452-473 (1977). -dolphins - - D. Lusseau, K. Schneider, O. J. Boisseau, P. Haase, E. Slooten, and S. M. Dawson, - *The bottlenose dolphin community of Doubtful Sound features a large proportion of long-lasting associations*, - Behavioral Ecology and Sociobiology 54, 396-405 (2003). -netscience - - M. E. J. Newman, - *Finding community structure in networks using the eigenvectors of matrices*, - Preprint physics/0605087 (2006). -email-Eu-core - - Hao Yin, Austin R. Benson, Jure Leskovec, and David F. Gleich. - *Local Higher-order Graph Clustering.* - In Proceedings of the 23rd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. 2017. - - J. Leskovec, J. Kleinberg and C. Faloutsos. - *Graph Evolution: Densification and Shrinking Diameters*. - ACM Transactions on Knowledge Discovery from Data (ACM TKDD), 1(1), 2007. http://www.cs.cmu.edu/~jure/pubs/powergrowth-tkdd.pdf -polbooks - - V. Krebs, unpublished, http://www.orgnet.com/. diff --git a/docs/nx-cugraph/source/references/index.rst b/docs/nx-cugraph/source/references/index.rst index 9ea51a083..a8529246d 100644 --- a/docs/nx-cugraph/source/references/index.rst +++ b/docs/nx-cugraph/source/references/index.rst @@ -6,6 +6,4 @@ References .. toctree:: :maxdepth: 3 - cugraph_ref.md - datasets.md licenses.md From e72d3086ad0933f97e2ad4033aa7e180129bc9bd Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 19:02:59 -0700 Subject: [PATCH 07/21] Delete unused docs --- .../source/tutorials/basic_cugraph.md | 38 -------- .../source/tutorials/community_resources.md | 4 - .../source/tutorials/cugraph_blogs.rst | 90 ------------------- .../source/tutorials/cugraph_notebooks.md | 72 --------------- .../source/tutorials/how_to_guides.md | 9 -- docs/nx-cugraph/source/tutorials/index.rst | 12 --- 6 files changed, 225 deletions(-) delete mode 100644 docs/nx-cugraph/source/tutorials/basic_cugraph.md delete mode 100644 docs/nx-cugraph/source/tutorials/community_resources.md delete mode 100644 docs/nx-cugraph/source/tutorials/cugraph_blogs.rst delete mode 100644 docs/nx-cugraph/source/tutorials/cugraph_notebooks.md delete mode 100644 docs/nx-cugraph/source/tutorials/how_to_guides.md delete mode 100644 docs/nx-cugraph/source/tutorials/index.rst diff --git a/docs/nx-cugraph/source/tutorials/basic_cugraph.md b/docs/nx-cugraph/source/tutorials/basic_cugraph.md deleted file mode 100644 index a0c9ad576..000000000 --- a/docs/nx-cugraph/source/tutorials/basic_cugraph.md +++ /dev/null @@ -1,38 +0,0 @@ -# Getting started with cuGraph - -## Required hardware/software - -CuGraph is part of [Rapids](https://docs.rapids.ai/user-guide) and has the following system requirements: - * NVIDIA GPU, Volta architecture or later, with [compute capability](https://developer.nvidia.com/cuda-gpus) 7.0+ - * CUDA 11.2, 11.4, 11.5, 11.8, 12.0, 12.2, or 12.5 - * Python version 3.10, 3.11, or 3.12 - * NetworkX >= version 3.3 or newer in order to use use [NetworkX Configs](https://networkx.org/documentation/stable/reference/backends.html#module-networkx.utils.configs) **This is required for use of nx-cuGraph, [see below](#cugraph-using-networkx-code).** - -## Installation -The latest RAPIDS System Requirements documentation is located [here](https://docs.rapids.ai/install#system-req). - -This includes several ways to set up cuGraph -* From Unix - * [Conda](https://docs.rapids.ai/install#wsl-conda) - * [Docker](https://docs.rapids.ai/install#wsl-docker) - * [pip](https://docs.rapids.ai/install#wsl-pip) - -* In windows you must install [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) and then choose one of the following: - * [Conda](https://docs.rapids.ai/install#wsl-conda) - * [Docker](https://docs.rapids.ai/install#wsl-docker) - * [pip](https://docs.rapids.ai/install#wsl-pip) - -* Build From Source - -To build from source, check each RAPIDS GitHub README for set up and build instructions. Further links are provided in the [selector tool](https://docs.rapids.ai/install#selector). If additional help is needed reach out on our [Slack Channel](https://rapids-goai.slack.com/archives/C5E06F4DC). - -## CuGraph Using NetworkX Code -While the steps above are required to use the full suite of cuGraph graph analytics, cuGraph is now supported as a NetworkX backend using [nx-cugraph](https://docs.rapids.ai/api/cugraph/nightly/nx_cugraph/nx_cugraph/). -Nx-cugraph offers those with existing NetworkX code, a **zero code change** option with a growing list of supported algorithms. - - -## Cugraph API Example -Coming soon ! - - -Until then, [the cuGraph notebook repository](https://github.com/rapidsai/cugraph/blob/main/notebooks/README.md) has many examples of loading graph data and running algorithms in Jupyter notebooks. The [cuGraph test code](https://github.com/rapidsai/cugraph/tree/main/python/cugraph/cugraph/tests) gives examples of python scripts settng up and calling cuGraph algorithms. A simple example of [testing the degree centrality algorithm](https://github.com/rapidsai/cugraph/blob/main/python/cugraph/cugraph/tests/centrality/test_degree_centrality.py) is a good place to start. Some of these examples show [multi-GPU tests/examples with larger data sets](https://github.com/rapidsai/cugraph/blob/main/python/cugraph/cugraph/tests/centrality/test_degree_centrality_mg.py) as well. diff --git a/docs/nx-cugraph/source/tutorials/community_resources.md b/docs/nx-cugraph/source/tutorials/community_resources.md deleted file mode 100644 index 975f11965..000000000 --- a/docs/nx-cugraph/source/tutorials/community_resources.md +++ /dev/null @@ -1,4 +0,0 @@ -# Commmunity Resources -[Rapids Community Repository](https://github.com/rapidsai-community/notebooks-contrib) -[RAPIDS Containers on Docker Hub](https://catalog.ngc.nvidia.com/containers) -[RAPIDS PyTorch Container in Docker](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pyg) diff --git a/docs/nx-cugraph/source/tutorials/cugraph_blogs.rst b/docs/nx-cugraph/source/tutorials/cugraph_blogs.rst deleted file mode 100644 index 3665f425e..000000000 --- a/docs/nx-cugraph/source/tutorials/cugraph_blogs.rst +++ /dev/null @@ -1,90 +0,0 @@ - -cuGraph Blogs and Presentations -************************************************ - -The RAPIDS team blogs at https://medium.com/rapids-ai, and many of -these blog posts provide deeper dives into features from cuGraph. -Here, we've selected just a few that are of particular interest to cuGraph users: - - -Blogs & Conferences -==================== -2024 ------- -Coming Soon - -2023 ------- - * `Intro to Graph Neural Networks with cuGraph-DGL `_ - * `GTC 2023 Ask the Experts Q&A `_ - * `Accelerating NetworkX on NVIDIA GPUs for High Performance Graph Analytics `_ - * `Introduction to Graph Neural Networks with NVIDIA cuGraph-DGL `_ - * `Supercharge Graph Analytics at Scale with GPU-CPU Fusion for 100x Performance `_ -2022 ------- - * `GTC: State of cuGraph (video & slides) `_ - * `GTC: Scaling and Validating Louvain in cuGraph against Massive Graphs (video & slides) `_ - * `KDD Tutorial on Accelerated GNN Training with DGL/PyG and cuGraph `_ - -2021 ------- - * `GTC 21 - State of RAPIDS cuGraph and what's comming next `_ - -2020 ------- - * `Status of RAPIDS cuGraph — Refactoring Code And Rethinking Graphs `_ - * `Tackling Large Graphs with RAPIDS cuGraph and CUDA Unified Memory on GPUs `_ - * `RAPIDS cuGraph adds NetworkX and DiGraph Compatibility `_ - * `Large Graph Visualization with RAPIDS cuGraph `_ - * `GTC 20 Fall - cuGraph Goes Big `_ - -2019 -------- - * `RAPIDS cuGraph `_ - * `RAPIDS cuGraph — The vision and journey to version 1.0 and beyond `_ - * `RAPIDS cuGraph : multi-GPU PageRank `_ - * `Similarity in graphs: Jaccard versus the Overlap Coefficient `_ - * `GTC19 Spring - Accelerating Graph Algorithms with RAPIDS `_ - * `GTC19 Fall - Multi-Node Multi-GPU Machine Learning and Graph Analytics with RAPIDS `_ - -2018 -------- - * `GTC18 Fall - RAPIDS: Benchmarking Graph Analytics on the DGX-2 `_ - - - -Media -=============== - * `Nvidia Rapids cuGraph: Making graph analysis ubiquitous `_ - * `RAPIDS cuGraph – Accelerating all your Graph needs `_ - -Academic Papers -=============== - - * Seunghwa Kang, Chuck Hastings, Joe Eaton, Brad Rees `cuGraph C++ primitives: vertex/edge-centric building blocks for parallel graph computing `_ - - * Alex Fender, Brad Rees, Joe Eaton (2022) `Massive Graph Analytics `_ Bader, D. (Editor) CRC Press - - * S Kang, A. Fender, J. Eaton, B. Rees:`Computing PageRank Scores of Web Crawl Data Using DGX A100 Clusters`. In IEEE HPEC, Sep. 2020 - - * Hricik, T., Bader, D., & Green, O. (2020, September). `Using RAPIDS AI to accelerate graph data science workflows`. In 2020 IEEE High Performance Extreme Computing Conference (HPEC) (pp. 1-4). IEEE. - - * Richardson, B., Rees, B., Drabas, T., Oldridge, E., Bader, D. A., & Allen, R. (2020, August). Accelerating and Expanding End-to-End Data Science Workflows with DL/ML Interoperability Using RAPIDS. In Proceedings of the 26th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (pp. 3503-3504). - - * A Gondhalekar, P Sathre, W Feng `Hybrid CPU-GPU Implementation of Edge-Connected Jaccard Similarity in Graph Datasets `_ - - -Other Blogs -======================== -* `4 graph algorithms on steroids for data scientists with cugraph `_ -* `Where should I walk `_ -* `Where really are the parking spots? `_ -* `Accelerating Single Cell Genomic Analysis using RAPIDS `_ -* `Running Large-Scale Graph Analytics with Memgraph and NVIDIA cuGraph Algorithms `_ -* `Dev Blog Repost: Similarity in Graphs: Jaccard Versus the Overlap Coefficient `_ - -RAPIDS Event Notebooks -====================== -* `KDD 2022 Notebook that demonstates using cuDF for ETL/data cleaning and XGBoost for training a fraud predection model. `_ -* `SciPy 22 Notebook comparing cuGraph to NetworkX `_ -* `KDD 2020 Tutorial Notebooks - Accelerating and Expanding End-to-End Data Science Workflows with DL/ML Interoperability Using RAPIDS `_ diff --git a/docs/nx-cugraph/source/tutorials/cugraph_notebooks.md b/docs/nx-cugraph/source/tutorials/cugraph_notebooks.md deleted file mode 100644 index 6d7840dc3..000000000 --- a/docs/nx-cugraph/source/tutorials/cugraph_notebooks.md +++ /dev/null @@ -1,72 +0,0 @@ -# cuGraph Notebooks - -![GraphAnalyticsFigure](https://github.com/rapidsai/cugraph/tree/main/img/GraphAnalyticsFigure.jpg) - -This repository contains a collection of Jupyter Notebooks that outline how to run various cuGraph analytics. The notebooks do not address a complete data science problem. The notebooks are simply examples of how to run the graph analytics. Manipulation of the data before or after the graph analytic is not covered here. Extended, more problem focused, notebooks are being created and available https://github.com/rapidsai/notebooks-extended - -## Summary - -| Folder | Notebook | Description | -| --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| Centrality | | | -| | [Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb) | Compute and compare multiple (currently 5) centrality scores | -| | [Katz](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Katz.ipynb) | Compute the Katz centrality for every vertex | -| | [Betweenness](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) | Compute both Edge and Vertex Betweenness centrality | -| | [Degree](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Degree.ipynb) | Compute Degree Centraility for each vertex | -| | [Eigenvector](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Eigenvector.ipynb) | Compute Eigenvector for every vertex | -| Community | | | -| | [Louvain and Leiden](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Louvain.ipynb) | Identify clusters in a graph using both the Louvain and Leiden algorithms | -| | [ECG](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/ECG.ipynb) | Identify clusters in a graph using the Ensemble Clustering for Graph | -| | [K-Truss](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/ktruss.ipynb) | Extracts the K-Truss cluster | -| | [Spectral-Clustering](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Spectral-Clustering.ipynb) | Identify clusters in a graph using Spectral Clustering with both
- Balanced Cut
- Modularity Modularity | -| | [Subgraph Extraction](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Subgraph-Extraction.ipynb) | Compute a subgraph of the existing graph including only the specified vertices | -| | [Triangle Counting](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Triangle-Counting.ipynb) | Count the number of Triangle in a graph | -| Components | | | -| | [Connected Components](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/components/ConnectedComponents.ipynb) | Find weakly and strongly connected components in a graph | -| Core | | | -| | [K-Core](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/cores/kcore.ipynb) | Extracts the K-core cluster | -| | [Core Number](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/cores/core-number.ipynb) | Computer the Core number for each vertex in a graph | -Layout | | | -| | [Force-Atlas2](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/layout/Force-Atlas2.ipynb) |A large graph visualization achieved with cuGraph. | -| Link Analysis | | | -| | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | Compute the PageRank of every vertex in a graph | -| | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | Compute the HITS' Hub and Authority scores for every vertex in a graph | -| Link Prediction | | | -| | [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) | Compute vertex similarity score using both:
- Jaccard Similarity
- Weighted Jaccard | -| | [Overlap Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Overlap-Similarity.ipynb) | Compute vertex similarity score using the Overlap Coefficient | -| Sampling | -| | [Random Walk](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/sampling/RandomWalk.ipynb) | Compute Random Walk for a various number of seeds and path lengths | -| Traversal | | | -| | [BFS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/traversal/BFS.ipynb) | Compute the Breadth First Search path from a starting vertex to every other vertex in a graph | -| | [SSSP](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/traversal/SSSP.ipynb) | Single Source Shortest Path - compute the shortest path from a starting vertex to every other vertex | -| Structure | | | -| | [Renumbering](algorithms/structure/Renumber.ipynb)
[Renumbering 2](algorithms/structure/Renumber-2.ipynb) | Renumber the vertex IDs in a graph (two sample notebooks) | -| | [Symmetrize](algorithms/structure/Symmetrize.ipynb) | Symmetrize the edges in a graph | - - -## RAPIDS notebooks -Visit the main RAPIDS [notebooks](https://github.com/rapidsai/cugraph/blob/main/notebooks/) repo for a listing of all notebooks across all RAPIDS libraries. - -## Requirements - -Running the example in these notebooks requires: - -* The latest version of RAPIDS with cuGraph. - * Download via Docker, Conda (See [__Getting Started__](https://rapids.ai/start.html)) - -* cuGraph is dependent on the latest version of cuDF. Please install all components of RAPIDS -* Python 3.10+ -* A system with an NVIDIA GPU: Volta architecture or newer -* CUDA 11.4+ - -## Copyright - -Copyright (c) 2019-2023, NVIDIA CORPORATION. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ---- diff --git a/docs/nx-cugraph/source/tutorials/how_to_guides.md b/docs/nx-cugraph/source/tutorials/how_to_guides.md deleted file mode 100644 index 998957afe..000000000 --- a/docs/nx-cugraph/source/tutorials/how_to_guides.md +++ /dev/null @@ -1,9 +0,0 @@ -# How To Guides -- [Basic use of cuGraph](./basic_cugraph.md) -- Property graph with analytic flow -- GNN – model building -- cuGraph Service – client/server setup and use (ucx) -- MNMG Graph – dask, rmm basics and examples -- Pylibcugraph – why and how -- Cugraph for C, C++ users -- Use of nvidia-smi with cugraph diff --git a/docs/nx-cugraph/source/tutorials/index.rst b/docs/nx-cugraph/source/tutorials/index.rst deleted file mode 100644 index 525fbe4f5..000000000 --- a/docs/nx-cugraph/source/tutorials/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -========= -Tutorials -========= - - -.. toctree:: - :maxdepth: 3 - - how_to_guides.md - cugraph_blogs.rst - community_resources.md - cugraph_notebooks.md From 71b3b5b685fa9865c94bdee4ba9659b36e00c1ba Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 19:04:17 -0700 Subject: [PATCH 08/21] Fix typo --- nx_cugraph/algorithms/centrality/katz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nx_cugraph/algorithms/centrality/katz.py b/nx_cugraph/algorithms/centrality/katz.py index 1c6ed6170..1890bd4d7 100644 --- a/nx_cugraph/algorithms/centrality/katz.py +++ b/nx_cugraph/algorithms/centrality/katz.py @@ -47,7 +47,7 @@ def katz_centrality( """`nstart` isn't used (but is checked), and `normalized=False` is not supported.""" if not normalized: # Redundant with the `_can_run` check below when being dispatched by NetworkX, - # but we raise here in case this funcion is called directly. + # but we raise here in case this function is called directly. raise NotImplementedError("normalized=False is not supported.") G = _to_graph(G, weight, 1, np.float32) if (N := len(G)) == 0: From 80e22606f7450f95e89029cc995dc8c15ec87b49 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 29 Oct 2024 19:09:28 -0700 Subject: [PATCH 09/21] Add pre-commit suggestions --- .pre-commit-config.yaml | 8 +------- dependencies.yaml | 6 +++--- pyproject.toml | 6 +++--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 55c9ecb28..225b171f3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,13 +72,7 @@ repos: types_or: [python, rst, markdown] additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - args: ["-L thirdparty"] - - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v16.0.6 - hooks: - - id: clang-format - types_or: [c, c++, cuda] - args: ["-fallback-style=none", "-style=file", "-i"] + args: ["-L thirdparty,coo,COO,numer"] - repo: https://github.com/rapidsai/pre-commit-hooks rev: v0.4.0 hooks: diff --git a/dependencies.yaml b/dependencies.yaml index c2d505253..6b054d87f 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -36,7 +36,7 @@ files: - test_notebook py_build_nx_cugraph: output: pyproject - pyproject_dir: python/nx-cugraph + pyproject_dir: . extras: table: build-system includes: @@ -44,7 +44,7 @@ files: - python_build_wheel py_run_nx_cugraph: output: pyproject - pyproject_dir: python/nx-cugraph + pyproject_dir: . extras: table: project includes: @@ -53,7 +53,7 @@ files: - python_run_nx_cugraph py_test_nx_cugraph: output: pyproject - pyproject_dir: python/nx-cugraph + pyproject_dir: . extras: table: project.optional-dependencies key: test diff --git a/pyproject.toml b/pyproject.toml index 5f7f18076..d5742dc4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ requires = [ "rapids-build-backend>=0.3.1,<0.4.0.dev0", "setuptools>=61.0.0", "wheel", -] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. +] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit dependencies.yaml and run `rapids-dependency-file-generator`. build-backend = "rapids_build_backend.build" [project] @@ -36,7 +36,7 @@ dependencies = [ "networkx>=3.0", "numpy>=1.23,<3.0a0", "pylibcugraph==24.12.*,>=0.0.0a0", -] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. +] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit dependencies.yaml and run `rapids-dependency-file-generator`. [project.optional-dependencies] test = [ @@ -48,7 +48,7 @@ test = [ "pytest-mpl", "pytest-xdist", "scipy", -] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. +] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit dependencies.yaml and run `rapids-dependency-file-generator`. [project.urls] Homepage = "https://github.com/rapidsai/nx-cugraph" From f381f72c2c9ef04cd567bbf175c37b72ccc28ce4 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 07:58:21 -0700 Subject: [PATCH 10/21] Remove lint.yaml and its references --- Makefile | 10 +------ lint.yaml | 87 ------------------------------------------------------- 2 files changed, 1 insertion(+), 96 deletions(-) delete mode 100644 lint.yaml diff --git a/Makefile b/Makefile index 6500d834e..643287b19 100644 --- a/Makefile +++ b/Makefile @@ -2,15 +2,7 @@ SHELL= /bin/bash .PHONY: all -all: plugin-info lint readme - -.PHONY: lint -lint: - git ls-files | xargs pre-commit run --config lint.yaml --files || true - -.PHONY: lint-update -lint-update: - pre-commit autoupdate --config lint.yaml +all: plugin-info readme .PHONY: plugin-info plugin-info: diff --git a/lint.yaml b/lint.yaml deleted file mode 100644 index dab2ea70e..000000000 --- a/lint.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (c) 2023-2024, NVIDIA CORPORATION. -# -# https://pre-commit.com/ -# -# Before first use: `pre-commit install` -# To run: `make lint` -# To update: `make lint-update` -# - &flake8_dependencies below needs updated manually -fail_fast: false -default_language_version: - python: python3 -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 - hooks: - - id: check-added-large-files - - id: check-case-conflict - - id: check-merge-conflict - - id: check-symlinks - - id: check-ast - - id: check-toml - - id: check-yaml - - id: debug-statements - - id: end-of-file-fixer - exclude_types: [svg] - - id: mixed-line-ending - - id: trailing-whitespace - - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.19 - hooks: - - id: validate-pyproject - name: Validate pyproject.toml - - repo: https://github.com/PyCQA/autoflake - rev: v2.3.1 - hooks: - - id: autoflake - args: [--in-place] - - repo: https://github.com/pycqa/isort - rev: 5.13.2 - hooks: - - id: isort - - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 - hooks: - - id: pyupgrade - args: [--py310-plus] - - repo: https://github.com/psf/black - rev: 24.8.0 - hooks: - - id: black - # - id: black-jupyter - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.7 - hooks: - - id: ruff - args: [--fix-only, --show-fixes] # --unsafe-fixes] - - repo: https://github.com/PyCQA/flake8 - rev: 7.1.1 - hooks: - - id: flake8 - args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501', '--extend-ignore=B020,SIM105'] # Why is this necessary? - additional_dependencies: &flake8_dependencies - # These versions need updated manually - - flake8==7.1.1 - - flake8-bugbear==24.8.19 - - flake8-simplify==0.21.0 - - repo: https://github.com/asottile/yesqa - rev: v1.5.0 - hooks: - - id: yesqa - additional_dependencies: *flake8_dependencies - - repo: https://github.com/codespell-project/codespell - rev: v2.3.0 - hooks: - - id: codespell - types_or: [python, rst, markdown] - additional_dependencies: [tomli] - files: ^(nx_cugraph|docs)/ - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.7 - hooks: - - id: ruff - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 - hooks: - - id: no-commit-to-branch - args: [-p, "^branch-2....$"] From 278ac798c7e7e33d4f554c3ef6c2934a3ee6e1a1 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 10:33:11 -0700 Subject: [PATCH 11/21] Remove unused segments --- .pre-commit-config.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 225b171f3..f923bce8a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ # To update: `make lint-update` # - &flake8_dependencies below needs updated manually exclude: '^thirdparty' -fail_fast: true # TODO flip off +fail_fast: false default_language_version: python: python3 repos: @@ -64,7 +64,6 @@ repos: rev: 24.8.0 hooks: - id: black - # - id: black-jupyter - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: From 5871906790f146be7d347709b6396ff66aab50e8 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 10:37:47 -0700 Subject: [PATCH 12/21] Update copyright string --- docs/nx-cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/nx-cugraph/source/conf.py b/docs/nx-cugraph/source/conf.py index b5f721a6a..32601f90d 100644 --- a/docs/nx-cugraph/source/conf.py +++ b/docs/nx-cugraph/source/conf.py @@ -72,7 +72,7 @@ # General information about the project. project = "cugraph" -copyright = "2019-2023, NVIDIA Corporation" +copyright = "2019-2024, NVIDIA Corporation" author = "NVIDIA Corporation" # The version info for the project you're documenting, acts as replacement for From eb6a6df74d39ef36e1f6a69b0491c778bfe5e62c Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 10:40:43 -0700 Subject: [PATCH 13/21] Preserve line and skip formatting --- .flake8 | 1 + docs/nx-cugraph/source/conf.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.flake8 b/.flake8 index 22f52e7e9..e7163df03 100644 --- a/.flake8 +++ b/.flake8 @@ -15,3 +15,4 @@ per-file-ignores = _nx_cugraph/__init__.py:E501, nx_cugraph/__init__.py:E402,F401,F403, benchmarks/nx-cugraph/pytest-based/create_results_summary_page.py:E501,W605, + docs/nx-cugraph/source/conf.py:E501 diff --git a/docs/nx-cugraph/source/conf.py b/docs/nx-cugraph/source/conf.py index 32601f90d..433e4b369 100644 --- a/docs/nx-cugraph/source/conf.py +++ b/docs/nx-cugraph/source/conf.py @@ -82,9 +82,11 @@ CUGRAPH_VERSION = Version(cugraph.__version__) # The short X.Y version. version = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}" -# The full version, including alpha/beta/rc tags. -release = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}.\ - {CUGRAPH_VERSION.micro:02}" +# The full version, including alpha/beta/rc tags. Skipping `black` formatting +# for readability +# fmt: off +release = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}.{CUGRAPH_VERSION.micro:02}" +# fmt: on # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From ef3b49630312aa4b63e4633b8a31dec08ed4b9f3 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 11:14:08 -0700 Subject: [PATCH 14/21] Update things to use nx-cugraph instead of cugraph --- docs/nx-cugraph/source/conf.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/nx-cugraph/source/conf.py b/docs/nx-cugraph/source/conf.py index 433e4b369..f03d7f4a3 100644 --- a/docs/nx-cugraph/source/conf.py +++ b/docs/nx-cugraph/source/conf.py @@ -19,10 +19,11 @@ import os import sys -import cugraph from github_link import make_linkcode_resolve from packaging.version import Version +import nx_cugraph + # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory # is relative to the documentation root, use os.path.abspath to make it @@ -71,7 +72,7 @@ master_doc = "index" # General information about the project. -project = "cugraph" +project = "nx-cugraph" copyright = "2019-2024, NVIDIA Corporation" author = "NVIDIA Corporation" @@ -79,13 +80,13 @@ # |version| and |release|, also used in various other places throughout the # built documents. # -CUGRAPH_VERSION = Version(cugraph.__version__) +NXCG_VERSION = Version(nx_cugraph.__version__) # The short X.Y version. -version = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}" +version = f"{NXCG_VERSION.major:02}.{NXCG_VERSION.minor:02}" # The full version, including alpha/beta/rc tags. Skipping `black` formatting # for readability # fmt: off -release = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}.{CUGRAPH_VERSION.micro:02}" +release = f"{NXCG_VERSION.major:02}.{NXCG_VERSION.minor:02}.{NXCG_VERSION.micro:02}" # fmt: on # The language for content autogenerated by Sphinx. Refer to documentation @@ -124,7 +125,7 @@ # html_theme_options = { "external_links": [], - "github_url": "https://github.com/rapidsai/cugraph", + "github_url": "https://github.com/rapidsai/nx-cugraph", "twitter_url": "https://twitter.com/rapidsai", "show_toc_level": 1, "navbar_align": "right", @@ -139,7 +140,7 @@ # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = "cugraphdoc" +htmlhelp_basename = "nx-cugraphdoc" # -- Options for LaTeX output --------------------------------------------- @@ -177,7 +178,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "cugraph", "cugraph Documentation", [author], 1)] +man_pages = [(master_doc, "nx-cugraph", "nx-cugraph Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- @@ -188,10 +189,10 @@ texinfo_documents = [ ( master_doc, - "cugraph", - "cugraph Documentation", + "nx-cugraph", + "nx-cugraph Documentation", author, - "cugraph", + "nx-cugraph", "GPU-accelerated graph analysis.", "Miscellaneous", ), @@ -226,7 +227,7 @@ def setup(app): # The following is used by sphinx.ext.linkcode to provide links to github linkcode_resolve = make_linkcode_resolve( - "https://github.com/rapidsai/cugraph/blob/{revision}/python/{path}#L{lineno}" + "https://github.com/rapidsai/nx_cugraph/blob/{revision}/python/{path}#L{lineno}" ) breathe_projects = { From a1b0491913fda76e6a89f17721d8b10edc97ccfb Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 11:31:25 -0700 Subject: [PATCH 15/21] Add pre-commit check as CI --- .github/workflows/pr.yaml | 69 +++++++++++++++++++-------------------- ci/check_pre-commit.sh | 8 +++++ 2 files changed, 41 insertions(+), 36 deletions(-) create mode 100644 ci/check_pre-commit.sh diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b75446551..b8ec46f8a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -12,48 +12,45 @@ concurrency: jobs: pr-builder: needs: + - changed-files - checks - - docs-build - - wheel-build-nx-cugraph - - wheel-tests-nx-cugraph + - pre-commit secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.12 - checks: - secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@python-3.12 + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-24.12 + if: always() with: - enable_check_generated_files: false - conda-notebook-tests: - needs: conda-python-build + needs: ${{ toJSON(needs) }} + changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.12 + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-24.12 with: - build_type: pull-request - node_type: "gpu-v100-latest-1" - arch: "amd64" - container_image: "rapidsai/ci-conda:cuda11.8.0-ubuntu22.04-py3.10" - run_script: "ci/test_notebooks.sh" - docs-build: - needs: conda-python-build - secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.12 - with: - build_type: pull-request - node_type: "gpu-v100-latest-1" - arch: "amd64" - container_image: "rapidsai/ci-conda:cuda11.8.0-ubuntu22.04-py3.10" - run_script: "ci/build_docs.sh" - wheel-build-nx-cugraph: - needs: wheel-tests-pylibcugraph + files_yaml: | + test_notebooks: + - '**' + - '!.devcontainers/**' + - '!CONTRIBUTING.md' + - '!README.md' + - '!docs/**' + # TODO: Remove this before merging + - '!.github/**' + test_python: + - '**' + - '!.devcontainers/**' + - '!CONTRIBUTING.md' + - '!README.md' + - '!docs/**' + - '!img/**' + - '!notebooks/**' + # TODO: Remove this before merging + - '!.github/**' + checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.12 + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.12 with: - build_type: pull-request - script: ci/build_wheel_nx-cugraph.sh - wheel-tests-nx-cugraph: - needs: wheel-build-nx-cugraph + enable_check_generated_files: false + pre-commit: + needs: checks secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.12 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.12 with: - build_type: pull-request - script: ci/test_wheel_nx-cugraph.sh + run_script: "ci/check_pre-commit.sh" diff --git a/ci/check_pre-commit.sh b/ci/check_pre-commit.sh new file mode 100644 index 000000000..81169d0c9 --- /dev/null +++ b/ci/check_pre-commit.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# Copyright (c) 2024, NVIDIA CORPORATION. + +set -euo pipefail + +rapids-logger "Running pre-commit" +pre-commit install +pre-commit run --all-files From 6ebfc9efc8512241c9c8a4ff4fc56f925d7f0291 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 11:39:01 -0700 Subject: [PATCH 16/21] Update pre-commit field --- .github/workflows/pr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b8ec46f8a..b2b6127ef 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -49,7 +49,7 @@ jobs: with: enable_check_generated_files: false pre-commit: - needs: checks + needs: [checks, changed-files] secrets: inherit uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.12 with: From ecc318d517b8b4d8ab8f0eb9664266b296e773fd Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 11:46:44 -0700 Subject: [PATCH 17/21] Add changes to pr.yaml --- .github/workflows/pr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b2b6127ef..28a6bc134 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -53,4 +53,5 @@ jobs: secrets: inherit uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.12 with: + build_type: pull-request run_script: "ci/check_pre-commit.sh" From fa0901d2804189345d7eb1a93d67f72c5758b0c3 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 12:04:15 -0700 Subject: [PATCH 18/21] update permissions --- ci/check_pre-commit.sh | 0 ci/check_style.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 ci/check_pre-commit.sh mode change 100644 => 100755 ci/check_style.sh diff --git a/ci/check_pre-commit.sh b/ci/check_pre-commit.sh old mode 100644 new mode 100755 diff --git a/ci/check_style.sh b/ci/check_style.sh old mode 100644 new mode 100755 From f5ed23913a45df8d04ec6e75703e3212992db20e Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 12:10:58 -0700 Subject: [PATCH 19/21] Add install line --- ci/check_pre-commit.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/check_pre-commit.sh b/ci/check_pre-commit.sh index 81169d0c9..2d1e2a9a2 100755 --- a/ci/check_pre-commit.sh +++ b/ci/check_pre-commit.sh @@ -3,6 +3,9 @@ set -euo pipefail +rapids-logger "Install" +pip install --yes pre-commit + rapids-logger "Running pre-commit" pre-commit install pre-commit run --all-files From 9e6eb1680864f85059be0c6412eb267c460dd156 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 30 Oct 2024 12:14:31 -0700 Subject: [PATCH 20/21] remove --yes --- ci/check_pre-commit.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/check_pre-commit.sh b/ci/check_pre-commit.sh index 2d1e2a9a2..0cccd6160 100755 --- a/ci/check_pre-commit.sh +++ b/ci/check_pre-commit.sh @@ -4,7 +4,7 @@ set -euo pipefail rapids-logger "Install" -pip install --yes pre-commit +pip install pre-commit rapids-logger "Running pre-commit" pre-commit install From afe37ae8e43743e283b30a5a81f3c148d91f7e63 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Wed, 30 Oct 2024 14:28:08 -0500 Subject: [PATCH 21/21] run pre-commit on every PR --- .github/workflows/pr.yaml | 32 -------------------------------- ci/check_pre-commit.sh | 11 ----------- 2 files changed, 43 deletions(-) delete mode 100755 ci/check_pre-commit.sh diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 28a6bc134..671d5f6a9 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -12,46 +12,14 @@ concurrency: jobs: pr-builder: needs: - - changed-files - checks - - pre-commit secrets: inherit uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-24.12 if: always() with: needs: ${{ toJSON(needs) }} - changed-files: - secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-24.12 - with: - files_yaml: | - test_notebooks: - - '**' - - '!.devcontainers/**' - - '!CONTRIBUTING.md' - - '!README.md' - - '!docs/**' - # TODO: Remove this before merging - - '!.github/**' - test_python: - - '**' - - '!.devcontainers/**' - - '!CONTRIBUTING.md' - - '!README.md' - - '!docs/**' - - '!img/**' - - '!notebooks/**' - # TODO: Remove this before merging - - '!.github/**' checks: secrets: inherit uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.12 with: enable_check_generated_files: false - pre-commit: - needs: [checks, changed-files] - secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.12 - with: - build_type: pull-request - run_script: "ci/check_pre-commit.sh" diff --git a/ci/check_pre-commit.sh b/ci/check_pre-commit.sh deleted file mode 100755 index 0cccd6160..000000000 --- a/ci/check_pre-commit.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Copyright (c) 2024, NVIDIA CORPORATION. - -set -euo pipefail - -rapids-logger "Install" -pip install pre-commit - -rapids-logger "Running pre-commit" -pre-commit install -pre-commit run --all-files