From ea87cc6c33fe765bf9746c48526fd0ca06c8f198 Mon Sep 17 00:00:00 2001 From: afender Date: Wed, 5 Dec 2018 14:53:34 -0600 Subject: [PATCH 001/384] first commit --- docs/Makefile | 20 +++++ docs/README.md | 19 ++++ docs/make.bat | 36 ++++++++ docs/requirement.txt | 4 + docs/source/_static/EMPTY | 0 docs/source/api.rst | 15 ++++ docs/source/conf.py | 185 ++++++++++++++++++++++++++++++++++++++ docs/source/index.rst | 15 ++++ 8 files changed, 294 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/README.md create mode 100644 docs/make.bat create mode 100644 docs/requirement.txt create mode 100644 docs/source/_static/EMPTY create mode 100644 docs/source/api.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..e88382797 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = cuGraph +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..e2654d443 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,19 @@ +# Building Documentation + +A basic python environment with packages listed in `./requirement.txt` is +enough to build the docs. + +## Get additional dependency + +```bash +pip install -r requirement.txt +``` + +## Run makefile: + +```bash +make html +``` + +Outputs to `build/html/index.html` + diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 000000000..807e0de85 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build +set SPHINXPROJ=cuGraph + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/requirement.txt b/docs/requirement.txt new file mode 100644 index 000000000..f636fd879 --- /dev/null +++ b/docs/requirement.txt @@ -0,0 +1,4 @@ +sphinx +sphinx_rtd_theme +numpydoc +ipython \ No newline at end of file diff --git a/docs/source/_static/EMPTY b/docs/source/_static/EMPTY new file mode 100644 index 000000000..e69de29bb diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 000000000..c5f1715d5 --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,15 @@ +API Reference +============= + +.. currentmodule:: cuGraph + +Graph +--------- +.. autoclass:: Graph + :members: + +Pagerank +--------- +.. automodule:: cuGraph + :members: pagerank + :undoc-members: pagerank diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 000000000..24097e722 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2018, NVIDIA CORPORATION. +# +# pygdf documentation build configuration file, created by +# sphinx-quickstart on Wed May 3 10:59:22 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# 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. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../..')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.intersphinx', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'numpydoc', + 'IPython.sphinxext.ipython_console_highlighting', + 'IPython.sphinxext.ipython_directive', +] +ipython_mplbackend = None + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'cuGraph' +copyright = '2018, NVIDIA' +author = 'NVIDIA' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.3.0' +# The full version, including alpha/beta/rc tags. +release = '0.3.0' + +# 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 = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# + +html_theme = 'sphinx_rtd_theme' + +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +if not on_rtd: + # only import and set the theme if we're building docs locally + # otherwise, readthedocs.org uses their theme by default, + # so no need to specify it + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# 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'] + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'cuGraphdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # 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', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'cuGraph.tex', 'cuGraph Documentation', + 'Continuum Analytics', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# 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) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'cuGraph', 'cuGraph Documentation', + author, 'cuGraph', 'One line description of project.', + 'Miscellaneous'), +] + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'https://docs.python.org/': None} + + +# Config numpydoc +numpydoc_show_inherited_class_members = False +numpydoc_class_members_toctree = False diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 000000000..af73fbf1c --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,15 @@ +Welcome to cuDF's documentation! +================================= + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + api.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` From 4c3fe8e68ba3dcdd1226af637f4fc37aa2f131d0 Mon Sep 17 00:00:00 2001 From: Dante Gama Dessavre Date: Thu, 6 Dec 2018 15:34:09 -0600 Subject: [PATCH 002/384] Added License file --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..3ba63d53f --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 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. From b1b7f82533b3b67d6f7f4b0a1111cc640e102ce4 Mon Sep 17 00:00:00 2001 From: Chuck Hastings Date: Thu, 24 Jan 2019 15:56:11 -0600 Subject: [PATCH 003/384] Add python bindings for SSSP, incorporates some of Ishika's PR 41 --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build From 2f8f930da765d648e9eabd9bbfd7fad1b947457f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 25 Jan 2019 17:03:30 +0000 Subject: [PATCH 004/384] Quick and Dirty CMake fix and .gitignore --- .gitignore | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..1553230dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +## Common +__pycache__ +*.pyc +*.a +*.o +*.so +*.dylib +.cache +.coverage +.vscode +*.swp +*.pytest_cache +DartConfiguration.tcl +.DS_Store + +## Python build directories & artifacts +htmlcov +dist/ +cudf.egg-info/ +python/build +python/cudf/bindings/*.cpp + +## Patching +*.diff +*.orig +*.rej + +## C++ build directories & artifacts +CMakeFiles/ +Debug +build/ + +## Eclipse IDE +.project +.cproject +.settings From 02f1acd343df9e67241802f82e66378c77a9a9e8 Mon Sep 17 00:00:00 2001 From: James Wyles Date: Mon, 4 Feb 2019 12:56:21 -0700 Subject: [PATCH 005/384] Reorganized directory structure to match cuDf, added in files to match cudf. Some files are left blank to be filled in later --- print_env.sh | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 print_env.sh diff --git a/print_env.sh b/print_env.sh new file mode 100644 index 000000000..ddb36bc65 --- /dev/null +++ b/print_env.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# Reports relevant environment information useful for diagnosing and +# debugging cuGraph issues. +# Usage: +# "./print_env.sh" - prints to stdout +# "./print_env.sh > env.txt" - prints to file "env.txt" + +echo "**git***" +if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]; then +git log --decorate -n 1 +else +echo "Not inside a git repository" +fi +echo + +echo "***OS Information***" +cat /etc/*-release +uname -a +echo + +echo "***GPU Information***" +nvidia-smi +echo + +echo "***CPU***" +lscpu +echo + +echo "***CMake***" +which cmake && cmake --version +echo + +echo "***g++***" +which g++ && g++ --version +echo + +echo "***nvcc***" +which nvcc && nvcc --version +echo + +echo "***Python***" +which python && python --version +echo + +echo "***Environment Variables***" + +printf '%-32s: %s\n' PATH $PATH + +printf '%-32s: %s\n' LD_LIBRARY_PATH $LD_LIBRARY_PATH + +printf '%-32s: %s\n' NUMBAPRO_NVVM $NUMBAPRO_NVVM + +printf '%-32s: %s\n' NUMBAPRO_LIBDEVICE $NUMBAPRO_LIBDEVICE + +printf '%-32s: %s\n' CONDA_PREFIX $CONDA_PREFIX + +printf '%-32s: %s\n' PYTHON_PATH $PYTHON_PATH + +echo + + +# Print conda packages if conda exists +if type "conda" &> /dev/null; then +echo '***conda packages***' +which conda && conda list +echo +# Print pip packages if pip exists +elif type "pip" &> /dev/null; then +echo "conda not found" +echo "***pip packages***" +which pip && pip list +echo +else +echo "conda not found" +echo "pip not found" +fi From 439f09e46ea2b476a885ba8a6f2a1312b2799d98 Mon Sep 17 00:00:00 2001 From: Chuck Hastings Date: Fri, 22 Feb 2019 15:22:07 -0500 Subject: [PATCH 006/384] Update document configuration so the python documentation will be constructed properly --- docs/source/api.rst | 53 +++++++++++++++++++++++++++++++++++++++++-- docs/source/conf.py | 18 +++++++-------- docs/source/index.rst | 2 +- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index c5f1715d5..cbcedbe10 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -1,7 +1,7 @@ API Reference ============= -.. currentmodule:: cuGraph +.. currentmodule:: cugraph Graph --------- @@ -10,6 +10,55 @@ Graph Pagerank --------- -.. automodule:: cuGraph +.. automodule:: cugraph :members: pagerank :undoc-members: pagerank + +Bfs +--------- +.. automodule:: cugraph + :members: bfs + :undoc-members: bfs + +Jaccard +--------- +.. automodule:: cugraph + :members: nvJaccard + :undoc-members: nvJaccard + +Louvain +--------- +.. automodule:: cugraph + :members: nvLouvain + :undoc-members: nvLouvain + +Grmat +--------- +.. automodule:: cugraph + :members: grmat_gen + :undoc-members: grmat_gen + +Spectral Clustering +------------------- +.. automodule:: cugraph + :members: spectralBalancedCutClustering + :undoc-members: spectralBalancedCutClustering +.. automodule:: cugraph + :members: spectralModularityMaximizationClustering + :undoc-members: spectralModularityMaximizationClustering +.. automodule:: cugraph + :members: analyzeClustering_modularity + :undoc-members: analyzeClustering_modularity +.. automodule:: cugraph + :members: analyzeClustering_edge_cut + :undoc-members: analyzeClustering_edge_cut +.. automodule:: cugraph + :members: analyzeClustering_ratio_cut + :undoc-members: analyzeClustering_ratio_cut + +Sssp +--------- +.. automodule:: cugraph + :members: sssp + :undoc-members: sssp + diff --git a/docs/source/conf.py b/docs/source/conf.py index 24097e722..d0d2dfb9c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -55,8 +55,8 @@ master_doc = 'index' # General information about the project. -project = 'cuGraph' -copyright = '2018, NVIDIA' +project = 'cugraph' +copyright = '2019, NVIDIA' author = 'NVIDIA' # The version info for the project you're documenting, acts as replacement for @@ -64,9 +64,9 @@ # built documents. # # The short X.Y version. -version = '0.3.0' +version = '0.5.0' # The full version, including alpha/beta/rc tags. -release = '0.3.0' +release = '0.5.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -122,7 +122,7 @@ # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = 'cuGraphdoc' +htmlhelp_basename = 'cugraphdoc' # -- Options for LaTeX output --------------------------------------------- @@ -149,7 +149,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'cuGraph.tex', 'cuGraph Documentation', + (master_doc, 'cugraph.tex', 'cugraph Documentation', 'Continuum Analytics', 'manual'), ] @@ -159,7 +159,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'cuGraph', 'cuGraph Documentation', + (master_doc, 'cugraph', 'cugraph Documentation', [author], 1) ] @@ -170,8 +170,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'cuGraph', 'cuGraph Documentation', - author, 'cuGraph', 'One line description of project.', + (master_doc, 'cugraph', 'cugraph Documentation', + author, 'cugraph', 'One line description of project.', 'Miscellaneous'), ] diff --git a/docs/source/index.rst b/docs/source/index.rst index af73fbf1c..eeb043551 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -2,7 +2,7 @@ Welcome to cuDF's documentation! ================================= .. toctree:: - :maxdepth: 3 + :maxdepth: 4 :caption: Contents: api.rst From bd475ae5d94593a693fb9750e8f2b6555c5e9027 Mon Sep 17 00:00:00 2001 From: Chuck Hastings Date: Fri, 22 Feb 2019 15:28:01 -0500 Subject: [PATCH 007/384] rename from cudf to cugraph --- docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index eeb043551..afac2bcee 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,4 +1,4 @@ -Welcome to cuDF's documentation! +Welcome to cugraph's documentation! ================================= .. toctree:: From b1baa9181c160cc381e822cc8151b1933a5039ee Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 22 Mar 2019 21:02:36 -0400 Subject: [PATCH 008/384] REL Update versions for release --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index d0d2dfb9c..f692003f4 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -64,9 +64,9 @@ # built documents. # # The short X.Y version. -version = '0.5.0' +version = '0.6' # The full version, including alpha/beta/rc tags. -release = '0.5.0' +release = '0.6.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1b962d13b83410a204867a4a7646f8b1ca66d915 Mon Sep 17 00:00:00 2001 From: Ray Douglass <3107146+raydouglass@users.noreply.github.com> Date: Mon, 25 Mar 2019 16:49:47 -0400 Subject: [PATCH 009/384] Update docs version to 0.7 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index f692003f4..affc1c0ec 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -64,9 +64,9 @@ # built documents. # # The short X.Y version. -version = '0.6' +version = '0.7' # The full version, including alpha/beta/rc tags. -release = '0.6.0' +release = '0.7.0.dev0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7b4470895553c2ac6e032683bf10fc05d6747aef Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Mon, 29 Apr 2019 11:57:45 -0400 Subject: [PATCH 010/384] DOC Update version --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index affc1c0ec..1551147de 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -64,9 +64,9 @@ # built documents. # # The short X.Y version. -version = '0.7' +version = '0.8' # The full version, including alpha/beta/rc tags. -release = '0.7.0.dev0' +release = '0.8.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 826ff8e780096d3b79ce0be731aa107f6ff94cb1 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 10 May 2019 10:30:30 -0700 Subject: [PATCH 011/384] REL v0.7.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index affc1c0ec..d1e614da5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -66,7 +66,7 @@ # The short X.Y version. version = '0.7' # The full version, including alpha/beta/rc tags. -release = '0.7.0.dev0' +release = '0.7.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1a554e70c13a3be3b20ae28185b45f8586424636 Mon Sep 17 00:00:00 2001 From: Kumar Aatish Date: Fri, 31 May 2019 21:24:55 -0400 Subject: [PATCH 012/384] Added datasets to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1553230dd..d9852fb9e 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ build/ .project .cproject .settings + +datasets/* From cbdebe07ce0f3a8dba076d6438a02a49f60972a2 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Mon, 17 Jun 2019 15:12:42 -0400 Subject: [PATCH 013/384] DOC Update to v0.9 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1551147de..365be6320 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -64,9 +64,9 @@ # built documents. # # The short X.Y version. -version = '0.8' +version = '0.9' # The full version, including alpha/beta/rc tags. -release = '0.8.0a' +release = '0.9.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b01fa274790317e61bb0d01ad14e32123acb8ecd Mon Sep 17 00:00:00 2001 From: Dillon Cullinan Date: Mon, 24 Jun 2019 12:46:38 -0700 Subject: [PATCH 014/384] Fix python docs --- docs/source/_static/params.css | 9 +++++++++ docs/source/conf.py | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 docs/source/_static/params.css diff --git a/docs/source/_static/params.css b/docs/source/_static/params.css new file mode 100644 index 000000000..dc5cb9640 --- /dev/null +++ b/docs/source/_static/params.css @@ -0,0 +1,9 @@ +/* Mirrors the change in: + * https://github.com/sphinx-doc/sphinx/pull/5976 + * which is not showing up in our theme. + */ +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} diff --git a/docs/source/conf.py b/docs/source/conf.py index 1551147de..4066f5344 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -40,6 +40,7 @@ 'IPython.sphinxext.ipython_console_highlighting', 'IPython.sphinxext.ipython_directive', ] + ipython_mplbackend = None # Add any paths that contain templates here, relative to this directory. @@ -183,3 +184,7 @@ # Config numpydoc numpydoc_show_inherited_class_members = False numpydoc_class_members_toctree = False + + +def setup(app): + app.add_stylesheet('params.css') From a4c567b837eab709422150a5df790407a353c6bd Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Thu, 27 Jun 2019 09:11:23 -0700 Subject: [PATCH 015/384] REL v0.8.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 4066f5344..03bf23266 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.8' # The full version, including alpha/beta/rc tags. -release = '0.8.0a' +release = '0.8.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 6cb6b5570f3a1c3270d490e2ed81c2e70daf39b5 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 28 Jun 2019 13:52:05 -0700 Subject: [PATCH 016/384] REL v0.8.1 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 03bf23266..5049c2575 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.8' # The full version, including alpha/beta/rc tags. -release = '0.8.0' +release = '0.8.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 9b4dfd4d52d7ab11358ecb52e749f7b8a7680060 Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Tue, 23 Jul 2019 15:19:52 -0700 Subject: [PATCH 017/384] ipython_mplbackend = None => 'str' to silent WARNING: The config value `ipython_mplbackend' has type `NoneType', defaults to `str'. --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index f4539759a..6c34c3d5e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -41,7 +41,7 @@ 'IPython.sphinxext.ipython_directive', ] -ipython_mplbackend = None +ipython_mplbackend = 'str' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From f4ecb140b6734820ada33f32e4f03b5765ace4c4 Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Tue, 23 Jul 2019 15:24:55 -0700 Subject: [PATCH 018/384] added underlines to silent WARNING: Title underline too short. --- docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index afac2bcee..fce08eaf2 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,5 +1,5 @@ Welcome to cugraph's documentation! -================================= +=================================== .. toctree:: :maxdepth: 4 From 31300ddeba870531c67d2d4fa57cd42be95ca55e Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Tue, 23 Jul 2019 15:41:52 -0700 Subject: [PATCH 019/384] updated source/api.rst to reflect recent python directory restructuring. --- docs/source/api.rst | 178 ++++++++++++++++++++++++++++++-------------- 1 file changed, 124 insertions(+), 54 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index cbcedbe10..42396a5ce 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -1,64 +1,134 @@ -API Reference -============= +~~~~~~~~~~~~~~~~~~~~~ +cuGraph API Reference +~~~~~~~~~~~~~~~~~~~~~ + + -.. currentmodule:: cugraph +Structure +========= Graph ---------- -.. autoclass:: Graph +----- + +.. autoclass:: cugraph.structure.graph.Graph :members: + :undoc-members: -Pagerank ---------- -.. automodule:: cugraph - :members: pagerank - :undoc-members: pagerank +Renumbering +----------- + +.. automodule:: cugraph.structure.renumber + :members: + :undoc-members: + +Conversion from Other Formats +----------------------------- + +.. automodule:: cugraph.structure.convert_matrix + :members: + :undoc-members: + + +Community +========= -Bfs ---------- -.. automodule:: cugraph - :members: bfs - :undoc-members: bfs - -Jaccard ---------- -.. automodule:: cugraph - :members: nvJaccard - :undoc-members: nvJaccard - Louvain ---------- -.. automodule:: cugraph - :members: nvLouvain - :undoc-members: nvLouvain - -Grmat ---------- -.. automodule:: cugraph - :members: grmat_gen - :undoc-members: grmat_gen - +------- + +.. automodule:: cugraph.community.louvain + :members: + :undoc-members: + Spectral Clustering ------------------- -.. automodule:: cugraph - :members: spectralBalancedCutClustering - :undoc-members: spectralBalancedCutClustering -.. automodule:: cugraph - :members: spectralModularityMaximizationClustering - :undoc-members: spectralModularityMaximizationClustering -.. automodule:: cugraph - :members: analyzeClustering_modularity - :undoc-members: analyzeClustering_modularity -.. automodule:: cugraph - :members: analyzeClustering_edge_cut - :undoc-members: analyzeClustering_edge_cut -.. automodule:: cugraph - :members: analyzeClustering_ratio_cut - :undoc-members: analyzeClustering_ratio_cut - -Sssp + +.. automodule:: cugraph.community.spectral_clustering + :members: + :undoc-members: + +Subgraph Extraction +------------------- + +.. automodule:: cugraph.community.subgraph_extraction + :members: + :undoc-members: + +Tirangle Counting +----------------- + +.. automodule:: cugraph.community.triangle_count + :members: + :undoc-members: + +Components +========== + +Connected Components +-------------------- + +.. automodule:: cugraph.components.connectivity + :members: + :undoc-members: + +Link Analysis +============= + +Pagerank --------- -.. automodule:: cugraph - :members: sssp - :undoc-members: sssp - + +.. automodule:: cugraph.link_analysis.pagerank + :members: + :undoc-members: + +Link Prediction +=============== + +Jaccard Coefficient +------------------- + +.. automodule:: cugraph.link_prediction.jaccard + :members: + :undoc-members: + +.. automodule:: cugraph.link_prediction.wjaccard + :members: + :undoc-members: + +Overlap Coefficient +------------------- + +.. automodule:: cugraph.link_prediction.overlap + :members: + :undoc-members: + +.. automodule:: cugraph.link_prediction.woverlap + :members: + :undoc-members: + +Traversal +========= + +Breadth-first-search +-------------------- + +.. automodule:: cugraph.traversal.bfs + :members: + :undoc-members: + +Single-source-shortest-path +--------------------------- + +.. automodule:: cugraph.traversal.sssp + :members: + :undoc-members: + +Utilities +========= + +R-mat Graph Generation +---------------------- + +.. automodule:: cugraph.utilities.grmat + :members: + :undoc-members: + From cc84acbdd71b049f94e2eb8bf550522115c555fc Mon Sep 17 00:00:00 2001 From: afender Date: Thu, 25 Jul 2019 13:22:00 -0500 Subject: [PATCH 020/384] updated api.rst --- docs/source/api.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index cbcedbe10..0f45c959d 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -62,3 +62,13 @@ Sssp :members: sssp :undoc-members: sssp + +Dask +========= + +Pagerank +------- + +.. automodule:: cugraph.dask.pagerank.pagerank + :members: + :undoc-members: \ No newline at end of file From d08fd863ded5e177aa0fd43ed74e50ebe3f3c120 Mon Sep 17 00:00:00 2001 From: Alex Fender <45606510+afender@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:02:55 -0500 Subject: [PATCH 021/384] Update api.rst --- docs/source/api.rst | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 0f45c959d..cbcedbe10 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -62,13 +62,3 @@ Sssp :members: sssp :undoc-members: sssp - -Dask -========= - -Pagerank -------- - -.. automodule:: cugraph.dask.pagerank.pagerank - :members: - :undoc-members: \ No newline at end of file From 6d1c3800b2aab62651e60721d7d896a024d2226c Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Wed, 7 Aug 2019 11:08:36 -0700 Subject: [PATCH 022/384] Add multi-GPU section in the cugraph documentation --- docs/source/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.rst b/docs/source/index.rst index fce08eaf2..47360b88f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,6 +6,7 @@ Welcome to cugraph's documentation! :caption: Contents: api.rst + dask-cugraph.rst Indices and tables ================== From 78fc678137629022ad00830ebf0a6ef14f4791d6 Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Wed, 7 Aug 2019 12:39:07 -0700 Subject: [PATCH 023/384] add a documentation page explaining supported multi-GPU graph analytics --- docs/source/dask-cugraph.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docs/source/dask-cugraph.rst diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst new file mode 100644 index 000000000..b1246d416 --- /dev/null +++ b/docs/source/dask-cugraph.rst @@ -0,0 +1,15 @@ +~~~~~~~~~~~~~~~~~~~ +Multi-GPU with Dask +~~~~~~~~~~~~~~~~~~~ + +cuGraph is a single-GPU library. For Multi-GPU cuGraph solutions we use Dask (https://dask.org), which is able to scale cuGraph across multiple GPUs on a single machine, or in future releases, multiple GPUs across many machines in a cluster. + +Supported Graph Analytics +========================= + +Pagerank +-------- + +.. automodule:: cugraph.dask.pagerank.pagerank + :members: pagerank + :undoc-members: pagerank From 34c9cc1547a73a0c2786d3a6891caa1878dc193a Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 8 Aug 2019 17:04:05 -0400 Subject: [PATCH 024/384] DOC Update to v0.10 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 6c34c3d5e..1c6ce5d3d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.9' +version = '0.10' # The full version, including alpha/beta/rc tags. -release = '0.9.0a' +release = '0.10.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7c9c5e87e1d7166ad04af9acbee375699a452b41 Mon Sep 17 00:00:00 2001 From: Seunghwa Kang Date: Fri, 9 Aug 2019 09:56:43 -0700 Subject: [PATCH 025/384] update the multi-gpu section reflecting reviewer comments --- docs/source/dask-cugraph.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst index b1246d416..f61805227 100644 --- a/docs/source/dask-cugraph.rst +++ b/docs/source/dask-cugraph.rst @@ -1,8 +1,17 @@ -~~~~~~~~~~~~~~~~~~~ -Multi-GPU with Dask -~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~ +Multi-GPU with cuGraph +~~~~~~~~~~~~~~~~~~~~~~ -cuGraph is a single-GPU library. For Multi-GPU cuGraph solutions we use Dask (https://dask.org), which is able to scale cuGraph across multiple GPUs on a single machine, or in future releases, multiple GPUs across many machines in a cluster. +cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. + +The current solution is able to scale across multiple GPUs on a single machine. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. + +With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 16 NVIDIA V100 GPUs on a DGX-2, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. + +When to Use Multiple GPUs in cuGraph +==================================== + +If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. Supported Graph Analytics ========================= From 940b42eff8bf2bf0499df2b3bbd93dcebe6b306a Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 21 Aug 2019 13:03:08 -0700 Subject: [PATCH 026/384] REL v0.9.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 6c34c3d5e..faedbfc0e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.9' # The full version, including alpha/beta/rc tags. -release = '0.9.0a' +release = '0.9.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 3cc2219f2b5ff08ca3f5baa3a25f588e94a8c56b Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Thu, 5 Sep 2019 07:22:06 -0700 Subject: [PATCH 027/384] Address issues from PR review - add testing for values - add configuration information so documentation will be generated - can't use drop_duplicates with weights and get a consistent answer, so change implementation to use groupby --- docs/source/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index 42396a5ce..1a2ea5225 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -21,6 +21,13 @@ Renumbering :members: :undoc-members: +Symmetrize +---------- + +.. automodule:: cugraph.structure.symmetrize + :members: + :undoc-members: + Conversion from Other Formats ----------------------------- From bcad1b17c95d3cd49fca8f7ea6d36e4c2b763e9b Mon Sep 17 00:00:00 2001 From: Kumar Aatish Date: Wed, 11 Sep 2019 16:30:02 -0400 Subject: [PATCH 028/384] PR Review fixes --- docs/source/api.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 42396a5ce..4680daaaf 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -29,6 +29,16 @@ Conversion from Other Formats :undoc-members: +Centrality +========== + +Katz Centrality +--------------- + +.. automodule:: cugraph.centrality.katz_centrality + :members: + :undoc-members: + Community ========= @@ -53,7 +63,7 @@ Subgraph Extraction :members: :undoc-members: -Tirangle Counting +Triangle Counting ----------------- .. automodule:: cugraph.community.triangle_count From 0503fc00b266d03408b1691cab0eb4ccd4120081 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 26 Sep 2019 15:53:54 -0400 Subject: [PATCH 029/384] DOC Update to v0.11 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1c6ce5d3d..80754217f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.10' +version = '0.11' # The full version, including alpha/beta/rc tags. -release = '0.10.0a' +release = '0.11.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From f7758ba602192a00e605f9f023f590dd5ef0c622 Mon Sep 17 00:00:00 2001 From: Kumar Aatish Date: Tue, 8 Oct 2019 11:26:27 -0400 Subject: [PATCH 030/384] Added missing cores documentation --- docs/source/api.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index 5f72ac63f..ffbf5b71f 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -87,6 +87,24 @@ Connected Components :members: :undoc-members: +Cores +===== + +K-Core +------ + +.. automodule:: cugraph.cores.k_core + :members: + :undoc-members: + +Core Number +----------- + +.. automodule:: cugraph.cores.core_number + :members: + :undoc-members: + + Link Analysis ============= From 6161e2416b03a2c250a3684d6820288795e0350b Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 11 Oct 2019 17:08:38 -0500 Subject: [PATCH 031/384] Revert "DOC Update to v0.11" This reverts commit 0503fc00b266d03408b1691cab0eb4ccd4120081. --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 80754217f..1c6ce5d3d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.11' +version = '0.10' # The full version, including alpha/beta/rc tags. -release = '0.11.0a' +release = '0.10.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b41617cb5c4cba3833e702081382b93656c1b9e7 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Tue, 15 Oct 2019 16:42:48 -0400 Subject: [PATCH 032/384] Revert "Merge pull request #558 from afender/revert_0.11_changes" This reverts commit 7df3a1afacfc3bec2bfa16b791eb46a9b8625174, reversing changes made to e3182de266b8162bcc3296deb1bef61c7f0cb01f. This reintroduces v0.11 changes that were reverted from v0.10 and the revert was forward merged to v0.11 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1c6ce5d3d..80754217f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.10' +version = '0.11' # The full version, including alpha/beta/rc tags. -release = '0.10.0a' +release = '0.11.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 217fca7b3afa7ff86ad91fc15799a0fb64f37b4c Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Thu, 17 Oct 2019 10:56:36 -0700 Subject: [PATCH 033/384] REL v0.10.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1c6ce5d3d..9ca739c52 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.10' # The full version, including alpha/beta/rc tags. -release = '0.10.0a' +release = '0.10.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From feca9d1d181b7d755d5bd6bb6852817a5c64dac0 Mon Sep 17 00:00:00 2001 From: Oded Green Date: Tue, 12 Nov 2019 13:19:48 -0500 Subject: [PATCH 034/384] Updating api.rst --- docs/source/api.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index ffbf5b71f..d115ad17d 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -105,6 +105,14 @@ Core Number :undoc-members: +K-Truss +------- + +.. automodule:: cugraph.ktruss.ktruss_max + :members: + :undoc-members: + + Link Analysis ============= From a3c7627ffeb6a63f23453fbce0cb0aa35ee9f58e Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 22 Nov 2019 16:21:54 -0500 Subject: [PATCH 035/384] DOC Update to v0.12 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 80754217f..ffede64e5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.11' +version = '0.12' # The full version, including alpha/beta/rc tags. -release = '0.11.0a' +release = '0.12.0a' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From f7fc8671e3ae997d61d1b19ab7fa844ca6e41249 Mon Sep 17 00:00:00 2001 From: brees Date: Mon, 2 Dec 2019 13:36:03 -0500 Subject: [PATCH 036/384] updated API argument --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d9852fb9e..b30745da9 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ build/ .settings datasets/* +.pydevproject From 55f4b17b22b23bead1567edaaa7b894ed2d7e921 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 11 Dec 2019 12:13:14 -0800 Subject: [PATCH 037/384] REL v0.11.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 80754217f..e8acbb7ae 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.11' # The full version, including alpha/beta/rc tags. -release = '0.11.0a' +release = '0.11.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 333a0faf0bea4a6a2af98232aba31463cc1a10e5 Mon Sep 17 00:00:00 2001 From: James Wyles Date: Tue, 24 Dec 2019 13:14:12 -0700 Subject: [PATCH 038/384] Udated api.rst to add ECG --- docs/source/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index ffbf5b71f..df9119fd7 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -56,6 +56,13 @@ Louvain :members: :undoc-members: +ECG +--- + +.. automodule:: cugraph.community.ecg + :members: + :undoc-members: + Spectral Clustering ------------------- From ee212c55edc53a32c65785ebafec5d964eca1167 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 16 Jan 2020 19:05:56 -0500 Subject: [PATCH 039/384] DOC Updates for v0.13 --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index ffede64e5..66efcc45d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.12' +version = '0.13' # The full version, including alpha/beta/rc tags. -release = '0.12.0a' +release = '0.13.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From ec47da79b53e98e88cd04fbc303eb1871f67d0a7 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Tue, 4 Feb 2020 10:35:14 -0800 Subject: [PATCH 040/384] REL v0.12.0 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index ffede64e5..36bbb18bd 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -67,7 +67,7 @@ # The short X.Y version. version = '0.12' # The full version, including alpha/beta/rc tags. -release = '0.12.0a' +release = '0.12.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1f5b927abd720ae99feb01d2dcbf90ffa92d41b0 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Mon, 9 Mar 2020 15:09:32 -0400 Subject: [PATCH 041/384] DOC v0.14 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 66efcc45d..ea49ca0e6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.13' +version = '0.14' # The full version, including alpha/beta/rc tags. -release = '0.13.0' +release = '0.14.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 076cb936619830b96c7d358c67b26f89dcb1ddfc Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Tue, 31 Mar 2020 10:18:22 -0700 Subject: [PATCH 042/384] REL v0.13.0 release From 15132b4dcf859c2d69d5c04e4a17727a598a35cf Mon Sep 17 00:00:00 2001 From: Chuck Hastings Date: Tue, 31 Mar 2020 17:23:06 -0400 Subject: [PATCH 043/384] update some documentation --- docs/source/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index b84d8344d..7e7c6ce7d 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -46,6 +46,13 @@ Katz Centrality :members: :undoc-members: +Betweenness Centrality +---------------------- + +.. automodule:: cugraph.centrality.betweenness_centrality + :members: + :undoc-members: + Community ========= From 7ac9dc1961bf71828c446ae803c38dfd5858bd1d Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Wed, 8 Apr 2020 01:27:40 -0500 Subject: [PATCH 044/384] Initial WIP version of updated benchmarks based on pytest-benchmark. --- benchmarks/pytest.ini | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 benchmarks/pytest.ini diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini new file mode 100644 index 000000000..920163d67 --- /dev/null +++ b/benchmarks/pytest.ini @@ -0,0 +1,17 @@ +[pytest] +addopts = + --benchmark-min-rounds=25 + --benchmark-warmup=on + --benchmark-warmup-iterations=10 + +python_classes = + Bench* + Test* + +python_files = + bench_* + test_* + +python_functions = + bench_* + test_* From f59e5de3561fb4c5b418f8e810b2583a6c669cd7 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Mon, 20 Apr 2020 12:06:04 -0400 Subject: [PATCH 045/384] Updated and replpaced cudf with cugraph --- .gitignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b30745da9..7733803bd 100644 --- a/.gitignore +++ b/.gitignore @@ -16,9 +16,9 @@ DartConfiguration.tcl ## Python build directories & artifacts htmlcov dist/ -cudf.egg-info/ +cugraph.egg-info/ python/build -python/cudf/bindings/*.cpp +python/cugraph/bindings/*.cpp ## Patching *.diff @@ -37,3 +37,6 @@ build/ datasets/* .pydevproject + +# Jupyter Notebooks +.ipynb_checkpoints \ No newline at end of file From dcfb75dfb39f5edc7e2edb12446a6db8b091460c Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 21 Apr 2020 16:23:20 -0400 Subject: [PATCH 046/384] updating list of ignored files --- .gitignore | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7733803bd..c9df7c2eb 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,20 @@ __pycache__ *.pytest_cache DartConfiguration.tcl .DS_Store - + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +junit-cugraph.xml +*.cover +.hypothesis/ +test-results + ## Python build directories & artifacts htmlcov dist/ @@ -29,14 +42,27 @@ python/cugraph/bindings/*.cpp CMakeFiles/ Debug build/ +cpp/build/ +cpp/include/cugraph/ipc_generated/*.h +cpp/thirdparty/googletest/ ## Eclipse IDE .project .cproject .settings +## IntelliJ IDE +.idea/ +.idea_modules/ +*.iml +*.ipr +*.iws + datasets/* .pydevproject # Jupyter Notebooks -.ipynb_checkpoints \ No newline at end of file +.ipynb_checkpoints + +## Doxygen +cpp/doxygen/html From 5d7f00a109d653352a468f67110bd1b52df404f4 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 24 Apr 2020 14:50:18 -0400 Subject: [PATCH 047/384] Updated text and validated execution --- docs/source/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 7e7c6ce7d..c537a74d3 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -122,7 +122,7 @@ Core Number K-Truss ------- -.. automodule:: cugraph.ktruss.ktruss_max +.. automodule:: cugraph.ktruss.ktruss_subgraph :members: :undoc-members: From 1e2148254cb89538072772117dde517ff893f227 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 24 Apr 2020 15:28:36 -0400 Subject: [PATCH 048/384] updated data location --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index c9df7c2eb..1c90a7edc 100644 --- a/.gitignore +++ b/.gitignore @@ -58,7 +58,13 @@ cpp/thirdparty/googletest/ *.ipr *.iws +## Datasets datasets/* +!datasets/cyber.csv +!datasets/karate-data.csv +!datasets/netscience.csv + + .pydevproject # Jupyter Notebooks From b97b8ce306bec339bde8e2853369f67c1a425ae2 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Mon, 27 Apr 2020 11:49:41 -0400 Subject: [PATCH 049/384] missed a dataset --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1c90a7edc..c6e81ce89 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,7 @@ cpp/thirdparty/googletest/ datasets/* !datasets/cyber.csv !datasets/karate-data.csv +!datasets/karate_undirected.csv !datasets/netscience.csv From 91ec55c8cc0bf09cdd0ddff67925a0c4f5525549 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 12 May 2020 12:36:46 -0400 Subject: [PATCH 050/384] added how to view text --- docs/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/README.md b/docs/README.md index e2654d443..10b2c265e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,3 +17,16 @@ make html Outputs to `build/html/index.html` +## View docs web page by opening HTML in browser: + +First navigate to `/build/html/` folder, i.e., `cd build/html` and then run the following command: + +```bash +python -m http.server +``` +Then, navigate a web browser to the IP address or hostname of the host machine at port 8000: + +``` +https://:8000 +``` +Now you can check if your docs edits formatted correctly, and read well. From e8fe19422fa2238e92b98f28711f61f29e546345 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 12 May 2020 13:08:04 -0400 Subject: [PATCH 051/384] updated list of features and dropped SNMG --- docs/source/api.rst | 16 +++++++++------- docs/source/conf.py | 2 +- .../{dask-cugraph.rst => dask-cugraph.rst.tmp} | 0 3 files changed, 10 insertions(+), 8 deletions(-) rename docs/source/{dask-cugraph.rst => dask-cugraph.rst.tmp} (100%) diff --git a/docs/source/api.rst b/docs/source/api.rst index c537a74d3..848318171 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -39,20 +39,21 @@ Conversion from Other Formats Centrality ========== -Katz Centrality ---------------- +Betweenness Centrality +---------------------- -.. automodule:: cugraph.centrality.katz_centrality +.. automodule:: cugraph.centrality.betweenness_centrality :members: :undoc-members: -Betweenness Centrality ----------------------- +Katz Centrality +--------------- -.. automodule:: cugraph.centrality.betweenness_centrality +.. automodule:: cugraph.centrality.katz_centrality :members: :undoc-members: + Community ========= @@ -91,6 +92,7 @@ Triangle Counting :members: :undoc-members: + Components ========== @@ -122,7 +124,7 @@ Core Number K-Truss ------- -.. automodule:: cugraph.ktruss.ktruss_subgraph +.. automodule:: cugraph.core.ktruss_subgraph :members: :undoc-members: diff --git a/docs/source/conf.py b/docs/source/conf.py index ea49ca0e6..a461e4d69 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -57,7 +57,7 @@ # General information about the project. project = 'cugraph' -copyright = '2019, NVIDIA' +copyright = '2019-2020, NVIDIA' author = 'NVIDIA' # The version info for the project you're documenting, acts as replacement for diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst.tmp similarity index 100% rename from docs/source/dask-cugraph.rst rename to docs/source/dask-cugraph.rst.tmp From ab6416c10964d8a84e9534d71737357ec78f05e5 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 12 May 2020 13:10:04 -0400 Subject: [PATCH 052/384] ki_truss --- docs/source/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 848318171..4467d8645 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -124,7 +124,7 @@ Core Number K-Truss ------- -.. automodule:: cugraph.core.ktruss_subgraph +.. automodule:: cugraph.cores.ktruss_subgraph :members: :undoc-members: From 627974e6110147b26bee4e1b8ef94c6f9a25a35d Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Tue, 12 May 2020 13:44:12 -0500 Subject: [PATCH 053/384] Updated to use new marks, enabled more benchmarks, doing additional ETL steps (pre-compute adj lists, renumber), flake8, CHANGELOG, cleanup. --- benchmarks/pytest.ini | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 920163d67..3ac22a6a7 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -1,9 +1,14 @@ [pytest] addopts = - --benchmark-min-rounds=25 --benchmark-warmup=on --benchmark-warmup-iterations=10 +markers = + ETL: benchmarks for ETL steps + small: small datasets + directed: directed datasets + undirected: undirected datasets + python_classes = Bench* Test* From 84100b2863bfc50d0757cd1218624aa32b83ca48 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 12 May 2020 16:09:28 -0400 Subject: [PATCH 054/384] extra text on manual running --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 10b2c265e..199e743cd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ # Building Documentation A basic python environment with packages listed in `./requirement.txt` is -enough to build the docs. +enough to build the docs. Doc generation does not get run by default ## Get additional dependency From 2f71cec3312b6ebcb0e030cf4824cc7bab7fa1ed Mon Sep 17 00:00:00 2001 From: Kumar Aatish Date: Wed, 13 May 2020 16:52:55 -0400 Subject: [PATCH 055/384] Moved ktruss to community in python --- docs/source/api.rst | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 4467d8645..8768b3b29 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -64,6 +64,13 @@ Louvain :members: :undoc-members: +K-Truss +------- + +.. automodule:: cugraph.community.ktruss_subgraph + :members: + :undoc-members: + ECG --- @@ -121,14 +128,6 @@ Core Number :undoc-members: -K-Truss -------- - -.. automodule:: cugraph.cores.ktruss_subgraph - :members: - :undoc-members: - - Link Analysis ============= From 77db35e557004c4d8fafeadaebc2236575ba78ed Mon Sep 17 00:00:00 2001 From: Hugo Linsenmaier Date: Fri, 8 May 2020 21:25:18 -0500 Subject: [PATCH 056/384] Add fa2 to README and doc --- docs/source/api.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index 8768b3b29..99f5f577f 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -127,6 +127,15 @@ Core Number :members: :undoc-members: +Layout +====== + +Force Atlas 2 +------------- + +.. automodule:: cugraph.layout.force_atlas_2 + :members: + :undoc-members: Link Analysis ============= From 82b11f11b4cd4ea22d3d87742afa8729ff5af1cd Mon Sep 17 00:00:00 2001 From: Hugo Linsenmaier Date: Wed, 13 May 2020 02:13:47 -0500 Subject: [PATCH 057/384] Fix typo in docs --- docs/source/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 99f5f577f..47a4e29b2 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -133,7 +133,7 @@ Layout Force Atlas 2 ------------- -.. automodule:: cugraph.layout.force_atlas_2 +.. automodule:: cugraph.layout.force_atlas2 :members: :undoc-members: From f1f0f7234b9383cb5d69d9b453fc762f4994ff3c Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 15 May 2020 13:02:51 -0500 Subject: [PATCH 058/384] UVM notebook --- notebooks/demo/twitter-2010-spark.png | Bin 0 -> 43454 bytes notebooks/demo/uvm.ipynb | 300 ++++++++++++++++++++++++++ 2 files changed, 300 insertions(+) create mode 100644 notebooks/demo/twitter-2010-spark.png create mode 100644 notebooks/demo/uvm.ipynb diff --git a/notebooks/demo/twitter-2010-spark.png b/notebooks/demo/twitter-2010-spark.png new file mode 100644 index 0000000000000000000000000000000000000000..512f6d03db7421a79a556e670abd3c36491978bd GIT binary patch literal 43454 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 literal 0 HcmV?d00001 diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb new file mode 100644 index 000000000..d80e8e523 --- /dev/null +++ b/notebooks/demo/uvm.ipynb @@ -0,0 +1,300 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Oversubscribing GPU memory in cuGraph\n", + "#### Author : Alex Fender\n", + "\n", + "In this notebook, we will show how to scale to 4x larger graphs than before without performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", + "\n", + "Unified Memory is a single memory address space accessible from any processor in a system. If a kernel tries to access any absent pages,the Page Migration Engine migrates the pages. When the GPU memory is full, least recently used pages are evicted. In other words, Unified Memory transparently enables oversubscribing GPU memory, enabling out-of-core computations.\n", + "\n", + "\n", + "This notebook was tested on an NVIDIA 48GB RTX8000 GPU using RAPIDS 0.14 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data\n", + "We will be analyzing 1.47 billion social relations on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", + "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", + "\n", + "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PageRank with cuGraph\n", + "### Basic setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries. We recommend using cugraph_dev env through conda\n", + "import time\n", + "import rmm \n", + "import cudf \n", + "import cugraph " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Twitter dataset is in our S3 bucket and zipped. \n", + "1. We'll need to create a folder for our data in the `/data` folder\n", + "1. Download the zipped data into that folder from S3 (it will take some time as it it 6GB)\n", + "1. Decompress the zipped data for use (it will take some time as it it 26GB)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import urllib.request\n", + "import os\n", + "\n", + "data_dir = '../data/twitter/'\n", + "if not os.path.exists(data_dir):\n", + " print('creating twitter data directory')\n", + " os.system('mkdir ../data/twitter')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# download the Twitter dataset\n", + "base_url = 'https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/'\n", + "fn = 'twitter-2010.csv'\n", + "comp = '.gz'\n", + "if not os.path.isfile(data_dir+fn):\n", + " if not os.path.isfile(data_dir+fn+comp):\n", + " print(f'Downloading {base_url+fn+comp} to {data_dir+fn+comp}')\n", + " urllib.request.urlretrieve(base_url+fn+comp, data_dir+fn+comp)\n", + " print(f'Decompressing {data_dir+fn+comp}...')\n", + " os.system('gunzip '+data_dir+fn+comp)\n", + " print(f'{data_dir+fn+comp} decompressed!')\n", + "else:\n", + " print(f'Your data file, {data_dir+fn}, already exists')\n", + "\n", + "# File path, assuming Notebook directory\n", + "input_data_path = data_dir+fn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize RMM\n", + "RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in RAPIDS libraries. Using RMM in python code is straightforward. Import `rmm` and configure RMM options to be used before making any call to a RAPIDS library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Set RMM to allocate all memory as managed memory (cudaMallocManaged underlying allocator)\n", + "rmm.reinitialize(managed_memory=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Read the data from disk\n", + "cuGraph depends on cudf for data loading and the initial DataFrame creation. The CSV data file contains an edge list, which represents the connection of a vertex to another. The source to destination pairs is what is known as Coordinate Format (COO). In this test case, the data is just two columns. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# CSV reader\n", + "e_list = cudf.read_csv(input_data_path, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n", + "\n", + "# Print time\n", + "print(\"Reader: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a graph\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t_start = time.time()\n", + "\n", + "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", + "G = cugraph.DiGraph()\n", + "G.from_cudf_edgelist(e_list, source='src', destination='dst', renumber=False)\n", + "\n", + "# (optional) request the transposed here so that we can analyse pagerank solver time alone\n", + "G.view_transposed_adj_list()\n", + "\n", + "# Print time\n", + "print(\"Load and transpose: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Call PageRank algorithm\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# Get the pagerank scores\n", + "pr_df = cugraph.pagerank(G, tol=1e-4)\n", + "\n", + "# Print time\n", + "print(\"Pagerank: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It was that easy! PageRank should only take a few seconds to run on this 26GB input with one GPU.
\n", + "Check out how it compares to published Spark results in the [Annex](#annex_cell)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Further analysis on the PageRank result\n", + "\n", + "We can now identify the most influent users in the network.
\n", + "Notice that the PageRank result is already in a regular `cudf.DataFrame`. We can then sort by PageRank value and print the *Top 3*." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# Sort, descending order\n", + "pr_sorted_df = pr_df.sort_values('pagerank',ascending=False)\n", + "\n", + "# Print time\n", + "print(time.time()-t_start, \"s\")\n", + "\n", + "# Print the Top 3\n", + "print(pr_sorted_df.head(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the [map](https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", + "The table below shows more information on our *Top 3*. Notice that this ranking is much better at capturing network influence compared the number of followers for instance. Further analysis of this dataset was published [here](https://doi.org/10.1145/1772690.1772751).\n", + "\n", + "| Vertex ID\t| Twitter ID\t| User name\t| Description |\n", + "| --------- | --------- | -------- | ---------- |\n", + "| 21513299\t| 813286\t| barackobama\t| US President (2009-2017) |\n", + "| 23933989\t| 14224719\t| 10DowningStreet | UK Prime Minister office |\n", + "| 23933986\t| 15131310\t| WholeFoods\t| Food store from Austin |\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Annex\n", + "\n", + "An experiment comparing various porducts for this workflow was published in *GraphX: Graph Processing in a Distributed Dataflow Framework,OSDI, 2014*. They used 16 m2.4xlarge worker nodes on Amazon EC2. There was a total of 128 CPU cores and 1TB of memory in this 2014 setup.\n", + "\n", + "![twitter-2010-spark.png](twitter-2010-spark.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2019, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From acb7e80d311ab2f70949d5fb7c3ed90b6a6b0ca5 Mon Sep 17 00:00:00 2001 From: Alex Fender Date: Fri, 15 May 2020 14:01:29 -0500 Subject: [PATCH 059/384] Update uvm.ipynb --- notebooks/demo/uvm.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index d80e8e523..cf32f6450 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -23,7 +23,7 @@ "We will be analyzing 1.47 billion social relations on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", "\n", - "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. " + "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 80GB of memory available" ] }, { From 17e895591615dd90f3e3e96e63e1af98afac445c Mon Sep 17 00:00:00 2001 From: Alex Fender Date: Fri, 15 May 2020 14:05:57 -0500 Subject: [PATCH 060/384] Update uvm.ipynb --- notebooks/demo/uvm.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index cf32f6450..44aaaa091 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -109,7 +109,7 @@ "metadata": {}, "source": [ "### Initialize RMM\n", - "RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in RAPIDS libraries. Using RMM in python code is straightforward. Import `rmm` and configure RMM options to be used before making any call to a RAPIDS library." + "RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in RAPIDS libraries. Using RMM in python code is straightforward. Simply `import rmm` and configure RMM options to be used before making any call to a RAPIDS library." ] }, { From e6ed059827650c632e2f30910cd00769e84e1e76 Mon Sep 17 00:00:00 2001 From: afender Date: Mon, 18 May 2020 11:18:17 -0500 Subject: [PATCH 061/384] addressed reviews --- notebooks/demo/uvm.ipynb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index 44aaaa091..7932b3d3f 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -74,10 +74,10 @@ "import urllib.request\n", "import os\n", "\n", - "data_dir = '../data/twitter/'\n", + "data_dir = '../data/'\n", "if not os.path.exists(data_dir):\n", - " print('creating twitter data directory')\n", - " os.system('mkdir ../data/twitter')" + " print('creating data directory')\n", + " os.system('mkdir ../data')" ] }, { @@ -119,7 +119,8 @@ "outputs": [], "source": [ "#Set RMM to allocate all memory as managed memory (cudaMallocManaged underlying allocator)\n", - "rmm.reinitialize(managed_memory=True)" + "rmm.reinitialize(managed_memory=True)\n", + "assert(rmm.is_initialized())" ] }, { @@ -267,7 +268,7 @@ "metadata": {}, "source": [ "___\n", - "Copyright (c) 2019, NVIDIA CORPORATION.\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", From 7699363ebd35aa048224041e82eefa2c77778b31 Mon Sep 17 00:00:00 2001 From: afender Date: Mon, 18 May 2020 11:29:02 -0500 Subject: [PATCH 062/384] added a couple of emphasis --- notebooks/demo/uvm.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index 7932b3d3f..2021b4c38 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -7,7 +7,7 @@ "# Oversubscribing GPU memory in cuGraph\n", "#### Author : Alex Fender\n", "\n", - "In this notebook, we will show how to scale to 4x larger graphs than before without performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", + "In this notebook, we will show how to **scale to 4x larger graphs than before** without performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", "\n", "Unified Memory is a single memory address space accessible from any processor in a system. If a kernel tries to access any absent pages,the Page Migration Engine migrates the pages. When the GPU memory is full, least recently used pages are evicted. In other words, Unified Memory transparently enables oversubscribing GPU memory, enabling out-of-core computations.\n", "\n", @@ -20,7 +20,7 @@ "metadata": {}, "source": [ "## Data\n", - "We will be analyzing 1.47 billion social relations on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", + "We will be analyzing **1.47 billion social relations** on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", "\n", "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 80GB of memory available" From f837ecf9846ee72809c32575fc1b30cc153294fd Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Mon, 18 May 2020 12:29:31 -0500 Subject: [PATCH 063/384] Updates to address review feedback: added RMM reinit code, markers, and custom option, precompute adj lists as part of setup fixtures, updated README with examples, reenabled some additional benchmarks. --- benchmarks/pytest.ini | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 3ac22a6a7..fb4e43965 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -1,9 +1,15 @@ [pytest] addopts = + -x --benchmark-warmup=on - --benchmark-warmup-iterations=10 + --benchmark-warmup-iterations=1 + --benchmark-min-rounds=3 markers = + managedmem_on: RMM managed memory enabled + managedmem_off: RMM managed memory disabled + poolallocator_on: RMM pool allocator enabled + poolallocator_off: RMM pool allocator disabled ETL: benchmarks for ETL steps small: small datasets directed: directed datasets From 2eb4e2ea023af5724c97278de984686d4b289dd5 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Wed, 20 May 2020 11:05:14 -0400 Subject: [PATCH 064/384] DOC v0.15 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index a461e4d69..41674b9b3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.14' +version = '0.15' # The full version, including alpha/beta/rc tags. -release = '0.14.0' +release = '0.15.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 77f4bb7517f90fe2d331dddb9cffa1fcf45ac31d Mon Sep 17 00:00:00 2001 From: ptaylor Date: Thu, 21 May 2020 10:04:48 -0700 Subject: [PATCH 065/384] add external repositories and raft symlinks to .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index c6e81ce89..517ceab56 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,7 @@ datasets/* ## Doxygen cpp/doxygen/html + +# Raft symlink +python/cugraph/raft +python/_external_repositories/ \ No newline at end of file From e7852204379feefe3f8d9dc6f7e9e3a05940aa5b Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 3 Jun 2020 10:02:48 -0700 Subject: [PATCH 066/384] REL v0.14.0 release From cee3014d1ddcac25b7376a2476d13a02156c2561 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 10 Jun 2020 12:30:46 -0400 Subject: [PATCH 067/384] updated script to avoid extra downloads --- notebooks/cugraph_benchmarks/dataPrep.sh | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 notebooks/cugraph_benchmarks/dataPrep.sh diff --git a/notebooks/cugraph_benchmarks/dataPrep.sh b/notebooks/cugraph_benchmarks/dataPrep.sh new file mode 100755 index 000000000..1dbc8d563 --- /dev/null +++ b/notebooks/cugraph_benchmarks/dataPrep.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +if [ ! -d "./data" ] +then + mkdir ./data +fi + +cd data + +if [ ! -f "./preferentialAttachment.mtx" ] +then + if [ ! -d "./tmp" ] + then + mkdir tmp + cd tmp + + wget -N https://sparse.tamu.edu/MM/DIMACS10/preferentialAttachment.tar.gz + wget -N https://sparse.tamu.edu/MM/DIMACS10/caidaRouterLevel.tar.gz + wget -N https://sparse.tamu.edu/MM/DIMACS10/coAuthorsDBLP.tar.gz + wget -N https://sparse.tamu.edu/MM/LAW/dblp-2010.tar.gz + wget -N https://sparse.tamu.edu/MM/DIMACS10/citationCiteseer.tar.gz + wget -N https://sparse.tamu.edu/MM/DIMACS10/coPapersDBLP.tar.gz + wget -N https://sparse.tamu.edu/MM/DIMACS10/coPapersCiteseer.tar.gz + wget -N https://sparse.tamu.edu/MM/SNAP/as-Skitter.tar.gz + + tar xvzf preferentialAttachment.tar.gz + tar xvzf caidaRouterLevel.tar.gz + tar xvzf coAuthorsDBLP.tar.gz + tar xvzf dblp-2010.tar.gz + tar xvzf citationCiteseer.tar.gz + tar xvzf coPapersDBLP.tar.gz + tar xvzf coPapersCiteseer.tar.gz + tar xvzf as-Skitter.tar.gz + + cd .. + + find ./tmp -name *.mtx -exec mv {} . \; + + rm -rf tmp + fi +fi From 9950385efe6aeff771799ccee44291110f2d7257 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 10 Jun 2020 12:31:38 -0400 Subject: [PATCH 068/384] updated text --- notebooks/cugraph_benchmarks/README.md | 108 +++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/README.md diff --git a/notebooks/cugraph_benchmarks/README.md b/notebooks/cugraph_benchmarks/README.md new file mode 100644 index 000000000..32b8a8a44 --- /dev/null +++ b/notebooks/cugraph_benchmarks/README.md @@ -0,0 +1,108 @@ +# cuGraph Benchmarking + +This folder contains a collection of graph algorithm benchmarking notebooks. Each notebook will compare one cuGraph algorithm against NetworkX and potentially other frameworks. + +_NOTE: Before any benchmarking can be done, it is important to first download the test data sets_ + + +## Getting the Data Sets + +Run the data prep script. + +```bash +sh ./dataPrep.sh +``` + +## Benchmarks + +1. Louvain +2. PageRank +3. BSF +4. SSSP + + + +The benchmark does not include data reading time, but does include: + +- Creating the Graph object +- Running the analytic + + + + + + +#### The data prep script +By default, each files would be created in its own directory. The goal here is to have all the MTX files in a single directory. + + +```bash +#!/bin/bash + +mkdir data +cd data +mkdir tmp +cd tmp + +wget https://sparse.tamu.edu/MM/DIMACS10/preferentialAttachment.tar.gz +wget https://sparse.tamu.edu/MM/DIMACS10/caidaRouterLevel.tar.gz +wget https://sparse.tamu.edu/MM/DIMACS10/coAuthorsDBLP.tar.gz +wget https://sparse.tamu.edu/MM/LAW/dblp-2010.tar.gz +wget https://sparse.tamu.edu/MM/DIMACS10/citationCiteseer.tar.gz +wget https://sparse.tamu.edu/MM/DIMACS10/coPapersDBLP.tar.gz +wget https://sparse.tamu.edu/MM/DIMACS10/coPapersCiteseer.tar.gz +wget https://sparse.tamu.edu/MM/SNAP/as-Skitter.tar.gz + +tar xvzf preferentialAttachment.tar.gz +tar xvzf caidaRouterLevel.tar.gz +tar xvzf coAuthorsDBLP.tar.gz +tar xvzf dblp-2010.tar.gz +tar xvzf citationCiteseer.tar.gz +tar xvzf coPapersDBLP.tar.gz +tar xvzf coPapersCiteseer.tar.gz +tar xvzf as-Skitter.tar.gz + +cd .. + +find ./tmp -name *.mtx -exec mv {} . \; + +rm -rf tmp +``` + + + +**About the Test files** + +| File Name | Num of Vertices | Num of Edges | Format | Graph Type | Symmetric | +| ---------------------- | --------------: | -----------: |--------|---------------------------|-------------| +| preferentialAttachment | 100,000 | 999,970 | MTX | Random Undirected Graph | Yes | +| caidaRouterLevel | 192,244 | 1,218,132 | MTX | Undirected Graph | Yes | +| coAuthorsDBLP | 299,067 | 1,955,352 |MTX | Undirected Graph | Yes | +| dblp-2010 | 326,186 | 1,615,400 | MTX | Undirected Graph | Yes | +| citationCiteseer | 268,495 | 2,313,294 | MTX | Undirected Graph | Yes | +| coPapersDBLP | 540,486 | 30,491,458 | MTX | Undirected Graph | Yes | +| coPapersCiteseer | 434,102 | 32,073,440 | MTX | Undirected Graph | Yes | +| as-Skitter | 1,696,415 | 22,190,596 | MTX | Undirected Graph | Yes | + + + +### Dataset Acknowlegments + +The dataset are downloaded from the Texas A&M SuiteSparse Matrix Collection + +``` +The SuiteSparse Matrix Collection (formerly known as the University of Florida Sparse Matrix Collection), is a large and actively growing set of sparse matrices that arise in real applications. +... +The Collection is hosted here, and also mirrored at the University of Florida at www.cise.ufl.edu/research/sparse/matrices. The Collection is maintained by Tim Davis, Texas A&M University (email: davis@tamu.edu), Yifan Hu, Yahoo! Labs, and Scott Kolodziej, Texas A&M University. +``` + +| File Name | Author | +| ---------------------- |----------------| +| preferentialAttachment | H. Meyerhenke | +| caidaRouterLevel | Unknown | +| coAuthorsDBLP | R. Geisberger, P. Sanders, and D. Schultes | +| dblp-2010 | Laboratory for Web Algorithmics (LAW), | +| citationCiteseer | R. Geisberger, P. Sanders, and D. Schultes | +| coPapersDBLP | R. Geisberger, P. Sanders, and D. Schultes | +| coPapersCiteseer | R. Geisberger, P. Sanders, and D. Schultes | +| as-Skitter | J. Leskovec, J. Kleinberg and C. Faloutsos | From a6be407997769bd194b072d7a5fd7ec04eadb3ec Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 10 Jun 2020 16:49:50 -0400 Subject: [PATCH 069/384] bfs benchmark --- .../cugraph_benchmarks/bfs_benchmark.ipynb | 440 ++++++++++++++++++ 1 file changed, 440 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/bfs_benchmark.ipynb diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb new file mode 100644 index 000000000..41262ee5d --- /dev/null +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -0,0 +1,440 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# BFS Performance Benchmarking\n", + "\n", + "This notebook benchmarks performance of running BFS within cuGraph against NetworkX. \n", + "\n", + "Notebook Credits\n", + "\n", + " Original Authors: Bradley Rees\n", + " Last Edit: 06/10/2020\n", + " \n", + "RAPIDS Versions: 0.15\n", + "\n", + "Test Hardware\n", + "\n", + " GV100 32G, CUDA 10.2\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test Data\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "|:---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| caidaRouterLevel | 192,244 | 1,218,132 |\n", + "| coAuthorsDBLP | 299,067 | 1,955,352 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| citationCiteseer | 268,495 | 2,313,294 |\n", + "| coPapersDBLP | 540,486 | 30,491,458 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Timing \n", + "What is not timed: Reading the data

\n", + "What is timmed: (1) creating a Graph, (2) running BSF\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NOTICE:\n", + "You must have run the dataPrep script prior to running this notebook so that the data is downloaded\n", + "\n", + "See the README file in this folder for a discription of how to get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have more than one GPU, set the GPU to use\n", + "This is not needed on a Single GPU system or if the default GPU is to be used" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set the GPU to use\n", + "import os\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now load the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries\n", + "import gc\n", + "import time\n", + "import rmm\n", + "import cugraph\n", + "import cudf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX libraries\n", + "import networkx as nx\n", + "from scipy.io import mmread" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt; plt.rcdefaults()\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Print the name of the used GPU" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cudf._cuda.gpu.deviceGetName(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the test data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'caidaRouterLevel' : './data/caidaRouterLevel.mtx',\n", + " 'coAuthorsDBLP' : './data/coAuthorsDBLP.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'citationCiteseer' : './data/citationCiteseer.mtx',\n", + " 'coPapersDBLP' : './data/coPapersDBLP.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the testing functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", + "def read_mtx_file(mm_file):\n", + " print('Reading ' + str(mm_file) + '...')\n", + " M = mmread(mm_file).asfptype()\n", + " \n", + " return M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# CuGraph BFS\n", + "\n", + "def cugraph_call(M):\n", + "\n", + " gdf = cudf.DataFrame()\n", + " gdf['src'] = M.row\n", + " gdf['dst'] = M.col\n", + " \n", + " print('\\tcuGraph Solving... ')\n", + " \n", + " t1 = time.time()\n", + " \n", + " # cugraph Pagerank Call\n", + " G = cugraph.Graph()\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " \n", + " df = cugraph.bfs(G, 1)\n", + " t2 = time.time() - t1\n", + " \n", + " return t2\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Basic NetworkX BFS\n", + "\n", + "def networkx_call(M):\n", + " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", + " for nnz in range(M.getnnz()):\n", + " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", + " for nnz in range(M.getnnz()):\n", + " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", + "\n", + " M = M.tocsr()\n", + " if M is None:\n", + " raise TypeError('Could not read the input graph')\n", + " if M.shape[0] != M.shape[1]:\n", + " raise TypeError('Shape is not square')\n", + "\n", + " # should be autosorted, but check just to make sure\n", + " if not M.has_sorted_indices:\n", + " print('sort_indices ... ')\n", + " M.sort_indices()\n", + "\n", + " z = {k: 1.0/M.shape[0] for k in range(M.shape[0])}\n", + " \n", + " print('\\tNetworkX Solving... ')\n", + " \n", + " # start timer\n", + " t1 = time.time()\n", + " \n", + " Gnx = nx.DiGraph(M)\n", + "\n", + " pr = nx.bfs_edges(Gnx, 1)\n", + " \n", + " t2 = time.time() - t1\n", + "\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run the benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# arrays to capture performance gains\n", + "perf_nx = []\n", + "names = []\n", + "time_cu = []\n", + "time_nx = []\n", + "\n", + "# do a simple pass just to get all the libraries initiallized\n", + "v = './data/preferentialAttachment.mtx'\n", + "M = read_mtx_file(v)\n", + "trapids = cugraph_call(M)\n", + "del M\n", + "\n", + "for k,v in data.items():\n", + " gc.collect()\n", + "\n", + " # Saved the file Name\n", + " names.append(k)\n", + " \n", + " # read the data\n", + " M = read_mtx_file(v)\n", + " \n", + " \n", + " # call cuGraph - this will be the baseline\n", + " trapids = cugraph_call(M)\n", + " \n", + " # Now call NetworkX\n", + " tn = networkx_call(M)\n", + " speedUp = (tn / trapids)\n", + " perf_nx.append(speedUp)\n", + " time_cu.append(trapids)\n", + " time_nx.append(tn)\n", + " del M\n", + " \n", + " print(\"\\tcuGraph (\" + str(trapids) + \") Nx (\" + str(tn) + \")\" )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "plt.figure(figsize=(11,9))\n", + "\n", + "bar_width = 0.5\n", + "index = np.arange(len(names))\n", + "\n", + "_ = plt.bar(index, perf_nx, bar_width, color='g', label='vs NetworkX')\n", + "\n", + "\n", + "\n", + "plt.xlabel('Datasets')\n", + "plt.ylabel('Speedup')\n", + "plt.title('BFS Performance Speedup')\n", + "plt.xticks(index + (bar_width/4), names)\n", + "plt.xticks(rotation=90) \n", + "\n", + "# Text on the top of each barplot\n", + "for i in range(len(perf_nx)):\n", + " plt.text(x = (i - .5) + bar_width, y = perf_nx[i] + 25, s = round(perf_nx[i], 1), size = 12)\n", + "\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dump the raw data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# print the speed-up numbers\n", + "perf_nx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# print the cuGraph runtimes\n", + "time_cu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# print the NetworkX runtimes\n", + "time_nx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From b42a8b6956bc2e6f2e4ade14610357c08c86cea5 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 10 Jun 2020 18:02:55 -0400 Subject: [PATCH 070/384] benchmark notebooks --- .../louvain_benchmark.ipynb | 466 ++++++++++++++++ .../pagerank_benchmark.ipynb | 510 ++++++++++++++++++ .../cugraph_benchmarks/sssp_benchmark.ipynb | 415 ++++++++++++++ 3 files changed, 1391 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/louvain_benchmark.ipynb create mode 100644 notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb create mode 100644 notebooks/cugraph_benchmarks/sssp_benchmark.ipynb diff --git a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb new file mode 100644 index 000000000..c427996a2 --- /dev/null +++ b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb @@ -0,0 +1,466 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Louvain Performance Benchmarking\n", + "\n", + "This notebook benchmarks performance improvement of running the Louvain clustering algorithm within cuGraph against NetworkX. The test is run over eight test networks (graphs) and then results plotted. \n", + "

\n", + "\n", + "\n", + "#### Notebook Credits\n", + "\n", + " Original Authors: Bradley Rees\n", + " Last Edit: 06/10/2020\n", + "\n", + "\n", + "#### Test Environment\n", + "\n", + " RAPIDS Versions: 0.15\n", + "\n", + " Test Hardware:\n", + " GV100 32G, CUDA 10,0\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + "\n", + "\n", + "\n", + "#### Updates\n", + "- moved loading ploting libraries to front so that dependencies can be checked before running algorithms\n", + "- added edge values \n", + "- changed timing to including Graph creation for both cuGraph and NetworkX. This will better represent end-to-end times\n", + "\n", + "\n", + "\n", + "#### Dependencies\n", + "- RAPIDS cuDF and cuGraph version 0.6.0 \n", + "- NetworkX \n", + "- Matplotlib \n", + "- Scipy \n", + "- data prep script run\n", + "\n", + "\n", + "\n", + "#### Note: Comparison against published results\n", + "\n", + "\n", + "The cuGraph blog post included performance numbers that were collected over a year ago. For the test graphs, int32 values are now used. That improves GPUs performance. Additionally, the initial benchamrks were measured on a P100 GPU. \n", + "\n", + "This test only comparse the modularity scores and a success is if the scores are within 15% of each other. That comparison is done by adjusting the NetworkX modularity score and then verifying that the cuGraph score is higher.\n", + "\n", + "cuGraph did a full validation of NetworkX results against cuGraph results. That included cross-validation of every cluster. That test is very slow and not included here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have more than one GPU, set the GPU to use\n", + "This is not needed on a Single GPU system or if the default GPU is to be used" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wed Jun 10 17:38:29 2020 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 440.64.00 Driver Version: 440.64.00 CUDA Version: 10.2 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "|===============================+======================+======================|\n", + "| 0 GeForce GT 710 On | 00000000:03:00.0 N/A | N/A |\n", + "| 50% 44C P8 N/A / N/A | 374MiB / 1998MiB | N/A Default |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 Quadro GV100 On | 00000000:04:00.0 Off | Off |\n", + "| 33% 45C P2 28W / 250W | 1MiB / 32508MiB | 0% Default |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 2 Quadro GP100 On | 00000000:84:00.0 Off | Off |\n", + "| 28% 44C P0 27W / 235W | 2MiB / 16278MiB | 0% Default |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: GPU Memory |\n", + "| GPU PID Type Process name Usage |\n", + "|=============================================================================|\n", + "| 0 Not Supported |\n", + "+-----------------------------------------------------------------------------+\n", + "WARNING: infoROM is corrupted at gpu 0000:04:00.0\n", + "WARNING: infoROM is corrupted at gpu 0000:84:00.0\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# since this is a shared machine - let's pick a GPU that no one else is using\n", + "import os\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now load the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries\n", + "import time\n", + "import cugraph\n", + "import cudf\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX libraries\n", + "import networkx as nx\n", + "from scipy.io import mmread" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX libraries\n", + "try: \n", + " import community\n", + "except ModuleNotFoundError:\n", + " os.system('pip install python-louvain')\n", + " import community" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Loading plotting libraries\n", + "import matplotlib.pyplot as plt; plt.rcdefaults()\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Quadro GV100'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Print out GPU Name\n", + "cudf._cuda.gpu.deviceGetName(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the test data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'caidaRouterLevel' : './data/caidaRouterLevel.mtx',\n", + " 'coAuthorsDBLP' : './data/coAuthorsDBLP.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'citationCiteseer' : './data/citationCiteseer.mtx',\n", + " 'coPapersDBLP' : './data/coPapersDBLP.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the testing functions" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Read in a dataset in MTX format \n", + "def read_mtx_file(mm_file):\n", + " print('Reading ' + str(mm_file) + '...')\n", + " M = mmread(mm_file).asfptype()\n", + " \n", + " return M" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Run the cuGraph Louvain analytic (using nvGRAPH function)\n", + "def cugraph_call(M):\n", + "\n", + " t1 = time.time()\n", + "\n", + " # data\n", + " gdf = cudf.DataFrame()\n", + " gdf['src'] = M.row\n", + " gdf['dst'] = M.col\n", + " \n", + " # create graph \n", + " G = cugraph.Graph()\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " \n", + " # cugraph Louvain Call\n", + " print(' cuGraph Solving... ')\n", + " df, mod = cugraph.louvain(G) \n", + " \n", + " t2 = time.time() - t1\n", + " return t2, mod\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Run the NetworkX Louvain analytic. THis is done in two parts since the modularity score is not returned \n", + "def networkx_call(M):\n", + " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", + " for nnz in range(M.getnnz()):\n", + " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", + " for nnz in range(M.getnnz()):\n", + " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", + "\n", + " M = M.tocsr()\n", + " if M is None:\n", + " raise TypeError('Could not read the input graph')\n", + " if M.shape[0] != M.shape[1]:\n", + " raise TypeError('Shape is not square')\n", + " \n", + " t1 = time.time()\n", + "\n", + " # Directed NetworkX graph\n", + " Gnx = nx.Graph(M)\n", + "\n", + " # Networkx \n", + " print(' NetworkX Solving... ')\n", + " parts = community.best_partition(Gnx)\n", + " \n", + " # Calculating modularity scores for comparison \n", + " mod = community.modularity(parts, Gnx) \n", + " \n", + " t2 = time.time() - t1\n", + " \n", + " return t2, mod" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run the benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + " cuGraph Solving... \n", + "Reading ./data/preferentialAttachment.mtx...\n", + " cuGraph Solving... \n", + " NetworkX Solving... \n" + ] + } + ], + "source": [ + "# Loop through each test file and compute the speedup\n", + "perf = []\n", + "names = []\n", + "time_cu = []\n", + "time_nx = []\n", + "\n", + "#init libraries by doing quick pass\n", + "v = './data/preferentialAttachment.mtx'\n", + "M = read_mtx_file(v)\n", + "trapids = cugraph_call(M)\n", + "del M\n", + "\n", + "\n", + "for k,v in data.items():\n", + " M = read_mtx_file(v)\n", + " tr, modc = cugraph_call(M)\n", + " tn, modx = networkx_call(M)\n", + " \n", + " speedUp = (tn / tr)\n", + " names.append(k)\n", + " perf.append(speedUp)\n", + " time_cu.append(tr)\n", + " time_nx.append(tn)\n", + " # mod_delta = (0.85 * modx)\n", + " \n", + " print(str(speedUp) + \"x faster => cugraph \" + str(tr) + \" vs \" + str(tn))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### plot the output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "y_pos = np.arange(len(names))\n", + " \n", + "plt.bar(y_pos, perf, align='center', alpha=0.5)\n", + "plt.xticks(y_pos, names)\n", + "plt.ylabel('Speed Up')\n", + "plt.title('Performance Speedup: cuGraph vs NetworkX')\n", + "plt.xticks(rotation=90) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dump the raw stats" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "perf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_cu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_nx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb new file mode 100644 index 000000000..d8d149aaa --- /dev/null +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -0,0 +1,510 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PageRank Performance Benchmarking\n", + "\n", + "This notebook benchmarks performance of running PageRank within cuGraph against NetworkX. NetworkX contains several implementations of PageRank. This benchmark will compare cuGraph versus the defaukt Nx implementation as well as the SciPy version\n", + "\n", + "Notebook Credits\n", + "\n", + " Original Authors: Bradley Rees\n", + " Last Edit: 06/10/2019\n", + " \n", + "RAPIDS Versions: 0.15\n", + "\n", + "Test Hardware\n", + "\n", + " GV100 32G, CUDA 10,0\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test Data\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "|:---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| caidaRouterLevel | 192,244 | 1,218,132 |\n", + "| coAuthorsDBLP | 299,067 | 1,955,352 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| citationCiteseer | 268,495 | 2,313,294 |\n", + "| coPapersDBLP | 540,486 | 30,491,458 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Timing \n", + "What is not timed: Reading the data\n", + "\n", + "What is timmed: (1) creating a Graph, (2) running PageRank\n", + "\n", + "The data file is read in once for all flavors of PageRank. Each timed block will craete a Graph and then execute the algorithm. The results of the algorithm are not compared. If you are interested in seeing the comparison of results, then please see PageRank in the __notebooks__ repo. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NOTICE\n", + "_You must have run the __dataPrep__ script prior to running this notebook so that the data is downloaded_\n", + "\n", + "See the README file in this folder for a discription of how to get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have more than one GPU, set the GPU to use\n", + "This is not needed on a Single GPU system or if the default GPU is to be used" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# since this is a shared machine - let's pick a GPU that no one else is using\n", + "import os\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now load the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries\n", + "import gc\n", + "import time\n", + "import rmm\n", + "import cugraph\n", + "import cudf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX libraries\n", + "import networkx as nx\n", + "from scipy.io import mmread" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt; plt.rcdefaults()\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Print out GPU Name\n", + "cudf._cuda.gpu.deviceGetName(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the test data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'caidaRouterLevel' : './data/caidaRouterLevel.mtx',\n", + " 'coAuthorsDBLP' : './data/coAuthorsDBLP.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'citationCiteseer' : './data/citationCiteseer.mtx',\n", + " 'coPapersDBLP' : './data/coPapersDBLP.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the testing functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", + "def read_mtx_file(mm_file):\n", + " print('Reading ' + str(mm_file) + '...')\n", + " M = mmread(mm_file).asfptype()\n", + " \n", + " return M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# CuGraph PageRank\n", + "\n", + "def cugraph_call(M, max_iter, tol, alpha):\n", + "\n", + " gdf = cudf.DataFrame()\n", + " gdf['src'] = M.row\n", + " gdf['dst'] = M.col\n", + " \n", + " print('\\tcuGraph Solving... ')\n", + " \n", + " t1 = time.time()\n", + " \n", + " # cugraph Pagerank Call\n", + " G = cugraph.Graph()\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " \n", + " df = cugraph.pagerank(G, alpha=alpha, max_iter=max_iter, tol=tol)\n", + " t2 = time.time() - t1\n", + " \n", + " return t2\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Basic NetworkX PageRank\n", + "\n", + "def networkx_call(M, max_iter, tol, alpha):\n", + " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", + " for nnz in range(M.getnnz()):\n", + " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", + " for nnz in range(M.getnnz()):\n", + " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", + "\n", + " M = M.tocsr()\n", + " if M is None:\n", + " raise TypeError('Could not read the input graph')\n", + " if M.shape[0] != M.shape[1]:\n", + " raise TypeError('Shape is not square')\n", + "\n", + " # should be autosorted, but check just to make sure\n", + " if not M.has_sorted_indices:\n", + " print('sort_indices ... ')\n", + " M.sort_indices()\n", + "\n", + " z = {k: 1.0/M.shape[0] for k in range(M.shape[0])}\n", + " \n", + " print('\\tNetworkX Solving... ')\n", + " \n", + " # start timer\n", + " t1 = time.time()\n", + " \n", + " Gnx = nx.DiGraph(M)\n", + "\n", + " pr = nx.pagerank(Gnx, alpha, z, max_iter, tol)\n", + " \n", + " t2 = time.time() - t1\n", + "\n", + " return t2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# SciPy PageRank\n", + "\n", + "def networkx_scipy_call(M, max_iter, tol, alpha):\n", + " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", + " for nnz in range(M.getnnz()):\n", + " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", + " for nnz in range(M.getnnz()):\n", + " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", + "\n", + " M = M.tocsr()\n", + " if M is None:\n", + " raise TypeError('Could not read the input graph')\n", + " if M.shape[0] != M.shape[1]:\n", + " raise TypeError('Shape is not square')\n", + "\n", + " # should be autosorted, but check just to make sure\n", + " if not M.has_sorted_indices:\n", + " print('sort_indices ... ')\n", + " M.sort_indices()\n", + "\n", + " z = {k: 1.0/M.shape[0] for k in range(M.shape[0])}\n", + "\n", + " # SciPy Pagerank Call\n", + " print('\\tSciPy Solving... ')\n", + " t1 = time.time()\n", + " \n", + " Gnx = nx.DiGraph(M) \n", + " \n", + " pr = nx.pagerank_scipy(Gnx, alpha, z, max_iter, tol)\n", + " t2 = time.time() - t1\n", + "\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run the benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# arrays to capture performance gains\n", + "time_cu = []\n", + "time_nx = []\n", + "time_sp = []\n", + "perf_nx = []\n", + "perf_sp = []\n", + "names = []\n", + "\n", + "# init libraries by doing a simple task \n", + "v = './data/preferentialAttachment.mtx'\n", + "M = read_mtx_file(v)\n", + "trapids = cugraph_call(M, 100, 0.00001, 0.85)\n", + "del M\n", + "\n", + "\n", + "for k,v in data.items():\n", + " gc.collect()\n", + "\n", + " # Saved the file Name\n", + " names.append(k)\n", + " \n", + " # read the data\n", + " M = read_mtx_file(v)\n", + " \n", + " # call cuGraph - this will be the baseline\n", + " trapids = cugraph_call(M, 100, 0.00001, 0.85)\n", + " time_cu.append(trapids)\n", + " \n", + " # Now call NetworkX\n", + " tn = networkx_call(M, 100, 0.00001, 0.85)\n", + " speedUp = (tn / trapids)\n", + " perf_nx.append(speedUp)\n", + " time_nx.append(tn)\n", + " \n", + " # Now call SciPy\n", + " tsp = networkx_scipy_call(M, 100, 0.00001, 0.85)\n", + " speedUp = (tsp / trapids)\n", + " perf_sp.append(speedUp) \n", + " time_sp.append(tsp)\n", + " \n", + " print(\"cuGraph (\" + str(trapids) + \") Nx (\" + str(tn) + \") SciPy (\" + str(tsp) + \")\" )\n", + " del M" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### plot the output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "bar_width = 0.35\n", + "index = np.arange(len(names))\n", + "\n", + "_ = plt.bar(index, perf_nx, bar_width, color='g', label='vs Nx')\n", + "_ = plt.bar(index + bar_width, perf_sp, bar_width, color='b', label='vs SciPy')\n", + "\n", + "plt.xlabel('Datasets')\n", + "plt.ylabel('Speedup')\n", + "plt.title('PageRank Performance Speedup')\n", + "plt.xticks(index + (bar_width / 2), names)\n", + "plt.xticks(rotation=90) \n", + "\n", + "# Text on the top of each barplot\n", + "for i in range(len(perf_nx)):\n", + " plt.text(x = (i - 0.55) + bar_width, y = perf_nx[i] + 25, s = round(perf_nx[i], 1), size = 12)\n", + "\n", + "for i in range(len(perf_sp)):\n", + " plt.text(x = (i - 0.1) + bar_width, y = perf_sp[i] + 25, s = round(perf_sp[i], 1), size = 12)\n", + "\n", + "\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dump the raw stats" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "perf_nx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "perf_sp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_cu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_nx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_sp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb new file mode 100644 index 000000000..91cb0509f --- /dev/null +++ b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SSSP Performance Benchmarking\n", + "\n", + "This notebook benchmarks performance of running SSSP within cuGraph against NetworkX. \n", + "\n", + "Notebook Credits\n", + "\n", + " Original Authors: Bradley Rees\n", + " Last Edit: 06/10/2020\n", + " \n", + "RAPIDS Versions: 0.15\n", + "\n", + "Test Hardware\n", + "\n", + " GV100 32G, CUDA 10,0\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test Data\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "|:---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| caidaRouterLevel | 192,244 | 1,218,132 |\n", + "| coAuthorsDBLP | 299,067 | 1,955,352 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| citationCiteseer | 268,495 | 2,313,294 |\n", + "| coPapersDBLP | 540,486 | 30,491,458 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Timing \n", + "What is not timed: Reading the data\n", + "\n", + "What is timmed: (1) creating a Graph, (2) running SSSP\n", + "\n", + "The data file is read and used for both cuGraph and NetworkX. Each timed block will craete a Graph and then execute the algorithm. The results of the algorithm are not compared. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NOTICE\n", + "You must have run the dataPrep script prior to running this notebook so that the data is downloaded\n", + "\n", + "See the README file in this folder for a discription of how to get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you have more than one GPU, set the GPU to use\n", + "This is not needed on a Single GPU system or if the default GPU is to be used" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# since this is a shared machine - let's pick a GPU that no one else is using\n", + "import os\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now load the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries\n", + "import gc\n", + "import time\n", + "import rmm\n", + "import cugraph\n", + "import cudf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX libraries\n", + "import networkx as nx\n", + "from scipy.io import mmread" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt; plt.rcdefaults()\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the test data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'caidaRouterLevel' : './data/caidaRouterLevel.mtx',\n", + " 'coAuthorsDBLP' : './data/coAuthorsDBLP.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'citationCiteseer' : './data/citationCiteseer.mtx',\n", + " 'coPapersDBLP' : './data/coPapersDBLP.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the testing functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", + "def read_mtx_file(mm_file):\n", + " print('Reading ' + str(mm_file) + '...')\n", + " M = mmread(mm_file).asfptype()\n", + " \n", + " return M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# CuGraph SSSP\n", + "\n", + "def cugraph_call(M):\n", + "\n", + " gdf = cudf.DataFrame()\n", + " gdf['src'] = M.row\n", + " gdf['dst'] = M.col\n", + " \n", + " print('\\tcuGraph Solving... ')\n", + " \n", + " t1 = time.time()\n", + " \n", + " # cugraph SSSP Call\n", + " G = cugraph.Graph()\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " \n", + " df = cugraph.sssp(G, 1)\n", + " t2 = time.time() - t1\n", + " \n", + " return t2\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Basic NetworkX SSSP\n", + "\n", + "def networkx_call(M):\n", + " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", + " for nnz in range(M.getnnz()):\n", + " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", + " for nnz in range(M.getnnz()):\n", + " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", + "\n", + " M = M.tocsr()\n", + " if M is None:\n", + " raise TypeError('Could not read the input graph')\n", + " if M.shape[0] != M.shape[1]:\n", + " raise TypeError('Shape is not square')\n", + "\n", + " # should be autosorted, but check just to make sure\n", + " if not M.has_sorted_indices:\n", + " print('sort_indices ... ')\n", + " M.sort_indices()\n", + "\n", + " z = {k: 1.0/M.shape[0] for k in range(M.shape[0])}\n", + " \n", + " print('\\tNetworkX Solving... ')\n", + " \n", + " # start timer\n", + " t1 = time.time()\n", + " \n", + " Gnx = nx.DiGraph(M)\n", + "\n", + " pr = nx.shortest_path(Gnx, 1)\n", + " \n", + " t2 = time.time() - t1\n", + "\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run the benchmarks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# arrays to capture performance gains\n", + "perf_nx = []\n", + "names = []\n", + "\n", + "time_cu = []\n", + "time_nx = []\n", + "\n", + "#init libraries by doing quick pass\n", + "v = './data/preferentialAttachment.mtx'\n", + "M = read_mtx_file(v)\n", + "trapids = cugraph_call(M)\n", + "del M\n", + "\n", + "for k,v in data.items():\n", + " gc.collect()\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + " \n", + " # read the data\n", + " M = read_mtx_file(v)\n", + " \n", + " # call cuGraph - this will be the baseline\n", + " trapids = cugraph_call(M)\n", + " \n", + " # Now call NetworkX\n", + " tn = networkx_call(M)\n", + " speedUp = (tn / trapids)\n", + " perf_nx.append(speedUp)\n", + " time_cu.append(trapids)\n", + " time_nx.append(tn)\n", + " \n", + " print(\"\\tcuGraph (\" + str(trapids) + \") Nx (\" + str(tn) + \")\" )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "bar_width = 0.4\n", + "index = np.arange(len(names))\n", + "\n", + "_ = plt.bar(index, perf_nx, bar_width, color='g', label='vs Nx')\n", + "\n", + "plt.xlabel('Datasets')\n", + "plt.ylabel('Speedup')\n", + "plt.title('SSSP Performance Speedup of cuGraph vs NetworkX')\n", + "plt.xticks(index, names)\n", + "plt.xticks(rotation=90) \n", + "\n", + "# Text on the top of each barplot\n", + "for i in range(len(perf_nx)):\n", + " #plt.text(x = (i - 0.6) + bar_width, y = perf_nx[i] + 25, s = round(perf_nx[i], 1), size = 12)\n", + " plt.text(x = i - (bar_width/2), y = perf_nx[i] + 25, s = round(perf_nx[i], 1), size = 12)\n", + "\n", + "#plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dump the raw data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "perf_nx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_cu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_nx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 8c95b19e3f313ccbed2ced10390fdbaf56c1dab5 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 11 Jun 2020 17:57:54 -0400 Subject: [PATCH 071/384] updated to use DiGraph --- notebooks/cugraph_benchmarks/bfs_benchmark.ipynb | 2 +- notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb | 2 +- notebooks/cugraph_benchmarks/sssp_benchmark.ipynb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb index 41262ee5d..f5580691d 100644 --- a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -226,7 +226,7 @@ " t1 = time.time()\n", " \n", " # cugraph Pagerank Call\n", - " G = cugraph.Graph()\n", + " G = cugraph.DiGraph()\n", " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", " \n", " df = cugraph.bfs(G, 1)\n", diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb index d8d149aaa..cb2f5ed0d 100644 --- a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -223,7 +223,7 @@ " t1 = time.time()\n", " \n", " # cugraph Pagerank Call\n", - " G = cugraph.Graph()\n", + " G = cugraph.DiGraph()\n", " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", " \n", " df = cugraph.pagerank(G, alpha=alpha, max_iter=max_iter, tol=tol)\n", diff --git a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb index 91cb0509f..2d040e0ac 100644 --- a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb @@ -213,7 +213,7 @@ " t1 = time.time()\n", " \n", " # cugraph SSSP Call\n", - " G = cugraph.Graph()\n", + " G = cugraph.DiGraph()\n", " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", " \n", " df = cugraph.sssp(G, 1)\n", From 4d6a96dc1de4e379e55d48c98b01f5183dd5c664 Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Thu, 11 Jun 2020 23:05:46 -0500 Subject: [PATCH 072/384] Simplified --no-rmm-reinit to use existing markers instead of modifying fixture params directly (this also means all runs always have the same number of params, which helps reporting), updated ini file to only show common columns in report by default, remove -x from default options to work better with nightly runs. --- benchmarks/pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index fb4e43965..7096c677b 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -1,9 +1,9 @@ [pytest] addopts = - -x --benchmark-warmup=on --benchmark-warmup-iterations=1 --benchmark-min-rounds=3 + --benchmark-columns="min, max, mean, stddev, outliers, gpu_mem, rounds" markers = managedmem_on: RMM managed memory enabled From 5e0ddfc1e2c2cf7e5e4eed02138dae2db8b4730b Mon Sep 17 00:00:00 2001 From: ptaylor Date: Thu, 25 Jun 2020 14:35:57 -0700 Subject: [PATCH 073/384] add dask-worker-space to gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 517ceab56..30bcd5a84 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,7 @@ cpp/doxygen/html # Raft symlink python/cugraph/raft -python/_external_repositories/ \ No newline at end of file +python/_external_repositories/ + +# created by Dask tests +python/dask-worker-space From c0bbaa41f3ed67d7d57b8ebca7df1e67535915ea Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 26 Jun 2020 13:03:32 -0500 Subject: [PATCH 074/384] print_env.sh update --- print_env.sh | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/print_env.sh b/print_env.sh index ddb36bc65..ede280611 100644 --- a/print_env.sh +++ b/print_env.sh @@ -1,13 +1,16 @@ #!/usr/bin/env bash # Reports relevant environment information useful for diagnosing and -# debugging cuGraph issues. +# debugging cuDF issues. # Usage: # "./print_env.sh" - prints to stdout # "./print_env.sh > env.txt" - prints to file "env.txt" +print_env() { echo "**git***" if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]; then git log --decorate -n 1 +echo "**git submodules***" +git submodule status --recursive else echo "Not inside a git repository" fi @@ -27,19 +30,19 @@ lscpu echo echo "***CMake***" -which cmake && cmake --version +which cmake && cmake --version echo echo "***g++***" -which g++ && g++ --version +which g++ && g++ --version echo echo "***nvcc***" -which nvcc && nvcc --version +which nvcc && nvcc --version echo echo "***Python***" -which python && python --version +which python && python -c "import sys; print('Python {0}.{1}.{2}'.format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))" echo echo "***Environment Variables***" @@ -62,7 +65,7 @@ echo # Print conda packages if conda exists if type "conda" &> /dev/null; then echo '***conda packages***' -which conda && conda list +which conda && conda list echo # Print pip packages if pip exists elif type "pip" &> /dev/null; then @@ -74,3 +77,11 @@ else echo "conda not found" echo "pip not found" fi +} + +echo "

Click here to see environment details
"
+echo "     "
+print_env | while read -r line; do
+    echo "     $line"
+done
+echo "
" \ No newline at end of file From 72e14de3f3d56c152bc6881bbd78da6cea4b4761 Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 26 Jun 2020 13:10:18 -0500 Subject: [PATCH 075/384] typo --- print_env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/print_env.sh b/print_env.sh index ede280611..27b94563b 100644 --- a/print_env.sh +++ b/print_env.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Reports relevant environment information useful for diagnosing and -# debugging cuDF issues. +# debugging cuGraph issues. # Usage: # "./print_env.sh" - prints to stdout # "./print_env.sh > env.txt" - prints to file "env.txt" From 114ec535e589a90a8e7fbb5082b26ffc443f8106 Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 26 Jun 2020 13:11:34 -0500 Subject: [PATCH 076/384] EOF --- print_env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/print_env.sh b/print_env.sh index 27b94563b..6f2d33b0e 100644 --- a/print_env.sh +++ b/print_env.sh @@ -84,4 +84,4 @@ echo " " print_env | while read -r line; do echo " $line" done -echo "" \ No newline at end of file +echo "" From 88b1b9252e7c2cbb276dc5e295a77c4785a45de0 Mon Sep 17 00:00:00 2001 From: Ishika Roy Date: Sun, 28 Jun 2020 22:28:57 -0500 Subject: [PATCH 077/384] remove prints, update doc --- docs/source/dask-cugraph.rst.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/dask-cugraph.rst.tmp b/docs/source/dask-cugraph.rst.tmp index f61805227..313d34127 100644 --- a/docs/source/dask-cugraph.rst.tmp +++ b/docs/source/dask-cugraph.rst.tmp @@ -4,7 +4,7 @@ Multi-GPU with cuGraph cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. -The current solution is able to scale across multiple GPUs on a single machine. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. +The current solution is able to scale across multiple GPUs on a multiple machines. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 16 NVIDIA V100 GPUs on a DGX-2, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. From d4d52d9c4ad2d19d1df54fb3231189b9cb41298e Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Thu, 2 Jul 2020 12:01:44 -0500 Subject: [PATCH 078/384] Using yml file to disable CI check blocking instead. --- codecov.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..c0a3a2fba --- /dev/null +++ b/codecov.yml @@ -0,0 +1,5 @@ +#Configuration File for CodeCov +coverage: + status: + project: off + patch: off From 1f7a9b5b1abe6d8e3274f989813cb27f04e10c93 Mon Sep 17 00:00:00 2001 From: afender Date: Thu, 9 Jul 2020 17:50:56 -0500 Subject: [PATCH 079/384] doc --- ...{dask-cugraph.rst.tmp => dask-cugraph.rst} | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) rename docs/source/{dask-cugraph.rst.tmp => dask-cugraph.rst} (53%) diff --git a/docs/source/dask-cugraph.rst.tmp b/docs/source/dask-cugraph.rst similarity index 53% rename from docs/source/dask-cugraph.rst.tmp rename to docs/source/dask-cugraph.rst index 313d34127..4d22af4df 100644 --- a/docs/source/dask-cugraph.rst.tmp +++ b/docs/source/dask-cugraph.rst @@ -4,20 +4,22 @@ Multi-GPU with cuGraph cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. -The current solution is able to scale across multiple GPUs on a multiple machines. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. +Consolidation +============= -With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 16 NVIDIA V100 GPUs on a DGX-2, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. +cuGraph can transparently interpret the Dask cuDF Dataframe as a regular Dataframe when loading the edge list. This is particularly helpful for workflows extracting a single GPU sized edge list from a distributed dataset. From there any existing single GPU feature will just work on this input. -When to Use Multiple GPUs in cuGraph -==================================== +For instance, consolidation allows leveraging Dask cuDF CSV reader to load file(s) on multiple GPUs and consolidate this input to a single GPU graph. Reading is often the time and memory bottleneck, with this feature users can call the Multi-GPU version of the reader without changing anything else. -If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. +Distributed graph analytics +=========================== + +The current solution is able to scale across multiple GPUs on multiple machines. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. -Supported Graph Analytics -========================= +With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 16 NVIDIA V100 GPUs on a DGX-2, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. + +If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. -Pagerank --------- .. automodule:: cugraph.dask.pagerank.pagerank :members: pagerank From 58d86252cb1601b5a882413b24292df9a0c623a2 Mon Sep 17 00:00:00 2001 From: afender Date: Thu, 9 Jul 2020 17:54:47 -0500 Subject: [PATCH 080/384] doc2 --- docs/source/dask-cugraph.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst index 4d22af4df..0bcd0a233 100644 --- a/docs/source/dask-cugraph.rst +++ b/docs/source/dask-cugraph.rst @@ -20,6 +20,10 @@ With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 1 If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. +Distributed Graph Analytics Support +----------------------------------- + +Pagerank .. automodule:: cugraph.dask.pagerank.pagerank :members: pagerank From 43b838125a5482c8949f8f9fb8fcb77839f729b8 Mon Sep 17 00:00:00 2001 From: afender Date: Thu, 30 Jul 2020 17:51:57 -0500 Subject: [PATCH 081/384] doc --- docs/source/dask-cugraph.rst | 47 +++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst index 0bcd0a233..93241538b 100644 --- a/docs/source/dask-cugraph.rst +++ b/docs/source/dask-cugraph.rst @@ -2,29 +2,48 @@ Multi-GPU with cuGraph ~~~~~~~~~~~~~~~~~~~~~~ -cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. - -Consolidation -============= - -cuGraph can transparently interpret the Dask cuDF Dataframe as a regular Dataframe when loading the edge list. This is particularly helpful for workflows extracting a single GPU sized edge list from a distributed dataset. From there any existing single GPU feature will just work on this input. - -For instance, consolidation allows leveraging Dask cuDF CSV reader to load file(s) on multiple GPUs and consolidate this input to a single GPU graph. Reading is often the time and memory bottleneck, with this feature users can call the Multi-GPU version of the reader without changing anything else. +cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. The maximum graph size is currently limited to 2 Billion vertices (to be waived in the next versions). Distributed graph analytics =========================== The current solution is able to scale across multiple GPUs on multiple machines. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. -With cuGraph and Dask, whether you’re using a single NVIDIA GPU or using all 16 NVIDIA V100 GPUs on a DGX-2, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. +With cuGraph and Dask, whether you’re using a single NVIDIA GPU or multiple nodes, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. -Distributed Graph Analytics Support ------------------------------------ -Pagerank +Distributed Graph Algorithms +---------------------------- -.. automodule:: cugraph.dask.pagerank.pagerank +.. automodule:: cugraph.dask.link_analysis.pagerank :members: pagerank - :undoc-members: pagerank + :undoc-members: + +.. automodule:: cugraph.dask.traversal.bfs + :members: bfs + :undoc-members: + + +Helper functions +---------------- + +.. automodule:: cugraph.comms.comms + :members: initialize + :undoc-members: + +.. automodule:: cugraph.comms.comms + :members: destroy + :undoc-members: + +.. automodule:: cugraph.dask.common.read_utils + :members: get_chunksize + :undoc-members: + +Consolidation +============= + +cuGraph can transparently interpret the Dask cuDF Dataframe as a regular Dataframe when loading the edge list. This is particularly helpful for workflows extracting a single GPU sized edge list from a distributed dataset. From there any existing single GPU feature will just work on this input. + +For instance, consolidation allows leveraging Dask cuDF CSV reader to load file(s) on multiple GPUs and consolidate this input to a single GPU graph. Reading is often the time and memory bottleneck, with this feature users can call the Multi-GPU version of the reader without changing anything else. From 5e0a32c3d7a4a141baa3e88cc842fa22e8b05b7a Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 31 Jul 2020 14:44:56 -0500 Subject: [PATCH 082/384] notebook WIP --- notebooks/demo/mg_pagerank.ipynb | 326 +++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 notebooks/demo/mg_pagerank.ipynb diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb new file mode 100644 index 000000000..ada6a9a4c --- /dev/null +++ b/notebooks/demo/mg_pagerank.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multiple GPU in cuGraph\n", + "#### Author : Alex Fender\n", + "\n", + "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the PageRank of each user in Twitter's dataset.\n", + "\n", + "This notebook was tested on 2 NVIDIA 48GB RTX8000 GPU using RAPIDS 0.15 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "\n", + "\n", + "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data\n", + "We will be analyzing **1.47 billion social relations** on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", + "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", + "\n", + "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 80GB of memory available" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PageRank with cuGraph\n", + "### Basic setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries. We recommend using cugraph_dev env through conda\n", + "from dask.distributed import Client, wait\n", + "from dask_cuda import LocalCUDACluster\n", + "import cugraph.comms as Comms\n", + "import cugraph.dask as dask_cugraph\n", + "import dask_cudf\n", + "import time\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Twitter dataset is in our S3 bucket and zipped. \n", + "1. We'll need to create a folder for our data in the `/data` folder\n", + "1. Download the zipped data into that folder from S3 (it will take some time as it it 6GB)\n", + "1. Decompress the zipped data for use (it will take some time as it it 26GB)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib.request\n", + "import os\n", + "\n", + "data_dir = '../data/'\n", + "if not os.path.exists(data_dir):\n", + " print('creating data directory')\n", + " os.system('mkdir ../data')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# download the Twitter dataset\n", + "base_url = 'https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/'\n", + "fn = 'twitter-2010.csv'\n", + "comp = '.gz'\n", + "if not os.path.isfile(data_dir+fn):\n", + " if not os.path.isfile(data_dir+fn+comp):\n", + " print(f'Downloading {base_url+fn+comp} to {data_dir+fn+comp}')\n", + " urllib.request.urlretrieve(base_url+fn+comp, data_dir+fn+comp)\n", + " print(f'Decompressing {data_dir+fn+comp}...')\n", + " os.system('gunzip '+data_dir+fn+comp)\n", + " print(f'{data_dir+fn+comp} decompressed!')\n", + "else:\n", + " print(f'Your data file, {data_dir+fn}, already exists')\n", + "\n", + "# File path, assuming Notebook directory\n", + "input_data_path = data_dir+fn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize multi-GPU environment\n", + "Before we get started, we need to setup a Dask local cluster of workers to execute our work and a client to coordinate and schedule work for that cluster. As we see below, we can initiate a cluster and client using only 3 lines of code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "Comms.initialize()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Read the data from disk\n", + "cuGraph depends on cudf for data loading and the initial DataFrame creation. The CSV data file contains an edge list, which represents the connection of a vertex to another. The source to destination pairs is what is known as Coordinate Format (COO). In this test case, the data is just two columns. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", + "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "\n", + "# Multi-GPU CSV reader\n", + "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n", + "\n", + "# (optional) wait for the reader to complete\n", + "tmp = wait(client.compute(e_list.to_delayed()))\n", + "\n", + "# Print time\n", + "print(\"Reader: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a graph\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t_start = time.time()\n", + "\n", + "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", + "G = cugraph.DiGraph()\n", + "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst', renumber=False)\n", + "\n", + "# (optional) request the transposed here so that we can analyse pagerank solver time alone\n", + "G.compute_local_data(by='dst')\n", + "\n", + "# Print time\n", + "print(\"Load and transpose: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Call PageRank algorithm\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# Get the pagerank scores\n", + "pr_ddf = dask_cugraph.pagerank(G, tol=1e-4)\n", + "\n", + "# Print time\n", + "print(\"Pagerank: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It was that easy! PageRank should only take a few seconds to run on this 26GB input with one GPU.
\n", + "Check out how it compares to published Spark results in the [Annex](#annex_cell)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Further analysis on the PageRank result\n", + "\n", + "We can now identify the most influent users in the network.
\n", + "Notice that the PageRank result is already in a regular `cudf.DataFrame`. We can then sort by PageRank value and print the *Top 3*." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Start timer\n", + "t_start = time.time()\n", + "\n", + "# Sort, descending order\n", + "pr_sorted_df = pr_df.sort_values('pagerank',ascending=False)\n", + "\n", + "# Print time\n", + "print(time.time()-t_start, \"s\")\n", + "\n", + "# Print the Top 3\n", + "print(pr_sorted_df.head(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the [map](https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", + "The table below shows more information on our *Top 3*. Notice that this ranking is much better at capturing network influence compared the number of followers for instance. Further analysis of this dataset was published [here](https://doi.org/10.1145/1772690.1772751).\n", + "\n", + "| Vertex ID\t| Twitter ID\t| User name\t| Description |\n", + "| --------- | --------- | -------- | ---------- |\n", + "| 21513299\t| 813286\t| barackobama\t| US President (2009-2017) |\n", + "| 23933989\t| 14224719\t| 10DowningStreet | UK Prime Minister office |\n", + "| 23933986\t| 15131310\t| WholeFoods\t| Food store from Austin |\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Close multi-GPU environment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + " Comms.destroy()\n", + " client.close()\n", + " cluster.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Annex\n", + "\n", + "An experiment comparing various porducts for this workflow was published in *GraphX: Graph Processing in a Distributed Dataflow Framework,OSDI, 2014*. They used 16 m2.4xlarge worker nodes on Amazon EC2. There was a total of 128 CPU cores and 1TB of memory in this 2014 setup.\n", + "\n", + "![twitter-2010-spark.png](twitter-2010-spark.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file From 7c445e4d183d4afe8235264ec29923b7a1dc5627 Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 31 Jul 2020 15:22:17 -0500 Subject: [PATCH 083/384] notebook tested --- notebooks/demo/mg_pagerank.ipynb | 53 +++++++++++++++----------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index ada6a9a4c..e7f1acab8 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -9,7 +9,7 @@ "\n", "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the PageRank of each user in Twitter's dataset.\n", "\n", - "This notebook was tested on 2 NVIDIA 48GB RTX8000 GPU using RAPIDS 0.15 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "This notebook was tested using RAPIDS 0.15 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", "\n", "\n", "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." @@ -23,7 +23,7 @@ "We will be analyzing **1.47 billion social relations** on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", "\n", - "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 80GB of memory available" + "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system should still have at least 60GB of memory available" ] }, { @@ -45,6 +45,7 @@ "from dask_cuda import LocalCUDACluster\n", "import cugraph.comms as Comms\n", "import cugraph.dask as dask_cugraph\n", + "import cugraph\n", "import dask_cudf\n", "import time\n" ] @@ -69,7 +70,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "import urllib.request\n", @@ -78,15 +81,8 @@ "data_dir = '../data/'\n", "if not os.path.exists(data_dir):\n", " print('creating data directory')\n", - " os.system('mkdir ../data')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ + " os.system('mkdir ../data')\n", + "\n", "# download the Twitter dataset\n", "base_url = 'https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/'\n", "fn = 'twitter-2010.csv'\n", @@ -135,23 +131,20 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Start timer\n", + "# Start ETL timer\n", "t_start = time.time()\n", + "input_data_path = '/datasets/GAP/GAP-twitter.csv'\n", "\n", "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", "\n", "# Multi-GPU CSV reader\n", - "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n", - "\n", - "# (optional) wait for the reader to complete\n", - "tmp = wait(client.compute(e_list.to_delayed()))\n", - "\n", - "# Print time\n", - "print(\"Reader: \", time.time()-t_start, \"s\")" + "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n" ] }, { @@ -164,11 +157,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "t_start = time.time()\n", - "\n", "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", "G = cugraph.DiGraph()\n", "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst', renumber=False)\n", @@ -177,7 +170,7 @@ "G.compute_local_data(by='dst')\n", "\n", "# Print time\n", - "print(\"Load and transpose: \", time.time()-t_start, \"s\")" + "print(\"Read, load and transpose: \", time.time()-t_start, \"s\")" ] }, { @@ -191,15 +184,16 @@ "cell_type": "code", "execution_count": null, "metadata": { - "scrolled": true + "scrolled": true, + "tags": [] }, "outputs": [], "source": [ - "# Start timer\n", + "# Start Pagerank timer\n", "t_start = time.time()\n", "\n", "# Get the pagerank scores\n", - "pr_ddf = dask_cugraph.pagerank(G, tol=1e-4)\n", + "pr_df = dask_cugraph.pagerank(G, tol=1e-4)\n", "\n", "# Print time\n", "print(\"Pagerank: \", time.time()-t_start, \"s\")" @@ -227,7 +221,8 @@ "cell_type": "code", "execution_count": null, "metadata": { - "scrolled": true + "scrolled": true, + "tags": [] }, "outputs": [], "source": [ From 2247f19e383efa04cb13f8463ecb64945b12f2bf Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 31 Jul 2020 15:29:19 -0500 Subject: [PATCH 084/384] forgot to remove my local path --- notebooks/demo/mg_pagerank.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index e7f1acab8..9116410b5 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -138,7 +138,6 @@ "source": [ "# Start ETL timer\n", "t_start = time.time()\n", - "input_data_path = '/datasets/GAP/GAP-twitter.csv'\n", "\n", "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", From f0f4abc0e4ff969ad1c2c7e597523f5b7a0e3efb Mon Sep 17 00:00:00 2001 From: afender Date: Fri, 31 Jul 2020 15:30:26 -0500 Subject: [PATCH 085/384] fix indent --- notebooks/demo/mg_pagerank.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index 9116410b5..d333580ba 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -266,9 +266,9 @@ "metadata": {}, "outputs": [], "source": [ - " Comms.destroy()\n", - " client.close()\n", - " cluster.close()" + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" ] }, { From daf34b4d675b32ba27a49919c7b195aae6aadb56 Mon Sep 17 00:00:00 2001 From: Xavier Cadet Date: Wed, 5 Aug 2020 16:50:01 -0500 Subject: [PATCH 086/384] batch: rename, use comms, move notebook --- notebooks/demo/batch_betweenness.ipynb | 510 +++++++++++++++++++++++++ 1 file changed, 510 insertions(+) create mode 100644 notebooks/demo/batch_betweenness.ipynb diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb new file mode 100644 index 000000000..2135c7333 --- /dev/null +++ b/notebooks/demo/batch_betweenness.ipynb @@ -0,0 +1,510 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-GPU Batch Betweenness Centrality\n", + "#### Author : Xavier Cadet\n", + "In this notebook, we will compute Betweenness Centrality for vertices using cuGraph and will see how to **use Multiple GPUs to compute Betweenness Centrality scores**.\n", + "\n", + "This notebook was tested using 4 NVIDIA Tesla V100-DGX 32G GPUs, using RAPIDS 0.15, and CUDA 10.1. Please be aware that your system may be different and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "Betweennes Centrality can be slow to compute on large graphs, in order to speed up the process we can leverage multiple GPUs.\n", + "In this notebook we will showcase how it would have been done with a Single GPU approach, then we will show how it can be done using multiple GPUs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data\n", + "The soc-LiveJournal1 dataset which can be obtained on [SNAP](https://snap.stanford.edu/data/soc-LiveJournal1.html). This graph contains roughly 5 million nodes, and 70 million edges and was extracted from the LiveJournal online social network, further information can be found in:\n", + "\n", + "*Group Formation in Large Social Networks: Membership, Growth, and Evolution., L. Backstrom, D. Huttenlocher, J. Kleinberg, X. Lan., KDD, 2006.*\n", + "\n", + "and:\n", + "\n", + "*Community Structure in Large Networks: Natural Cluster Sizes and the Absence of Large Well-Defined Clusters., J. Leskovec, K. Lang, A. Dasgupta, M. Mahoney., Internet Mathematics 6(1) 29--123, 2009.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Betweenness Centrality with cuGraph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The imports:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import cugraph\n", + "import cudf\n", + "\n", + "import dask\n", + "import dask_cuda\n", + "import cugraph.comms as Comms" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import cupy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get the data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib.request\n", + "import os\n", + "\n", + "data_dir = '../data/'\n", + "if not os.path.exists(data_dir):\n", + " print('creating data directory')\n", + " os.system('mkdir ../data')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your data file, ../data/soc-LiveJournal1.txt, already exists\n" + ] + } + ], + "source": [ + "# download the soc-LiveJournal1 dataset\n", + "base_url = 'https://snap.stanford.edu/data/'\n", + "fn = 'soc-LiveJournal1.txt'\n", + "comp = '.gz'\n", + "if not os.path.isfile(data_dir + fn):\n", + " if not os.path.isfile(data_dir + fn + comp):\n", + " print(f'Downloading {base_url + fn + comp} to {data_dir + fn + comp}')\n", + " urllib.request.urlretrieve(base_url + fn + comp, data_dir + fn + comp)\n", + " print(f'Decompressing {data_dir + fn + comp}...')\n", + " os.system('gunzip ' + data_dir + fn + comp)\n", + " print(f'{data_dir + fn + comp} decompressed!')\n", + "else:\n", + " print(f'Your data file, {data_dir + fn}, already exists')\n", + "input_data_path = data_dir + fn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Single GPU" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading the Data - Single GPU\n", + "The following shows how we would read the csv file using a single GPU as it is commonly done when using a single GPU with CuGraph." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "t_start_read_sg = time.perf_counter()\n", + "e_list = cudf.read_csv(input_data_path, delimiter='\\t', names=['src', 'dst'], dtype=['int32', 'int32'])\n", + "t_stop_read_sg = time.perf_counter()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SG Read time: 1.4840830960310996s\n" + ] + } + ], + "source": [ + "print(\"SG Read time: {}s\".format(t_stop_read_sg - t_start_read_sg))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building the Graph - Single GPU\n", + "Once we read the file, we need to build the Graph, we will use a DiGraph, and use the content extracted from the .csv file as an edge list." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "t_start_build_sg = time.perf_counter()\n", + "G = cugraph.DiGraph()\n", + "G.from_cudf_edgelist(e_list, source='src', destination='dst')\n", + "t_stop_build_sg = time.perf_counter()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SG Build time: 0.43075192789547145s\n" + ] + } + ], + "source": [ + "print(\"SG Build time: {}s\".format(t_stop_build_sg - t_start_build_sg))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calling the Algorithm - Single GPU\n", + "Now that our graph is built, we can get its betweenness centrality score. Here we will use a sub-sample of 1024 sources in order to have a better approximation of the overall betweenness centrality. We set the seed for comparability with the multi GPU version that comes next." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "t_start_sg = time.perf_counter()\n", + "sg_df = cugraph.betweenness_centrality(G, k=1024, seed=123)\n", + "t_stop_sg = time.perf_counter()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SG Time elapsed: 45.48291095509194s\n" + ] + } + ], + "source": [ + "print(\"SG Time elapsed: {}s\".format(t_stop_sg - t_start_sg))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now let's use multiple GPUs!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using a Dask Cluster\n", + "In order to use multiple GPU, we need to ensure that we have Dask Cluster and Client running, further more we need to initialize the CuGraph Communicator." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "cluster = dask_cuda.LocalCUDACluster()\n", + "client = dask.distributed.Client(cluster)\n", + "Comms.initialize()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Enabling Multi GPU Batch Processing\n", + "The good thing is that with a simple `enable_mg_batch` call you can harness the power of Multiple GPUs to operate Batch Processing.\n", + "This step might take a few seconds, indeed we need to get the graph available to all GPUS, do not worry, this is only required once or when adding new representations to the graph (adjacency list for example)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", + " self.sync(self._update_scheduler_info)\n", + "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", + " self.sync(self._update_scheduler_info)\n", + "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", + " self.sync(self._update_scheduler_info)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MG Batch Enabling Time elapsed: 5.887182566104457s\n" + ] + } + ], + "source": [ + "t_start_mg = time.perf_counter()\n", + "G.enable_batch()\n", + "print(\"MG Batch Enabling Time elapsed: {}s\".format(time.perf_counter() - t_start_mg))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calling the algorithm\n", + "We call the algorithm the same way as we used to, but this time it is much faster as we leverage multiple GPUs to compute the Betweenness Centrality scores." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "t_start_mg = time.perf_counter()\n", + "batch_df = cugraph.betweenness_centrality(G, k=1024, seed=123)\n", + "t_stop_mg = time.perf_counter()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MG Time elapsed: 11.294120778795332s\n" + ] + } + ], + "source": [ + "print(\"MG Time elapsed: {}s\".format(t_stop_mg - t_start_mg))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Verification\n", + "Order in the DataFrame might vary, but scores for each vertices match, in order to display them side by side we will first sort the resluts based on the `vertex` key, and renew the DataFramee index." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "sorted_sg_df = sg_df.sort_values(\"vertex\").reset_index(drop=True)\n", + "sorted_batch_df = batch_df.sort_values(\"vertex\").reset_index(drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now compare score for each of the vertices:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cupy.allclose(sorted_sg_df[\"betweenness_centrality\"], sorted_batch_df[\"betweenness_centrality\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And just to visually compare the results we can display the DataFrames:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " betweenness_centrality vertex\n", + "0 4.586460e-06 0\n", + "1 1.715658e-04 1\n", + "2 1.361555e-05 2\n", + "3 7.880936e-06 3\n", + "4 8.486780e-06 4\n", + "... ... ...\n", + "4847566 0.000000e+00 4847566\n", + "4847567 0.000000e+00 4847567\n", + "4847568 9.186307e-07 4847568\n", + "4847569 0.000000e+00 4847569\n", + "4847570 4.984750e-08 4847570\n", + "\n", + "[4847571 rows x 2 columns]\n" + ] + } + ], + "source": [ + "print(sorted_sg_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " betweenness_centrality vertex\n", + "0 4.586460e-06 0\n", + "1 1.715658e-04 1\n", + "2 1.361555e-05 2\n", + "3 7.880936e-06 3\n", + "4 8.486780e-06 4\n", + "... ... ...\n", + "4847566 0.000000e+00 4847566\n", + "4847567 0.000000e+00 4847567\n", + "4847568 9.186307e-07 4847568\n", + "4847569 0.000000e+00 4847569\n", + "4847570 4.984750e-08 4847570\n", + "\n", + "[4847571 rows x 2 columns]\n" + ] + } + ], + "source": [ + "print(sorted_batch_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Do not forget to clear the Communicator / client /cluster if required." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 25a96a40bee69b1a80d7522da98a2c31fa704ef9 Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Wed, 5 Aug 2020 21:03:55 -0500 Subject: [PATCH 087/384] Updates to benchmarks for new renumbering API, fixes for to_directed() and to_undirected() on Graph class to properly reference renumber map when making a new instance, added quick benchmark run to test script so future benchmark breakages can be seen in CI, minor updates to comments for clarity. --- benchmarks/pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 7096c677b..06a67a060 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -12,6 +12,7 @@ markers = poolallocator_off: RMM pool allocator disabled ETL: benchmarks for ETL steps small: small datasets + tiny: tiny datasets directed: directed datasets undirected: undirected datasets From 90753bc673314f336f9e79bbf08587fc4093f04e Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 6 Aug 2020 15:37:58 -0400 Subject: [PATCH 088/384] DOC v0.16 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 41674b9b3..6b144e93c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.15' +version = '0.16' # The full version, including alpha/beta/rc tags. -release = '0.15.0' +release = '0.16.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 5a58a09e6d8747e06dbe9c54be8e2dd158a3466c Mon Sep 17 00:00:00 2001 From: Xavier Cadet Date: Fri, 7 Aug 2020 15:30:26 -0500 Subject: [PATCH 089/384] batch: add Batch Processing to docs --- docs/source/dask-cugraph.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst index 93241538b..b27ad3828 100644 --- a/docs/source/dask-cugraph.rst +++ b/docs/source/dask-cugraph.rst @@ -47,3 +47,24 @@ Consolidation cuGraph can transparently interpret the Dask cuDF Dataframe as a regular Dataframe when loading the edge list. This is particularly helpful for workflows extracting a single GPU sized edge list from a distributed dataset. From there any existing single GPU feature will just work on this input. For instance, consolidation allows leveraging Dask cuDF CSV reader to load file(s) on multiple GPUs and consolidate this input to a single GPU graph. Reading is often the time and memory bottleneck, with this feature users can call the Multi-GPU version of the reader without changing anything else. + +Batch Processing +================ + +cuGraph can leverage multi GPUs to increase processing speed for graphs that fit on a single GPU, providing faster analytics on such graphs. +You will be able to use the Graph the same way as you used to in a Single GPU environment, but analytics that support batch processing will automatically use the GPUs available to the dask client. +For example, Betweenness Centrality scores can be slow to obtain depending on the number of vertices used in the approximation. Thank to Multi GPUs Batch Processing, +you can create Single GPU graph as you would regularly do it using cuDF CSV reader, enable Batch analytics on it, and obtain scores much faster as each GPU will handle a sub-set of the sources. +In order to use Batch Analytics you need to set up a Dask Cluster and Client in addition to the cuGraph communicator, then you can simply call `enable_batch()` on you graph, and algorithms supporting batch processing will use multiple GPUs. + +Algorithms supporting Batch Processing +-------------------------------------- +.. automodule:: cugraph.centrality + :members: betweenness_centrality + :undoc-members: + :noindex: + +.. automodule:: cugraph.centrality + :members: edge_betweenness_centrality + :undoc-members: + :noindex: From 39b61df196b9aad80141db656f5c6ea408c1289e Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Sun, 16 Aug 2020 21:57:52 -0500 Subject: [PATCH 090/384] Fixes for cugraph_benchmarks notebooks to allow them to find data when run from their containing dir, updated note about renumbering in almost every notebook. --- notebooks/cugraph_benchmarks/README.md | 10 +-- notebooks/cugraph_benchmarks/data | 1 + notebooks/cugraph_benchmarks/dataPrep.sh | 2 +- .../louvain_benchmark.ipynb | 85 ++++--------------- 4 files changed, 22 insertions(+), 76 deletions(-) create mode 120000 notebooks/cugraph_benchmarks/data diff --git a/notebooks/cugraph_benchmarks/README.md b/notebooks/cugraph_benchmarks/README.md index 32b8a8a44..dc8bef4b2 100644 --- a/notebooks/cugraph_benchmarks/README.md +++ b/notebooks/cugraph_benchmarks/README.md @@ -1,6 +1,6 @@ # cuGraph Benchmarking -This folder contains a collection of graph algorithm benchmarking notebooks. Each notebook will compare one cuGraph algorithm against NetworkX and potentially other frameworks. +This folder contains a collection of graph algorithm benchmarking notebooks. Each notebook will compare one cuGraph algorithm against NetworkX and potentially other frameworks. _NOTE: Before any benchmarking can be done, it is important to first download the test data sets_ @@ -32,7 +32,7 @@ The benchmark does not include data reading time, but does include: -#### The data prep script +#### The data prep script By default, each files would be created in its own directory. The goal here is to have all the MTX files in a single directory. @@ -64,7 +64,7 @@ tar xvzf as-Skitter.tar.gz cd .. -find ./tmp -name *.mtx -exec mv {} . \; +find ./tmp -name "*.mtx" -exec mv {} . \; rm -rf tmp ``` @@ -91,9 +91,9 @@ rm -rf tmp The dataset are downloaded from the Texas A&M SuiteSparse Matrix Collection ``` -The SuiteSparse Matrix Collection (formerly known as the University of Florida Sparse Matrix Collection), is a large and actively growing set of sparse matrices that arise in real applications. +The SuiteSparse Matrix Collection (formerly known as the University of Florida Sparse Matrix Collection), is a large and actively growing set of sparse matrices that arise in real applications. ... -The Collection is hosted here, and also mirrored at the University of Florida at www.cise.ufl.edu/research/sparse/matrices. The Collection is maintained by Tim Davis, Texas A&M University (email: davis@tamu.edu), Yifan Hu, Yahoo! Labs, and Scott Kolodziej, Texas A&M University. +The Collection is hosted here, and also mirrored at the University of Florida at www.cise.ufl.edu/research/sparse/matrices. The Collection is maintained by Tim Davis, Texas A&M University (email: davis@tamu.edu), Yifan Hu, Yahoo! Labs, and Scott Kolodziej, Texas A&M University. ``` | File Name | Author | diff --git a/notebooks/cugraph_benchmarks/data b/notebooks/cugraph_benchmarks/data new file mode 120000 index 000000000..4909e06ef --- /dev/null +++ b/notebooks/cugraph_benchmarks/data @@ -0,0 +1 @@ +../data \ No newline at end of file diff --git a/notebooks/cugraph_benchmarks/dataPrep.sh b/notebooks/cugraph_benchmarks/dataPrep.sh index 1dbc8d563..b59130a98 100755 --- a/notebooks/cugraph_benchmarks/dataPrep.sh +++ b/notebooks/cugraph_benchmarks/dataPrep.sh @@ -34,7 +34,7 @@ then cd .. - find ./tmp -name *.mtx -exec mv {} . \; + find ./tmp -name "*.mtx" -exec mv {} . \; rm -rf tmp fi diff --git a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb index c427996a2..7a234c9c1 100644 --- a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb @@ -63,48 +63,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Wed Jun 10 17:38:29 2020 \n", - "+-----------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 440.64.00 Driver Version: 440.64.00 CUDA Version: 10.2 |\n", - "|-------------------------------+----------------------+----------------------+\n", - "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", - "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", - "|===============================+======================+======================|\n", - "| 0 GeForce GT 710 On | 00000000:03:00.0 N/A | N/A |\n", - "| 50% 44C P8 N/A / N/A | 374MiB / 1998MiB | N/A Default |\n", - "+-------------------------------+----------------------+----------------------+\n", - "| 1 Quadro GV100 On | 00000000:04:00.0 Off | Off |\n", - "| 33% 45C P2 28W / 250W | 1MiB / 32508MiB | 0% Default |\n", - "+-------------------------------+----------------------+----------------------+\n", - "| 2 Quadro GP100 On | 00000000:84:00.0 Off | Off |\n", - "| 28% 44C P0 27W / 235W | 2MiB / 16278MiB | 0% Default |\n", - "+-------------------------------+----------------------+----------------------+\n", - " \n", - "+-----------------------------------------------------------------------------+\n", - "| Processes: GPU Memory |\n", - "| GPU PID Type Process name Usage |\n", - "|=============================================================================|\n", - "| 0 Not Supported |\n", - "+-----------------------------------------------------------------------------+\n", - "WARNING: infoROM is corrupted at gpu 0000:04:00.0\n", - "WARNING: infoROM is corrupted at gpu 0000:84:00.0\n" - ] - } - ], + "outputs": [], "source": [ "!nvidia-smi" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -122,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -135,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -146,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -172,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -183,20 +151,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Quadro GV100'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Print out GPU Name\n", "cudf._cuda.gpu.deviceGetName(0)" @@ -211,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -237,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -251,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -279,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -327,19 +284,7 @@ "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - " cuGraph Solving... \n", - "Reading ./data/preferentialAttachment.mtx...\n", - " cuGraph Solving... \n", - " NetworkX Solving... \n" - ] - } - ], + "outputs": [], "source": [ "# Loop through each test file and compute the speedup\n", "perf = []\n", From 68491e256a061d0e581af1cfdd8f0045dea49081 Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Mon, 17 Aug 2020 04:38:56 -0500 Subject: [PATCH 091/384] Updated last modified dates, cleared outputs on some notebooks, fixed typos. --- .../cugraph_benchmarks/bfs_benchmark.ipynb | 9 +- .../pagerank_benchmark.ipynb | 9 +- notebooks/demo/batch_betweenness.ipynb | 191 ++++-------------- notebooks/demo/uvm.ipynb | 4 +- 4 files changed, 43 insertions(+), 170 deletions(-) diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb index f5580691d..1c1362d04 100644 --- a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -11,7 +11,7 @@ "Notebook Credits\n", "\n", " Original Authors: Bradley Rees\n", - " Last Edit: 06/10/2020\n", + " Last Edit: 08/16/2020\n", " \n", "RAPIDS Versions: 0.15\n", "\n", @@ -407,13 +407,6 @@ "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.\n", "___" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb index cb2f5ed0d..52388fc1a 100644 --- a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -11,7 +11,7 @@ "Notebook Credits\n", "\n", " Original Authors: Bradley Rees\n", - " Last Edit: 06/10/2019\n", + " Last Edit: 08/16/2020\n", " \n", "RAPIDS Versions: 0.15\n", "\n", @@ -477,13 +477,6 @@ "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.\n", "___" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb index 2135c7333..c2fb52279 100644 --- a/notebooks/demo/batch_betweenness.ipynb +++ b/notebooks/demo/batch_betweenness.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -96,17 +96,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Your data file, ../data/soc-LiveJournal1.txt, already exists\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# download the soc-LiveJournal1 dataset\n", "base_url = 'https://snap.stanford.edu/data/'\n", @@ -141,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -152,17 +144,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SG Read time: 1.4840830960310996s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"SG Read time: {}s\".format(t_stop_read_sg - t_start_read_sg))" ] @@ -177,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -189,17 +173,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SG Build time: 0.43075192789547145s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"SG Build time: {}s\".format(t_stop_build_sg - t_start_build_sg))" ] @@ -214,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -225,17 +201,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SG Time elapsed: 45.48291095509194s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"SG Time elapsed: {}s\".format(t_stop_sg - t_start_sg))" ] @@ -257,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -277,29 +245,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", - " self.sync(self._update_scheduler_info)\n", - "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", - " self.sync(self._update_scheduler_info)\n", - "/home/xcadet/miniconda3/envs/cugraph_dev/lib/python3.7/site-packages/distributed/client.py:3493: RuntimeWarning: coroutine 'Client._update_scheduler_info' was never awaited\n", - " self.sync(self._update_scheduler_info)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MG Batch Enabling Time elapsed: 5.887182566104457s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "t_start_mg = time.perf_counter()\n", "G.enable_batch()\n", @@ -316,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -327,17 +275,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MG Time elapsed: 11.294120778795332s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"MG Time elapsed: {}s\".format(t_stop_mg - t_start_mg))" ] @@ -352,7 +292,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -369,20 +309,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "cupy.allclose(sorted_sg_df[\"betweenness_centrality\"], sorted_batch_df[\"betweenness_centrality\"])" ] @@ -396,60 +325,18 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " betweenness_centrality vertex\n", - "0 4.586460e-06 0\n", - "1 1.715658e-04 1\n", - "2 1.361555e-05 2\n", - "3 7.880936e-06 3\n", - "4 8.486780e-06 4\n", - "... ... ...\n", - "4847566 0.000000e+00 4847566\n", - "4847567 0.000000e+00 4847567\n", - "4847568 9.186307e-07 4847568\n", - "4847569 0.000000e+00 4847569\n", - "4847570 4.984750e-08 4847570\n", - "\n", - "[4847571 rows x 2 columns]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(sorted_sg_df)" ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " betweenness_centrality vertex\n", - "0 4.586460e-06 0\n", - "1 1.715658e-04 1\n", - "2 1.361555e-05 2\n", - "3 7.880936e-06 3\n", - "4 8.486780e-06 4\n", - "... ... ...\n", - "4847566 0.000000e+00 4847566\n", - "4847567 0.000000e+00 4847567\n", - "4847568 9.186307e-07 4847568\n", - "4847569 0.000000e+00 4847569\n", - "4847570 4.984750e-08 4847570\n", - "\n", - "[4847571 rows x 2 columns]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(sorted_batch_df)" ] @@ -463,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -488,9 +375,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "cugraph_dev", "language": "python", - "name": "python3" + "name": "cugraph_dev" }, "language_info": { "codemirror_mode": { diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index 2021b4c38..d279be8ed 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -7,9 +7,9 @@ "# Oversubscribing GPU memory in cuGraph\n", "#### Author : Alex Fender\n", "\n", - "In this notebook, we will show how to **scale to 4x larger graphs than before** without performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", + "In this notebook, we will show how to **scale to 4x larger graphs than before** without incurring a performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", "\n", - "Unified Memory is a single memory address space accessible from any processor in a system. If a kernel tries to access any absent pages,the Page Migration Engine migrates the pages. When the GPU memory is full, least recently used pages are evicted. In other words, Unified Memory transparently enables oversubscribing GPU memory, enabling out-of-core computations.\n", + "Unified Memory is a single memory address space accessible from any processor in a system. If a kernel tries to access any absent pages,the Page Migration Engine migrates the pages. When the GPU memory is full, the least recently used pages are evicted. In other words, Unified Memory transparently enables oversubscribing GPU memory, enabling out-of-core computations.\n", "\n", "\n", "This notebook was tested on an NVIDIA 48GB RTX8000 GPU using RAPIDS 0.14 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)" From cfa1ff29f59a22c8fbc1af01bebcee971fca02a0 Mon Sep 17 00:00:00 2001 From: Chuck Hastings Date: Tue, 18 Aug 2020 10:06:30 -0400 Subject: [PATCH 092/384] Update documentation per comments on PR 1063 --- docs/source/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index 47a4e29b2..84a01604d 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -57,6 +57,13 @@ Katz Centrality Community ========= +Leiden +------- + +.. automodule:: cugraph.community.leiden + :members: + :undoc-members: + Louvain ------- From cf127b746595f5abfcbc7b29191de94820ac7daf Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Tue, 18 Aug 2020 15:34:37 -0400 Subject: [PATCH 093/384] new notebook for benchmarking --- notebooks/cugraph_benchmarks/release.ipynb | 597 +++++++++++++++++++++ 1 file changed, 597 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/release.ipynb diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb new file mode 100644 index 000000000..b4cbf572d --- /dev/null +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -0,0 +1,597 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Release Benchmarking\n", + "\n", + "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n", + "This notebook run all the various algorithms to compuite the performance gain. \n", + "\n", + "### Algorithms\n", + "| Algorithm |\n", + "| ------------------------|\n", + "| BFS |\n", + "| SSSP |\n", + "| PageRank |\n", + "| WCC |\n", + "| Betweenness Centrality (vertex) |\n", + "| Louvain |\n", + "| Triangle Counting |\n", + "\n", + "### Test Data\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "| ---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |\n", + "\n", + "\n", + "Notebook Credits\n", + "\n", + " Original Authors: Bradley Rees\n", + " Last Edit: 08/17/2020\n", + " \n", + "RAPIDS Versions: 0.15\n", + "\n", + "Test Hardware\n", + " GV100 32G, CUDA 10.2\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Timing \n", + "What is not timed: Reading the data

\n", + "What is timmed: (1) creating a Graph, (2) running the algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Modules" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# system and other\n", + "import gc\n", + "import os\n", + "import time\n", + "import numpy as np\n", + "\n", + "# rapids\n", + "import cugraph\n", + "import cudf\n", + "\n", + "# NetworkX libraries\n", + "import networkx as nx" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import community\n", + "except ModuleNotFoundError:\n", + " os.system('pip install python-louvain')\n", + " import community" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')\n", + "\n", + "import matplotlib.pyplot as plt; plt.rcdefaults()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the test data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : '../data/preferentialAttachment.csv',\n", + " 'dblp' : '../data/dblp.csv',\n", + " 'coPapersCiteseer' : '../data/coPapersCiteseer.csv',\n", + " 'as-Skitter' : '../data/as-Skitter.csv'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Read data\n", + "The data is read in once once and used for both cuGraph and NetworkX." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def read_data(datafile):\n", + " print (f\"reading {v}\")\n", + " _gdf = cudf.read_csv(datafile, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'] )\n", + " return _gdf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Graph functions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX\n", + "def create_nx_graph(_df):\n", + " t1 = time.time()\n", + "\n", + " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n", + "\n", + " t2 = time.time() - t1\n", + "\n", + " return _gnx, t2\n", + "\n", + "# cuGraph - force CSR creation\n", + "def create_cu_graph(_df):\n", + " t1 = time.time()\n", + "\n", + " _g = cugraph.DiGraph()\n", + " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", + " _ = _g.view_adj_list()\n", + " t2 = time.time() - t1\n", + "\n", + " return _g, t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### BFS" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bfs(_G):\n", + " t1 = time.time()\n", + " _ = nx.bfs_edges(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_bfs(_G):\n", + " t1 = time.time()\n", + " _ = cugraph.bfs(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SSSP" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_sssp(_G):\n", + " t1 = time.time()\n", + " _ = nx.shortest_path(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_sssp(_G):\n", + " t1 = time.time()\n", + " _ = cugraph.sssp(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PageRank" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_pagerank(_G):\n", + " t1 = time.time()\n", + " _ = nx.pagerank(_G)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_pagerank(_G):\n", + " t1 = time.time() \n", + " _ = cugraph.pagerank(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### WCC" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_wcc(_G):\n", + " t1 = time.time()\n", + " _ = nx.weakly_connected_components(_G)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_wcc(_G):\n", + " t1 = time.time()\n", + " _ = cugraph.weakly_connected_components(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Betweenness Centrality (vertex)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bc(_G):\n", + " t1 = time.time()\n", + " _ = nx.betweenness_centrality(_G, k=100)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_bc(_G):\n", + " t1 = time.time()\n", + " _ = cugraph.betweenness_centrality(_G, k=100)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Louvain" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_louvain(_G):\n", + " t1 = time.time()\n", + " ug = _G.to_undirected()\n", + " \n", + " parts = community.best_partition(ug)\n", + " \n", + " # Calculating modularity scores for comparison \n", + " _ = community.modularity(parts, ug) \n", + " \n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_louvain(_G):\n", + " t1 = time.time()\n", + " _,_ = cugraph.louvain(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Triangle Counting" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_tc(_G):\n", + " t1 = time.time()\n", + " nx_count = nx.triangles(_G)\n", + " \n", + " # To get the number of triangles, we would need to loop through the array and add up each count\n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value \n", + " \n", + " \n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_tc(_G):\n", + " t1 = time.time()\n", + " _ = cugraph.triangles(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Benchmark Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# number of datasets\n", + "num_datasets = len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "reading ../data/preferentialAttachment.csv\n", + "reading ../data/preferentialAttachment.csv\n", + "\tdata in gdf 999970 and data in pandas 999970\n", + "\tcugraph Size 999970\n", + "\tcugraph Order 100000\n", + "\tcreated Gx in 2.2733235359191895 seconds vs Cu in 0.0037124156951904297\n", + "\tBFS\n", + "\tSSSP\n", + "\tPageRank\n", + "\tWCC\n", + "\tBC\n", + "\tLouvain\n" + ] + } + ], + "source": [ + "# arrays to capture performance gains\n", + "names = []\n", + "time_create_cu = []\n", + "time_create_nx = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "time_algo_nx = [] # will be two dimensional\n", + "perf = []\n", + "\n", + "# do a simple pass just to get all the libraries initiallized\n", + "v = '../data/preferentialAttachment.csv'\n", + "gdf = read_data(v)\n", + "#trapids = cugraph_call(M)\n", + "del gdf\n", + "gc.collect()\n", + "\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " time_algo_nx.append([])\n", + " perf.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " gdf = read_data(v)\n", + " pdf = gdf.to_pandas()\n", + " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", + "\n", + " # Create the DiGraphs\n", + "\n", + " Gx, tx = create_nx_graph(pdf)\n", + " Gc, tc = create_cu_graph(gdf)\n", + " \n", + " time_create_nx.append(tx)\n", + " time_create_cu.append(tc)\n", + " \n", + " print(f\"\\tcugraph Size {Gc.number_of_edges()}\")\n", + " print(f\"\\tcugraph Order {Gc.number_of_vertices()}\")\n", + " print(f\"\\tcreated Gx in {tx} seconds vs Cu in {tc}\")\n", + " \n", + " # BFS\n", + " print(\"\\tBFS\")\n", + " tx = nx_bfs(Gx)\n", + " tc = cu_bfs(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + " \n", + " # SSSP\n", + " print(\"\\tSSSP\")\n", + " tx = nx_sssp(Gx)\n", + " tc = cu_sssp(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " # PageRank\n", + " print(\"\\tPageRank\") \n", + " tx = nx_pagerank(Gx)\n", + " tc = cu_pagerank(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " # WCC\n", + " print(\"\\tWCC\")\n", + " tx = nx_wcc(Gx)\n", + " tc = cu_wcc(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " # BC\n", + " print(\"\\tBC\")\n", + " tx = nx_bc(Gx)\n", + " tc = cu_bc(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " # Louvain\n", + " print(\"\\tLouvain\")\n", + " tx = nx_louvain(Gx)\n", + " tc = cu_lovain(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " # TC\n", + " print(\"\\tTC\")\n", + " tx = nx_tc(Gx)\n", + " tc = cu_tc(Gc)\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + "\n", + " i = i + 1\n", + " gc.collect()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Print results\n", + "for i in range(num_datasets):\n", + " perf[i]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 2bfbdc1b65ec589abb93210db392687f1b180b4d Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 19 Aug 2020 10:51:12 -0400 Subject: [PATCH 094/384] updated processing and what is timed --- notebooks/cugraph_benchmarks/release.ipynb | 221 +++++++++++++-------- 1 file changed, 137 insertions(+), 84 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index b4cbf572d..a4f8c9887 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -10,15 +10,15 @@ "This notebook run all the various algorithms to compuite the performance gain. \n", "\n", "### Algorithms\n", - "| Algorithm |\n", - "| ------------------------|\n", - "| BFS |\n", - "| SSSP |\n", - "| PageRank |\n", - "| WCC |\n", - "| Betweenness Centrality (vertex) |\n", - "| Louvain |\n", - "| Triangle Counting |\n", + "| Algorithm | Graph | DiGraph |\n", + "| ------------------------| -------- | ----------- |\n", + "| BFS | X | |\n", + "| SSSP | X | |\n", + "| PageRank | | X |\n", + "| WCC | | X |\n", + "| Betweenness Centrality | X | |\n", + "| Louvain | X | |\n", + "| Triangle Counting | X | |\n", "\n", "### Test Data\n", "\n", @@ -77,7 +77,10 @@ "import cudf\n", "\n", "# NetworkX libraries\n", - "import networkx as nx" + "import networkx as nx\n", + "\n", + "# MTX file reader\n", + "from scipy.io import mmread" ] }, { @@ -122,10 +125,10 @@ "source": [ "# Test File\n", "data = {\n", - " 'preferentialAttachment' : '../data/preferentialAttachment.csv',\n", - " 'dblp' : '../data/dblp.csv',\n", - " 'coPapersCiteseer' : '../data/coPapersCiteseer.csv',\n", - " 'as-Skitter' : '../data/as-Skitter.csv'\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx'\n", + "# 'dblp' : './data/dblp.mtx',\n", + "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + "# 'as-Skitter' : './data/as-Skitter.mtx'\n", "}" ] }, @@ -143,9 +146,15 @@ "metadata": {}, "outputs": [], "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", "def read_data(datafile):\n", - " print (f\"reading {v}\")\n", - " _gdf = cudf.read_csv(datafile, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'] )\n", + " print('Reading ' + str(datafile) + '...')\n", + " M = mmread(datafile).asfptype()\n", + "\n", + " _gdf = cudf.DataFrame()\n", + " _gdf['src'] = M.row\n", + " _gdf['dst'] = M.col\n", + " \n", " return _gdf" ] }, @@ -164,24 +173,26 @@ "source": [ "# NetworkX\n", "def create_nx_graph(_df):\n", - " t1 = time.time()\n", - "\n", " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n", + " return _gnx\n", "\n", - " t2 = time.time() - t1\n", + "def create_nx_ugraph(_df):\n", + " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.Graph)\n", + " return _gnx\n", "\n", - " return _gnx, t2\n", "\n", - "# cuGraph - force CSR creation\n", + "# cuGraph\n", "def create_cu_graph(_df):\n", - " t1 = time.time()\n", - "\n", " _g = cugraph.DiGraph()\n", " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", " _ = _g.view_adj_list()\n", - " t2 = time.time() - t1\n", + " return _g\n", "\n", - " return _g, t2" + "def create_cu_ugraph(_df):\n", + " _g = cugraph.Graph()\n", + " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", + " _ = _g.view_adj_list()\n", + " return _g" ] }, { @@ -197,14 +208,16 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_bfs(_G):\n", + "def nx_bfs(_df):\n", " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", " _ = nx.bfs_edges(_G, 1)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_bfs(_G):\n", + "def cu_bfs(_df):\n", " t1 = time.time()\n", + " _G = create_cu_ugraph(_df)\n", " _ = cugraph.bfs(_G, 1)\n", " t2 = time.time() - t1\n", " return t2" @@ -223,14 +236,16 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_sssp(_G):\n", + "def nx_sssp(_df):\n", " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", " _ = nx.shortest_path(_G, 1)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_sssp(_G):\n", + "def cu_sssp(_df):\n", " t1 = time.time()\n", + " _G = create_cu_ugraph(_df) \n", " _ = cugraph.sssp(_G, 1)\n", " t2 = time.time() - t1\n", " return t2" @@ -249,14 +264,16 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_pagerank(_G):\n", + "def nx_pagerank(_df):\n", " t1 = time.time()\n", + " _G = create_nx_graph(_df)\n", " _ = nx.pagerank(_G)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_pagerank(_G):\n", - " t1 = time.time() \n", + "def cu_pagerank(_df):\n", + " t1 = time.time()\n", + " _G = create_cu_graph(_df)\n", " _ = cugraph.pagerank(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -275,14 +292,16 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_wcc(_G):\n", + "def nx_wcc(_df):\n", " t1 = time.time()\n", + " _G = create_nx_graph(_df)\n", " _ = nx.weakly_connected_components(_G)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_wcc(_G):\n", + "def cu_wcc(_df):\n", " t1 = time.time()\n", + " _G = create_cu_graph(_df) \n", " _ = cugraph.weakly_connected_components(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -301,14 +320,16 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_bc(_G):\n", + "def nx_bc(_df):\n", " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", " _ = nx.betweenness_centrality(_G, k=100)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_bc(_G):\n", + "def cu_bc(_df):\n", " t1 = time.time()\n", + " _G = create_cu_ugraph(_df)\n", " _ = cugraph.betweenness_centrality(_G, k=100)\n", " t2 = time.time() - t1\n", " return t2" @@ -327,11 +348,10 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_louvain(_G):\n", + "def nx_louvain(_df):\n", " t1 = time.time()\n", - " ug = _G.to_undirected()\n", - " \n", - " parts = community.best_partition(ug)\n", + " _G = create_nx_ugraph(_df)\n", + " parts = community.best_partition(_G)\n", " \n", " # Calculating modularity scores for comparison \n", " _ = community.modularity(parts, ug) \n", @@ -339,8 +359,9 @@ " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_louvain(_G):\n", + "def cu_louvain(_df):\n", " t1 = time.time()\n", + " _G = create_cu_ugraph(_df)\n", " _,_ = cugraph.louvain(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -359,8 +380,9 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_tc(_G):\n", + "def nx_tc(_df):\n", " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", " nx_count = nx.triangles(_G)\n", " \n", " # To get the number of triangles, we would need to loop through the array and add up each count\n", @@ -368,12 +390,12 @@ " for key, value in nx_count.items():\n", " count = count + value \n", " \n", - " \n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_tc(_G):\n", + "def cu_tc(_df):\n", " t1 = time.time()\n", + " _G = create_cu_ugraph(_df)\n", " _ = cugraph.triangles(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -403,6 +425,55 @@ "num_datasets = len(data)" ] }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tGDF Size 999970\n", + "\tcugraph Size 499985\n", + "\tcugraph Order 100000\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# do a simple pass just to get all the libraries initiallized\n", + "v = './data/preferentialAttachment.mtx'\n", + "gdf = read_data(v)\n", + "print(f\"\\tGDF Size {len(gdf)}\")\n", + "\n", + "g = create_cu_ugraph(gdf)\n", + "\n", + "print(f\"\\tcugraph Size {g.number_of_edges()}\")\n", + "print(f\"\\tcugraph Order {g.number_of_vertices()}\")\n", + "\n", + "del gdf\n", + "del g\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -412,12 +483,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "reading ../data/preferentialAttachment.csv\n", - "reading ../data/preferentialAttachment.csv\n", + "Reading ./data/preferentialAttachment.mtx...\n", "\tdata in gdf 999970 and data in pandas 999970\n", - "\tcugraph Size 999970\n", - "\tcugraph Order 100000\n", - "\tcreated Gx in 2.2733235359191895 seconds vs Cu in 0.0037124156951904297\n", "\tBFS\n", "\tSSSP\n", "\tPageRank\n", @@ -430,20 +497,12 @@ "source": [ "# arrays to capture performance gains\n", "names = []\n", - "time_create_cu = []\n", - "time_create_nx = []\n", "\n", "# Two dimension data\n", "time_algo_cu = [] # will be two dimensional\n", "time_algo_nx = [] # will be two dimensional\n", "perf = []\n", "\n", - "# do a simple pass just to get all the libraries initiallized\n", - "v = '../data/preferentialAttachment.csv'\n", - "gdf = read_data(v)\n", - "#trapids = cugraph_call(M)\n", - "del gdf\n", - "gc.collect()\n", "\n", "\n", "i = 0\n", @@ -460,83 +519,77 @@ " pdf = gdf.to_pandas()\n", " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", "\n", - " # Create the DiGraphs\n", - "\n", - " Gx, tx = create_nx_graph(pdf)\n", - " Gc, tc = create_cu_graph(gdf)\n", - " \n", - " time_create_nx.append(tx)\n", - " time_create_cu.append(tc)\n", - " \n", - " print(f\"\\tcugraph Size {Gc.number_of_edges()}\")\n", - " print(f\"\\tcugraph Order {Gc.number_of_vertices()}\")\n", - " print(f\"\\tcreated Gx in {tx} seconds vs Cu in {tc}\")\n", - " \n", " # BFS\n", " print(\"\\tBFS\")\n", - " tx = nx_bfs(Gx)\n", - " tc = cu_bfs(Gc)\n", + " tx = nx_bfs(pdf)\n", + " tc = cu_bfs(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", " \n", " # SSSP\n", " print(\"\\tSSSP\")\n", - " tx = nx_sssp(Gx)\n", - " tc = cu_sssp(Gc)\n", + " tx = nx_sssp(pdf)\n", + " tc = cu_sssp(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " # PageRank\n", " print(\"\\tPageRank\") \n", - " tx = nx_pagerank(Gx)\n", - " tc = cu_pagerank(Gc)\n", + " tx = nx_pagerank(pdf)\n", + " tc = cu_pagerank(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " # WCC\n", " print(\"\\tWCC\")\n", - " tx = nx_wcc(Gx)\n", - " tc = cu_wcc(Gc)\n", + " tx = nx_wcc(pdf)\n", + " tc = cu_wcc(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " # BC\n", " print(\"\\tBC\")\n", - " tx = nx_bc(Gx)\n", - " tc = cu_bc(Gc)\n", + " tx = nx_bc(pdf)\n", + " tc = cu_bc(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " # Louvain\n", " print(\"\\tLouvain\")\n", - " tx = nx_louvain(Gx)\n", - " tc = cu_lovain(Gc)\n", + " tx = nx_louvain(pdf)\n", + " tc = cu_lovain(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " # TC\n", " print(\"\\tTC\")\n", - " tx = nx_tc(Gx)\n", - " tc = cu_tc(Gc)\n", + " tx = nx_tc(pdf)\n", + " tc = cu_tc(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", + " gc.collect()\n", "\n", " i = i + 1\n", - " gc.collect()\n", "\n" ] }, From 894c3f2c5adcb2a67814635a8d26db605ea32089 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 19 Aug 2020 11:37:49 -0400 Subject: [PATCH 095/384] typos --- notebooks/cugraph_benchmarks/release.ipynb | 74 ++++++---------------- 1 file changed, 19 insertions(+), 55 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index a4f8c9887..1fd742d62 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -62,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -167,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -232,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -288,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -316,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -344,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -354,7 +354,7 @@ " parts = community.best_partition(_G)\n", " \n", " # Calculating modularity scores for comparison \n", - " _ = community.modularity(parts, ug) \n", + " _ = community.modularity(parts, _G) \n", " \n", " t2 = time.time() - t1\n", " return t2\n", @@ -376,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -417,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -427,30 +427,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tGDF Size 999970\n", - "\tcugraph Size 499985\n", - "\tcugraph Order 100000\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# do a simple pass just to get all the libraries initiallized\n", "v = './data/preferentialAttachment.mtx'\n", @@ -478,22 +457,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tdata in gdf 999970 and data in pandas 999970\n", - "\tBFS\n", - "\tSSSP\n", - "\tPageRank\n", - "\tWCC\n", - "\tBC\n", - "\tLouvain\n" - ] - } - ], + "outputs": [], "source": [ "# arrays to capture performance gains\n", "names = []\n", From 42325b03ac0a93ffdcf63dbfe6d636469025d799 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 20 Aug 2020 09:14:33 -0400 Subject: [PATCH 096/384] tested and updated --- notebooks/cugraph_benchmarks/release.ipynb | 28 ++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index 1fd742d62..bb1a373b6 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -7,7 +7,7 @@ "# Release Benchmarking\n", "\n", "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n", - "This notebook run all the various algorithms to compuite the performance gain. \n", + "This notebook, starting with release 0.15, run all the various algorithms to compuite the performance gain. \n", "\n", "### Algorithms\n", "| Algorithm | Graph | DiGraph |\n", @@ -125,10 +125,10 @@ "source": [ "# Test File\n", "data = {\n", - " 'preferentialAttachment' : './data/preferentialAttachment.mtx'\n", - "# 'dblp' : './data/dblp.mtx',\n", - "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", - "# 'as-Skitter' : './data/as-Skitter.mtx'\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", "}" ] }, @@ -536,7 +536,7 @@ " # Louvain\n", " print(\"\\tLouvain\")\n", " tx = nx_louvain(pdf)\n", - " tc = cu_lovain(gdf)\n", + " tc = cu_louvain(gdf)\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", @@ -565,7 +565,8 @@ "source": [ "#Print results\n", "for i in range(num_datasets):\n", - " perf[i]" + " print(f\"{names[i]}\")\n", + " print(f\"{perf[i]}\")" ] }, { @@ -588,6 +589,19 @@ "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] } ], "metadata": { From c508dd48338b8c31549ed35e8c08085c9043b44a Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 20 Aug 2020 10:37:11 -0400 Subject: [PATCH 097/384] fix issues found in PR --- notebooks/cugraph_benchmarks/release.ipynb | 54 +++++----------------- 1 file changed, 11 insertions(+), 43 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index bb1a373b6..c5360ff26 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -137,7 +137,7 @@ "metadata": {}, "source": [ "### Read data\n", - "The data is read in once once and used for both cuGraph and NetworkX." + "The data is read in once and used for both cuGraph and NetworkX." ] }, { @@ -162,7 +162,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Create Graph functions" + "## Create Graph functions\n", + "There are two types of graphs created:\n", + "Directed Graphs - calls to create_xx_digraph\n", + "Undirected Graphs - calls to create_xx_ugraph <- fully syemmeterized " ] }, { @@ -172,7 +175,7 @@ "outputs": [], "source": [ "# NetworkX\n", - "def create_nx_graph(_df):\n", + "def create_nx_digraph(_df):\n", " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n", " return _gnx\n", "\n", @@ -182,16 +185,14 @@ "\n", "\n", "# cuGraph\n", - "def create_cu_graph(_df):\n", + "def create_cu_digraph(_df):\n", " _g = cugraph.DiGraph()\n", " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", - " _ = _g.view_adj_list()\n", " return _g\n", "\n", "def create_cu_ugraph(_df):\n", " _g = cugraph.Graph()\n", " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", - " _ = _g.view_adj_list()\n", " return _g" ] }, @@ -266,7 +267,7 @@ "source": [ "def nx_pagerank(_df):\n", " t1 = time.time()\n", - " _G = create_nx_graph(_df)\n", + " _G = create_nx_digraph(_df)\n", " _ = nx.pagerank(_G)\n", " t2 = time.time() - t1\n", " return t2\n", @@ -294,7 +295,7 @@ "source": [ "def nx_wcc(_df):\n", " t1 = time.time()\n", - " _G = create_nx_graph(_df)\n", + " _G = create_nx_digraph(_df)\n", " _ = nx.weakly_connected_components(_G)\n", " t2 = time.time() - t1\n", " return t2\n", @@ -401,13 +402,6 @@ " return t2" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -432,6 +426,7 @@ "outputs": [], "source": [ "# do a simple pass just to get all the libraries initiallized\n", + "# This cell might not be needed\n", "v = './data/preferentialAttachment.mtx'\n", "gdf = read_data(v)\n", "print(f\"\\tGDF Size {len(gdf)}\")\n", @@ -441,18 +436,12 @@ "print(f\"\\tcugraph Size {g.number_of_edges()}\")\n", "print(f\"\\tcugraph Order {g.number_of_vertices()}\")\n", "\n", + "# clean up what we just created\n", "del gdf\n", "del g\n", "gc.collect()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, @@ -569,27 +558,6 @@ " print(f\"{perf[i]}\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, From a875c2409b5ff1680acdc9be0c3b272ba60552d7 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 20 Aug 2020 10:52:17 -0400 Subject: [PATCH 098/384] more PR fixes --- notebooks/cugraph_benchmarks/release.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index c5360ff26..ff5ed5abf 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -7,7 +7,7 @@ "# Release Benchmarking\n", "\n", "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n", - "This notebook, starting with release 0.15, run all the various algorithms to compuite the performance gain. \n", + "This notebook, starting with release 0.15, runs all the various algorithms to computes the performance gain. \n", "\n", "### Algorithms\n", "| Algorithm | Graph | DiGraph |\n", From 3955985d0f7e0047655956e7e81f5bccb097bba3 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 26 Aug 2020 12:13:28 -0700 Subject: [PATCH 099/384] REL v0.15.0 release From 9ac6334c5a1902281c2c52d6a98e739094ebe2af Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 09:40:34 -0400 Subject: [PATCH 100/384] reference doc --- docs/source/cugraph_blogs.rst | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/source/cugraph_blogs.rst diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst new file mode 100644 index 000000000..3cc37a302 --- /dev/null +++ b/docs/source/cugraph_blogs.rst @@ -0,0 +1,32 @@ +cuGraph blogs and other references +=============================== + +The RAPIDS team blogs at https://medium.com/rapids-ai, and many of +these blog posts provide deeper dives into models or key features from +cuGraph. Here, we've selected just a few that are of particular interest +to cuML users: + +BLOGS +------------------------------------------------ + +2019 +* `RAPIDS cuGraph `_ March +* `RAPIDS cuGraph — The vision and journey to version 1.0 and beyond `_ August + +2020 + + + + + +Academic Papers +--------------- + +* `Machine Learning in Python: Main developments and technology trends in data science, machine learning, and artificial intelligence (Sebastian Raschka, Joshua Patterson, Corey Nolet) `_ + + + +References +--------------- + + From 4b33d6be7359992f63e7ae68a87f77803a7f37c0 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 09:43:49 -0400 Subject: [PATCH 101/384] update --- docs/source/cugraph_blogs.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index 3cc37a302..b4150c459 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -10,8 +10,8 @@ BLOGS ------------------------------------------------ 2019 -* `RAPIDS cuGraph `_ March -* `RAPIDS cuGraph — The vision and journey to version 1.0 and beyond `_ August +* March `RAPIDS cuGraph `_ +* August `RAPIDS cuGraph — The vision and journey to version 1.0 and beyond `_ 2020 From 05c443bf215efb87dc7450872eae0ebfb454e883 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 14:01:17 -0400 Subject: [PATCH 102/384] docs --- docs/source/conf.py | 8 +++++++ docs/source/cugraph_blogs.rst | 39 ++++++++++++++++++++--------------- docs/source/cugraph_intro.md | 6 ++++++ docs/source/cugraph_ref.md | 26 +++++++++++++++++++++++ docs/source/index.rst | 4 ++++ 5 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 docs/source/cugraph_intro.md create mode 100644 docs/source/cugraph_ref.md diff --git a/docs/source/conf.py b/docs/source/conf.py index 6b144e93c..0c8a03162 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -188,3 +188,11 @@ def setup(app): app.add_stylesheet('params.css') + +from recommonmark.parser import CommonMarkParser + +source_parsers = { + '.md': CommonMarkParser, +} + +source_suffix = ['.rst', '.md'] \ No newline at end of file diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index b4150c459..e42151049 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -1,32 +1,37 @@ -cuGraph blogs and other references -=============================== + +cuGraph BLOGS and Presentations +************************************************ The RAPIDS team blogs at https://medium.com/rapids-ai, and many of -these blog posts provide deeper dives into models or key features from -cuGraph. Here, we've selected just a few that are of particular interest -to cuML users: +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 ------------------------------------------------- +============== 2019 -* March `RAPIDS cuGraph `_ -* August `RAPIDS cuGraph — The vision and journey to version 1.0 and beyond `_ +------- + * `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 `_ + 2020 +------ + * `Status of RAPIDS cuGraph — Refactoring Code And Rethinking Graphs `_ + * `Tackling Large Graphs with RAPIDS cuGraph and CUDA Unified Memory on GPUs `_ - +Media +=============== + * `Nvidia Rapids cuGraph: Making graph analysis ubiquitous `_ Academic Papers ---------------- - -* `Machine Learning in Python: Main developments and technology trends in data science, machine learning, and artificial intelligence (Sebastian Raschka, Joshua Patterson, Corey Nolet) `_ - - - -References ---------------- +=============== + * HPEC +Copyright (c) 2020, NVIDIA CORPORATION. diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md new file mode 100644 index 000000000..ca3e62a84 --- /dev/null +++ b/docs/source/cugraph_intro.md @@ -0,0 +1,6 @@ + +cuGraph Intro +------------------------------ + + + diff --git a/docs/source/cugraph_ref.md b/docs/source/cugraph_ref.md new file mode 100644 index 000000000..7251cac0b --- /dev/null +++ b/docs/source/cugraph_ref.md @@ -0,0 +1,26 @@ +# References +------------------------------ + +Betweenness Centrality +* +Katz +* Cohen, J., “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 + + + +------------------------ +## Data Sets + +| Data File | Reference | +|------------------|-------------------------------------------------------------------------| +| karate | W. W. Zachary, Aninformation 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 nternational 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/source/index.rst b/docs/source/index.rst index 47360b88f..cae4d9ed5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -7,6 +7,10 @@ Welcome to cugraph's documentation! api.rst dask-cugraph.rst + cugraph_intro.md + cugraph_blogs.rst + cugraph_ref.rst + Indices and tables ================== From 6ae8788c956b4d5ed3ba843d059bdc812dab7b13 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 14:11:32 -0400 Subject: [PATCH 103/384] changed formating --- docs/source/cugraph_intro.md | 9 ++++++- docs/source/cugraph_ref.md | 26 ------------------ docs/source/cugraph_ref.rst | 52 ++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 27 deletions(-) delete mode 100644 docs/source/cugraph_ref.md create mode 100644 docs/source/cugraph_ref.rst diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md index ca3e62a84..3a875e58e 100644 --- a/docs/source/cugraph_intro.md +++ b/docs/source/cugraph_intro.md @@ -1,6 +1,13 @@ -cuGraph Intro +# cuGraph Intro ------------------------------ +## Graph Type + + +## Algorithms + + +## Using diff --git a/docs/source/cugraph_ref.md b/docs/source/cugraph_ref.md deleted file mode 100644 index 7251cac0b..000000000 --- a/docs/source/cugraph_ref.md +++ /dev/null @@ -1,26 +0,0 @@ -# References ------------------------------- - -Betweenness Centrality -* -Katz -* Cohen, J., “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 - - - ------------------------- -## Data Sets - -| Data File | Reference | -|------------------|-------------------------------------------------------------------------| -| karate | W. W. Zachary, Aninformation 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 nternational 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/source/cugraph_ref.rst b/docs/source/cugraph_ref.rst new file mode 100644 index 000000000..d5953bc9e --- /dev/null +++ b/docs/source/cugraph_ref.rst @@ -0,0 +1,52 @@ +# References +=============== + +Betweenness Centrality +------------------------- + + +Katz +------------------------- + +- 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, “*ast Triangle Counting on GPU* Irregular Applications: Architectures and Algorithms (IA3), 2014 + + + + + + +Data Sets +=============== + ++------------------+-------------------------------------------------------------------------+ +| Data File | Reference | ++==================+=========================================================================+ +| karate | W. W. Zachary, | +| | Aninformation 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/. | ++------------------+-------------------------------------------------------------------------+ + + + + From a0d51ff16bd625b7bbf8102a2445f1c69208e355 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 14:34:46 -0400 Subject: [PATCH 104/384] better formating --- docs/source/cugraph_ref.rst | 49 +++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/docs/source/cugraph_ref.rst b/docs/source/cugraph_ref.rst index d5953bc9e..b5d0709a1 100644 --- a/docs/source/cugraph_ref.rst +++ b/docs/source/cugraph_ref.rst @@ -3,6 +3,9 @@ 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 @@ -19,33 +22,25 @@ Katz Data Sets =============== - -+------------------+-------------------------------------------------------------------------+ -| Data File | Reference | -+==================+=========================================================================+ -| karate | W. W. Zachary, | -| | Aninformation 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/. | -+------------------+-------------------------------------------------------------------------+ +karate + - W. W. Zachary, *Aninformation 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/. From 1bd0adcfb43992d5f32f5d4e0fbb3720aae4d4ad Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 14:41:10 -0400 Subject: [PATCH 105/384] formating --- docs/source/cugraph_intro.md | 13 ------------- docs/source/cugraph_intro.rst | 13 +++++++++++++ docs/source/cugraph_ref.rst | 8 ++++++-- docs/source/index.rst | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) delete mode 100644 docs/source/cugraph_intro.md create mode 100644 docs/source/cugraph_intro.rst diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md deleted file mode 100644 index 3a875e58e..000000000 --- a/docs/source/cugraph_intro.md +++ /dev/null @@ -1,13 +0,0 @@ - -# cuGraph Intro ------------------------------- - - - -## Graph Type - - -## Algorithms - - -## Using diff --git a/docs/source/cugraph_intro.rst b/docs/source/cugraph_intro.rst new file mode 100644 index 000000000..cd2d750e3 --- /dev/null +++ b/docs/source/cugraph_intro.rst @@ -0,0 +1,13 @@ + +cuGraph Intro +------------------------------ + + + +Graph Type + + +Algorithms + + +Using diff --git a/docs/source/cugraph_ref.rst b/docs/source/cugraph_ref.rst index b5d0709a1..4c627c4c2 100644 --- a/docs/source/cugraph_ref.rst +++ b/docs/source/cugraph_ref.rst @@ -1,6 +1,9 @@ -# References +References =============== +Algorithms +************** + Betweenness Centrality ------------------------- - Brandes, U. (2001). A faster algorithm for betweenness centrality. Journal of mathematical sociology, 25(2), 163-177. @@ -21,7 +24,8 @@ Katz Data Sets -=============== +************** + karate - W. W. Zachary, *Aninformation flow model for conflict and fission in small groups*, Journal of Anthropological Research 33, 452-473 (1977). dolphins diff --git a/docs/source/index.rst b/docs/source/index.rst index cae4d9ed5..2cd95e7f1 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -7,7 +7,7 @@ Welcome to cugraph's documentation! api.rst dask-cugraph.rst - cugraph_intro.md + cugraph_intro.rst cugraph_blogs.rst cugraph_ref.rst From fc1dea6461ce49fce3a04643cf98d8593215b182 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Fri, 28 Aug 2020 15:11:08 -0400 Subject: [PATCH 106/384] more ref --- docs/source/cugraph_blogs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index e42151049..ec8c0f0e2 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -27,7 +27,7 @@ BLOGS Media =============== * `Nvidia Rapids cuGraph: Making graph analysis ubiquitous `_ - + * `RAPIDS cuGraph – Accelerating all your Graph needs `_ Academic Papers =============== From a47275093155a16ff1afa03e2296743b5d2f6296 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Mon, 31 Aug 2020 14:12:19 -0400 Subject: [PATCH 107/384] addressing code review --- docs/source/cugraph_ref.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/cugraph_ref.rst b/docs/source/cugraph_ref.rst index 4c627c4c2..0742d5f5a 100644 --- a/docs/source/cugraph_ref.rst +++ b/docs/source/cugraph_ref.rst @@ -27,7 +27,7 @@ Data Sets ************** karate - - W. W. Zachary, *Aninformation flow model for conflict and fission in small groups*, Journal of Anthropological Research 33, 452-473 (1977). + - 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*, From 50655deb6674c81351faede47924a4dd4c8b6c7c Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 2 Sep 2020 10:07:27 -0400 Subject: [PATCH 108/384] Added HITS and sorted algorithms alphabetically --- docs/source/api.rst | 51 ++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 84a01604d..538cd8527 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -57,34 +57,34 @@ Katz Centrality Community ========= -Leiden +Ensemble clustering for graphs (ECG) +------------------------------------ + +.. automodule:: cugraph.community.ecg + :members: + :undoc-members: + +K-Truss ------- -.. automodule:: cugraph.community.leiden +.. automodule:: cugraph.community.ktruss_subgraph :members: :undoc-members: -Louvain +Leiden ------- -.. automodule:: cugraph.community.louvain +.. automodule:: cugraph.community.leiden :members: :undoc-members: -K-Truss +Louvain ------- -.. automodule:: cugraph.community.ktruss_subgraph +.. automodule:: cugraph.community.louvain :members: :undoc-members: -ECG ---- - -.. automodule:: cugraph.community.ecg - :members: - :undoc-members: - Spectral Clustering ------------------- @@ -117,9 +117,17 @@ Connected Components :members: :undoc-members: + Cores ===== +Core Number +----------- + +.. automodule:: cugraph.cores.core_number + :members: + :undoc-members: + K-Core ------ @@ -127,12 +135,6 @@ K-Core :members: :undoc-members: -Core Number ------------ - -.. automodule:: cugraph.cores.core_number - :members: - :undoc-members: Layout ====== @@ -144,9 +146,17 @@ Force Atlas 2 :members: :undoc-members: + Link Analysis ============= +HITS +--------- + +.. automodule:: cugraph.link_analysis.hits + :members: + :undoc-members: + Pagerank --------- @@ -154,6 +164,7 @@ Pagerank :members: :undoc-members: + Link Prediction =============== @@ -179,6 +190,7 @@ Overlap Coefficient :members: :undoc-members: + Traversal ========= @@ -196,6 +208,7 @@ Single-source-shortest-path :members: :undoc-members: + Utilities ========= From 0e900b19612fe32405ab69f051b5a0bb90303c2d Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 2 Sep 2020 10:54:36 -0400 Subject: [PATCH 109/384] removed Renumbering since it is now in Graph. Drop RMAT since it is not implemented --- docs/source/api.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 538cd8527..b194aa0e0 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -14,12 +14,6 @@ Graph :members: :undoc-members: -Renumbering ------------ - -.. automodule:: cugraph.structure.renumber - :members: - :undoc-members: Symmetrize ---------- @@ -212,10 +206,5 @@ Single-source-shortest-path Utilities ========= -R-mat Graph Generation ----------------------- -.. automodule:: cugraph.utilities.grmat - :members: - :undoc-members: From df71b675fd734119b357333864edb1bda45bd08e Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 3 Sep 2020 11:04:25 -0400 Subject: [PATCH 110/384] added a version of Karate that contains a second disjoint version --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 30bcd5a84..c2498b35c 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,7 @@ datasets/* !datasets/cyber.csv !datasets/karate-data.csv !datasets/karate_undirected.csv +!datasets/karate-disjoint.csv !datasets/netscience.csv From 7f7bdd6176e0a51eb26d7ea07c4e0b61092a64ed Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Thu, 3 Sep 2020 13:34:45 -0400 Subject: [PATCH 111/384] added additional blogs --- docs/source/cugraph_blogs.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index ec8c0f0e2..a9954aee5 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -31,7 +31,18 @@ Media Academic Papers =============== - * HPEC +* S. Kang, A. Fender, J. Eaton, B. Rees: Computing PageRank Scores of Web Crawl Data Using DGX A100 Clusters. In IEEE HPEC, Sep. 2020 + + +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 `_ + + Copyright (c) 2020, NVIDIA CORPORATION. From 5c29c901abd1488f62bb503fcc468b2d22e4195f Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 29 Sep 2020 19:22:45 -0400 Subject: [PATCH 112/384] [REVIEW] ENH added more Nx compatibility (#1165) * updated Katz API * added entry for edge betweennees centrality * Added SSSP, BFS, and subgraph as Nx compatible Co-authored-by: BradReesWork --- docs/source/api.rst | 7 + .../nx_cugraph_bc_benchmarking.ipynb | 202 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb diff --git a/docs/source/api.rst b/docs/source/api.rst index b194aa0e0..d334b488d 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -40,6 +40,13 @@ Betweenness Centrality :members: :undoc-members: +Edge Betweenness Centrality +--------------------------- + +.. automodule:: cugraph.centrality.edge_betweenness_centrality + :members: + :undoc-members: + Katz Centrality --------------- diff --git a/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb b/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb new file mode 100644 index 000000000..6f76868f9 --- /dev/null +++ b/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking NetworkX compatibility\n", + "This notebook benchmark the use of a NetworkX Graph object as input into algorithms.

\n", + "The intention of the feature is to be able to drop cuGraph into existing NetworkX code in spot where performance is not optimal.\n", + "\n", + "\n", + "### Betweenness Centrality\n", + "Both NetworkX and cuGraph allow for estimating the betweenness centrality score by using a subset of vertices rather than all the vertices. WHile that does produce a less accurate answer, it dramatically improves performance when the sample is small. For this test, the algorithms will use only 10% of the vertices to compute the estimate \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Notebook Credits__\n", + "\n", + "* Original Authors: Bradley Rees\n", + "* Last Edit: 09/27/2020\n", + "\n", + "RAPIDS Versions: 0.16\n", + "\n", + "Test Hardware\n", + "```\n", + " GV100 32G, CUDA 10,0\n", + " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", + " 32GB system memory\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import cugraph as cnx\n", + "import time\n", + "import operator" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# starting number of Nodes\n", + "N = 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# average degree\n", + "M = 16" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def run_nx(G, k=None):\n", + " t1 = time.time()\n", + " bc = nx.betweenness_centrality(G, k)\n", + " t2 = time.time() - t1\n", + " return t2, bc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def run_cu(G, k=None):\n", + " t1 = time.time()\n", + " bc = cnx.betweenness_centrality(G, k)\n", + " t2 = time.time() - t1\n", + " return t2, bc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Betweenness Cenytrality - use all nodes - limit scale to 3,200 nodes so that executing time is not days\")\n", + "print(f\"Node \\tEdges \\tSpeedup \\t\\tcreate time \\t\\tnx time \\t\\tcu time \")\n", + "\n", + "for x in range(6):\n", + " if x == 0:\n", + " n = N\n", + " else:\n", + " n = n * 2\n", + "\n", + " \n", + " t1 = time.time() \n", + " # create a random graph\n", + " G = nx.barabasi_albert_graph(n, M)\n", + " g_time = time.time() - t1\n", + " \n", + " num_edges = G.number_of_edges()\n", + " num_nodes = G.number_of_nodes()\n", + " \n", + " time_nx, bc = run_nx(G)\n", + " time_cu, bcc = run_cu(G)\n", + "\n", + " speedup = time_nx / time_cu\n", + " print(f\"{num_nodes}\\t{num_edges}\\t{speedup}\\t{g_time}\\t{time_nx}\\t{time_cu}\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"PageRank - run larger graph since algorithm is fast\")\n", + "print(f\"Node \\tEdges \\tSpeedup \\t\\tnx time \\t\\tcu time \")\n", + "\n", + "pr_speedup = []\n", + "\n", + "for x in range(15):\n", + " if x == 0:\n", + " n = N\n", + " else:\n", + " n = n * 2\n", + "\n", + " # create a random graph\n", + " G = nx.barabasi_albert_graph(n, M)\n", + " num_edges = G.number_of_edges()\n", + " num_nodes = G.number_of_nodes()\n", + " \n", + " t1 = time.time() \n", + " nx_pr = nx.pagerank(G)\n", + " time_nx = time.time() - t1\n", + " \n", + " t1 = time.time() \n", + " cp_pr = cnx.pagerank(G)\n", + " time_cu = time.time() - t1\n", + "\n", + " speedup = time_nx / time_cu\n", + " print(f\"{num_nodes}\\t{num_edges} \\t{speedup}\\t{time_nx}\\t{time_cu}\")\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 549b0ab63ea95a724e79ffedab02d0f81f2b1bb7 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 2 Oct 2020 10:41:58 -0400 Subject: [PATCH 113/384] DOC v0.17 Updates --- docs/source/conf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 0c8a03162..fad2f3e21 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -65,9 +65,9 @@ # built documents. # # The short X.Y version. -version = '0.16' +version = '0.17' # The full version, including alpha/beta/rc tags. -release = '0.16.0' +release = '0.17.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -195,4 +195,4 @@ def setup(app): '.md': CommonMarkParser, } -source_suffix = ['.rst', '.md'] \ No newline at end of file +source_suffix = ['.rst', '.md'] From fd1786a786e2f338dfe6eda6ec65b87205dae776 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 7 Oct 2020 09:34:21 -0400 Subject: [PATCH 114/384] [REVIEW] BUG fix benchmark notebooks for recent cudf changes (#1192) * fix notebooks for recent cudf changes * updated docs * changelog * fix notebooks for recent cudf changes * updated docs * changelog * reset * flake8 * fixed typo in function name * fixed typo * clean. this notebook can take 12+ hours to run. making data set small for nightly testing Co-authored-by: BradReesWork --- .../cugraph_benchmarks/bfs_benchmark.ipynb | 46 +------------------ .../louvain_benchmark.ipynb | 42 +---------------- .../pagerank_benchmark.ipynb | 40 +--------------- notebooks/cugraph_benchmarks/release.ipynb | 25 ++++++---- 4 files changed, 19 insertions(+), 134 deletions(-) diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb index 1c1362d04..58eb94bf0 100644 --- a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -62,34 +62,6 @@ "See the README file in this folder for a discription of how to get the data" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## If you have more than one GPU, set the GPU to use\n", - "This is not needed on a Single GPU system or if the default GPU is to be used" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!nvidia-smi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Set the GPU to use\n", - "import os\n", - "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -144,22 +116,6 @@ "import numpy as np" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Print the name of the used GPU" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cudf._cuda.gpu.deviceGetName(0)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -425,7 +381,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb index 7a234c9c1..a12b7c4bc 100644 --- a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb @@ -57,35 +57,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## If you have more than one GPU, set the GPU to use\n", - "This is not needed on a Single GPU system or if the default GPU is to be used" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!nvidia-smi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# since this is a shared machine - let's pick a GPU that no one else is using\n", - "import os\n", - "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Now load the required libraries" + "## Load the required libraries" ] }, { @@ -149,16 +121,6 @@ "import numpy as np" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Print out GPU Name\n", - "cudf._cuda.gpu.deviceGetName(0)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -403,7 +365,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb index 52388fc1a..c2933a10c 100644 --- a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -65,34 +65,6 @@ "See the README file in this folder for a discription of how to get the data" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## If you have more than one GPU, set the GPU to use\n", - "This is not needed on a Single GPU system or if the default GPU is to be used" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!nvidia-smi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# since this is a shared machine - let's pick a GPU that no one else is using\n", - "import os\n", - "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -147,16 +119,6 @@ "import numpy as np" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Print out GPU Name\n", - "cudf._cuda.gpu.deviceGetName(0)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -495,7 +457,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index ff5ed5abf..d3110da36 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -33,9 +33,9 @@ "Notebook Credits\n", "\n", " Original Authors: Bradley Rees\n", - " Last Edit: 08/17/2020\n", + " Last Edit: 10/06/2020\n", " \n", - "RAPIDS Versions: 0.15\n", + "RAPIDS Versions: 0.16\n", "\n", "Test Hardware\n", " GV100 32G, CUDA 10.2\n", @@ -124,12 +124,17 @@ "outputs": [], "source": [ "# Test File\n", + "# data = {\n", + "# 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + "# 'dblp' : './data/dblp-2010.mtx',\n", + "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + "# 'as-Skitter' : './data/as-Skitter.mtx'\n", + "#}\n", + "\n", + "# for quick testing\n", "data = {\n", - " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", - " 'dblp' : './data/dblp-2010.mtx',\n", - " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", - " 'as-Skitter' : './data/as-Skitter.mtx'\n", - "}" + " 'polbooks' : './data/polbooks.mtx', \n", + "}\n" ] }, { @@ -274,7 +279,7 @@ "\n", "def cu_pagerank(_df):\n", " t1 = time.time()\n", - " _G = create_cu_graph(_df)\n", + " _G = create_cu_digraph(_df)\n", " _ = cugraph.pagerank(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -302,7 +307,7 @@ "\n", "def cu_wcc(_df):\n", " t1 = time.time()\n", - " _G = create_cu_graph(_df) \n", + " _G = create_cu_digraph(_df) \n", " _ = cugraph.weakly_connected_components(_G)\n", " t2 = time.time() - t1\n", " return t2" @@ -588,7 +593,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.8" + "version": "3.8.5" } }, "nbformat": 4, From e2ab85a81d17634e402daad16d9319222260f23d Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 14 Oct 2020 12:02:37 -0400 Subject: [PATCH 115/384] [REVIEW] DOC Adding Nx transition doc and preping for more (#1217) * Added new Medium entry * updated to match cuML * copied to match cuML * updated list of MG algorithms * converted to Markdown * updated reference to new markdown file * removed rst file * should really be a HTML file (next release) * copy pdf files over * updates * removed ref to cuml * changelog * addressing review issues * migrated to RST Co-authored-by: BradReesWork --- docs/Makefile | 2 + docs/source/_static/copybutton.css | 42 ++++++ docs/source/_static/example_mod.js | 61 +++++++++ docs/source/_static/references.css | 23 ++++ docs/source/conf.py | 44 ++++-- docs/source/cugraph_blogs.rst | 1 + docs/source/cugraph_intro.md | 22 +++ docs/source/cugraph_intro.rst | 13 -- docs/source/images/Nx_Cg_1.png | Bin 0 -> 69661 bytes docs/source/images/Nx_Cg_2.png | Bin 0 -> 49831 bytes docs/source/index.rst | 4 +- docs/source/nx_transition.rst | 198 +++++++++++++++++++++++++++ docs/source/sphinxext/github_link.py | 146 ++++++++++++++++++++ 13 files changed, 527 insertions(+), 29 deletions(-) create mode 100644 docs/source/_static/copybutton.css create mode 100644 docs/source/_static/example_mod.js create mode 100644 docs/source/_static/references.css create mode 100644 docs/source/cugraph_intro.md delete mode 100644 docs/source/cugraph_intro.rst create mode 100644 docs/source/images/Nx_Cg_1.png create mode 100644 docs/source/images/Nx_Cg_2.png create mode 100644 docs/source/nx_transition.rst create mode 100644 docs/source/sphinxext/github_link.py diff --git a/docs/Makefile b/docs/Makefile index e88382797..9c35aa6fc 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -7,6 +7,7 @@ SPHINXBUILD = sphinx-build SPHINXPROJ = cuGraph SOURCEDIR = source BUILDDIR = build +IMGDIR = images # Put it first so that "make" without argument is like "make help". help: @@ -18,3 +19,4 @@ help: # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + cp -r $(SOURCEDIR)/$(IMGDIR) $(BUILDDIR)/html diff --git a/docs/source/_static/copybutton.css b/docs/source/_static/copybutton.css new file mode 100644 index 000000000..5eef6e366 --- /dev/null +++ b/docs/source/_static/copybutton.css @@ -0,0 +1,42 @@ +/* This contains code with copyright by the scikit-learn project, subject to +the license in /thirdparty/LICENSES/LICENSE.scikit_learn */ + +/* copybutton */ +/* Adds "Show/Hide Output" button to Examples */ + +.copybutton { + cursor: pointer; + position: absolute; + top: 0px; + right: 0px; + border: 1px solid rgb(221, 221, 221); + color: rgb(221, 221, 221); + font-family: monospace; + padding-left: 0.2rem; + padding-right: 0.2rem; +} + +div.highlight:hover span.copybutton::after { + background: #3F556B; + border-radius: 0.25rem; + color: white; + content: attr(title); + padding: 0.25rem; + position: absolute; + z-index: 98; + width: 100px; + font-size: 0.7rem; + top: 0; + right: 0; +} + +/* copy buttonn */ +div.highlight:hover span.copybutton { + background-color: #3F556B; + color: white; +} + +div.highlight:hover span.copybutton:hover { + background-color: #20252B; +} + diff --git a/docs/source/_static/example_mod.js b/docs/source/_static/example_mod.js new file mode 100644 index 000000000..77dc618a8 --- /dev/null +++ b/docs/source/_static/example_mod.js @@ -0,0 +1,61 @@ +// This contains code with copyright by the scikit-learn project, subject to +// the license in /thirdparty/LICENSES/LICENSE.scikit_learn + +$(document).ready(function () { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-pycon .highlight,' + + '.highlight-default .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide prompts and outputs'; + var show_text = 'Show prompts and outputs'; + + // create and add the button to all the code blocks that contain >>> + div.each(function (index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function () { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function (e) { + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre') + .find('.gt') + .nextUntil('.gp, .go') + .css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre') + .find('.gt') + .nextUntil('.gp, .go') + .css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); \ No newline at end of file diff --git a/docs/source/_static/references.css b/docs/source/_static/references.css new file mode 100644 index 000000000..225cf13ba --- /dev/null +++ b/docs/source/_static/references.css @@ -0,0 +1,23 @@ + +/* Fix references to not look like parameters */ +dl.citation > dt.label { + display: unset !important; + float: left !important; + border: unset !important; + background: unset !important; + padding: unset !important; + margin: unset !important; + font-size: unset !important; + line-height: unset !important; + padding-right: 0.5rem !important; +} + +/* Add opening bracket */ +dl.citation > dt.label > span::before { + content: "["; +} + +/* Add closing bracket */ +dl.citation > dt.label > span::after { + content: "]"; +} \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 0c8a03162..a1b7d3483 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2018, NVIDIA CORPORATION. +# Copyright (c) 2018-2020 NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by # sphinx-quickstart on Wed May 3 10:59:22 2017. @@ -21,8 +21,17 @@ # import os import sys + +# 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('../../python')) sys.path.insert(0, os.path.abspath('../..')) +from github_link import make_linkcode_resolve # noqa + # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. @@ -33,14 +42,20 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.intersphinx', + 'numpydoc', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', - 'numpydoc', - 'IPython.sphinxext.ipython_console_highlighting', - 'IPython.sphinxext.ipython_directive', + 'sphinx.ext.doctest', + 'sphinx.ext.intersphinx', + 'sphinx.ext.linkcode', + "IPython.sphinxext.ipython_console_highlighting", + "IPython.sphinxext.ipython_directive", + "nbsphinx", + "recommonmark", + "sphinx_markdown_tables", ] + ipython_mplbackend = 'str' # Add any paths that contain templates here, relative to this directory. @@ -50,7 +65,7 @@ # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = {".rst": "restructuredtext", ".md": "markdown"} # The master toctree document. master_doc = 'index' @@ -151,7 +166,7 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'cugraph.tex', 'cugraph Documentation', - 'Continuum Analytics', 'manual'), + 'nvidia', 'manual'), ] @@ -187,12 +202,13 @@ def setup(app): - app.add_stylesheet('params.css') + app.add_css_file('copybutton.css') + app.add_css_file('params.css') + app.add_css_file('references.css') -from recommonmark.parser import CommonMarkParser - -source_parsers = { - '.md': CommonMarkParser, -} -source_suffix = ['.rst', '.md'] \ No newline at end of file +# The following is used by sphinx.ext.linkcode to provide links to github +linkcode_resolve = make_linkcode_resolve( + 'cugraph', 'https://github.com/rapidsai/' + 'cugraph/blob/{revision}/python/' + '{package}/{path}#L{lineno}') \ No newline at end of file diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index a9954aee5..84e31d40a 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -22,6 +22,7 @@ BLOGS ------ * `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 `_ Media diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md new file mode 100644 index 000000000..5bf2b7154 --- /dev/null +++ b/docs/source/cugraph_intro.md @@ -0,0 +1,22 @@ + +# cuGraph Introduction + + +## 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/source/cugraph_intro.rst b/docs/source/cugraph_intro.rst deleted file mode 100644 index cd2d750e3..000000000 --- a/docs/source/cugraph_intro.rst +++ /dev/null @@ -1,13 +0,0 @@ - -cuGraph Intro ------------------------------- - - - -Graph Type - - -Algorithms - - -Using diff --git a/docs/source/images/Nx_Cg_1.png b/docs/source/images/Nx_Cg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d29f76ad4ab2ec93c784fe5afd9db2379ae7629 GIT binary patch literal 69661 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/Nx_Cg_2.png b/docs/source/images/Nx_Cg_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f685386683663b3041217e45bf977fa017caf3 GIT binary patch literal 49831 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 literal 0 HcmV?d00001 diff --git a/docs/source/index.rst b/docs/source/index.rst index 2cd95e7f1..93184f40b 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -5,12 +5,12 @@ Welcome to cugraph's documentation! :maxdepth: 4 :caption: Contents: + cugraph_intro.md api.rst dask-cugraph.rst - cugraph_intro.rst cugraph_blogs.rst cugraph_ref.rst - + nx_transition.rst Indices and tables ================== diff --git a/docs/source/nx_transition.rst b/docs/source/nx_transition.rst new file mode 100644 index 000000000..6c57ab89c --- /dev/null +++ b/docs/source/nx_transition.rst @@ -0,0 +1,198 @@ +************************************** +NetworkX Compatibility and Transition +************************************** + +*Note: this is a work in progress and will be updatred and changed as we better flesh out +compatibility issues* + +One of the goals of RAPIDS cuGraph is to mimic the NetworkX API to simplify +the transition to accelerated GPU data science. However, graph analysis, +also called network science, like most other data science workflow, is more +than just running an algorithm. Graph data requires cleaning and prep (ETL) +and then the construction of a graph object; that is all before the execution +of a graph algorithm. RAPIDS and cuGraph allow a portion or the complete +analytic workflow to be accelerated. To achieve the maximum amount of +acceleration, we encourage fully replacing existing code with cuGraph. +But sometimes it is easier to replace just a portion. + +Last Update +########### + +Last Update: Oct 14th, 2020 +Release: 0.16 + +Information on `NetworkX `_ + +This transition guide in an expansion of the Medium Blog on `NetworkX Compatibility +`_ + + +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. + +In the following example, the cuGraph module is being imported as “cnx”. +While module can be assigned any name can be used, we picked cnx to reduce +the amount of text to be changed. The text highlighted in yellow indicates +changes. + +.. 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/source/sphinxext/github_link.py b/docs/source/sphinxext/github_link.py new file mode 100644 index 000000000..a7a46fdd9 --- /dev/null +++ b/docs/source/sphinxext/github_link.py @@ -0,0 +1,146 @@ +# This contains code with copyright by the scikit-learn project, subject to the +# license in /thirdparty/LICENSES/LICENSE.scikit_learn + +import inspect +import os +import re +import subprocess +import sys +from functools import partial +from operator import attrgetter + +orig = inspect.isfunction + + +# See https://opendreamkit.org/2017/06/09/CythonSphinx/ +def isfunction(obj): + + orig_val = orig(obj) + + new_val = hasattr(type(obj), "__code__") + + if (orig_val != new_val): + return new_val + + return orig_val + + +inspect.isfunction = isfunction + +REVISION_CMD = 'git rev-parse --short HEAD' + +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') + return None + return revision.decode('utf-8') + + +def _linkcode_resolve(domain, info, package, url_fmt, revision): + """Determine a link to online source for a class/method/function + + This is called by sphinx.ext.linkcode + + An example with a long-untouched module that everyone has + >>> _linkcode_resolve('py', {'module': 'tty', + ... 'fullname': 'setraw'}, + ... package='tty', + ... url_fmt='http://hg.python.org/cpython/file/' + ... '{revision}/Lib/{package}/{path}#L{lineno}', + ... revision='xxxx') + 'http://hg.python.org/cpython/file/xxxx/Lib/tty/tty.py#L18' + """ + + if revision is None: + return + if domain not in ('py', 'pyx'): + return + 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) + + # Unwrap the object to get the correct source + # file in case that is wrapped by a decorator + obj = inspect.unwrap(obj) + + fn: str = None + lineno: str = None + + try: + fn = inspect.getsourcefile(obj) + except Exception: + fn = None + if not fn: + try: + fn = inspect.getsourcefile(sys.modules[obj.__module__]) + except Exception: + fn = None + + if not fn: + # Possibly Cython code. Search docstring for source + m = source_regex.search(obj.__doc__) + + if (m is not None): + source_file = m.group(1) + lineno = m.group(2) + + # fn is expected to be the absolute path. + fn = os.path.relpath(source_file, start=package) + print("{}:{}".format( + os.path.abspath(os.path.join("..", "python", "cuml", fn)), + lineno)) + else: + return + else: + # Test if we are absolute or not (pyx are relative) + if (not os.path.isabs(fn)): + # Should be relative to docs right now + fn = os.path.abspath(os.path.join("..", "python", fn)) + + # Convert to relative from module root + fn = os.path.relpath(fn, + start=os.path.dirname( + __import__(package).__file__)) + + # Get the line number if we need it. (Can work without it) + 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__")): + lineno = obj.__code__.co_firstlineno + else: + lineno = '' + return url_fmt.format(revision=revision, + package=package, + path=fn, + lineno=lineno) + + +def make_linkcode_resolve(package, url_fmt): + """Returns a linkcode_resolve function for the given URL format + + revision is a git commit reference (hash or name) + + package is the name of the root module of the package + + url_fmt is along the lines of ('https://github.com/USER/PROJECT/' + 'blob/{revision}/{package}/' + '{path}#L{lineno}') + """ + revision = _get_git_revision() + return partial(_linkcode_resolve, + revision=revision, + package=package, + url_fmt=url_fmt) From 9f73e5fe8780e43a8d2703901a1d8690ab9b332e Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 21 Oct 2020 12:41:58 -0700 Subject: [PATCH 116/384] REL v0.16.0 release From a8efc534dc7a1c943642abaabca009e098fee357 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 6 Nov 2020 11:13:16 -0900 Subject: [PATCH 117/384] REL v0.16.1 release --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index a1b7d3483..5ea710fa8 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -82,7 +82,7 @@ # The short X.Y version. version = '0.16' # The full version, including alpha/beta/rc tags. -release = '0.16.0' +release = '0.16.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 78897f8f9cd69399d26b8c26722494d27f78bbbf Mon Sep 17 00:00:00 2001 From: Ishika Roy Date: Fri, 20 Nov 2020 09:28:59 -0600 Subject: [PATCH 118/384] update notebooks --- notebooks/demo/batch_betweenness.ipynb | 2 +- notebooks/demo/mg_pagerank.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb index c2fb52279..e2ad83ff1 100644 --- a/notebooks/demo/batch_betweenness.ipynb +++ b/notebooks/demo/batch_betweenness.ipynb @@ -231,7 +231,7 @@ "source": [ "cluster = dask_cuda.LocalCUDACluster()\n", "client = dask.distributed.Client(cluster)\n", - "Comms.initialize()" + "Comms.initialize(p2p=True)" ] }, { diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index d333580ba..a0db55eda 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -117,7 +117,7 @@ "source": [ "cluster = LocalCUDACluster()\n", "client = Client(cluster)\n", - "Comms.initialize()" + "Comms.initialize(p2p=True)" ] }, { @@ -317,4 +317,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} From ce4794090cecf5f2c0ab68be12a60e61e9f47f81 Mon Sep 17 00:00:00 2001 From: AJ Schmidt Date: Tue, 24 Nov 2020 15:45:03 -0500 Subject: [PATCH 119/384] DOC v0.18 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index adec59a2f..6b484a5f5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '0.17' +version = '0.18' # The full version, including alpha/beta/rc tags. -release = '0.17.0' +release = '0.18.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 373ffef0da2a04b7f83356802dcada10f7ab9d30 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 1 Dec 2020 16:52:26 -0500 Subject: [PATCH 120/384] Update README and some docs(#1281) Update the README with new algorithms and multi-gpu status Also cleaned up a few other stops Authors: - BradReesWork Approvers: - Alex Fender - Alex Fender URL: https://github.com/rapidsai/cugraph/pull/1281 --- docs/source/cugraph_ref.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/source/cugraph_ref.rst b/docs/source/cugraph_ref.rst index 0742d5f5a..591619fb3 100644 --- a/docs/source/cugraph_ref.rst +++ b/docs/source/cugraph_ref.rst @@ -1,30 +1,35 @@ +########## References -=============== +########## +********** 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 -------------------------- - 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, “*ast 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. +| +| - +********** 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). From b1a9b167cedb531c3f904ac190644745ff9979d3 Mon Sep 17 00:00:00 2001 From: Alex Fender Date: Tue, 1 Dec 2020 20:37:26 -0600 Subject: [PATCH 121/384] Update api.rst for MST(#1289) Authors: - Alex Fender Approvers: - Brad Rees URL: https://github.com/rapidsai/cugraph/pull/1289 --- docs/source/api.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index d334b488d..459e5fbf4 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -210,8 +210,20 @@ Single-source-shortest-path :undoc-members: -Utilities +Tree ========= +Minimum Spanning Tree +--------------------- +.. automodule:: cugraph.tree.minimum_spanning_tree + :members: + :undoc-members: + +Maximum Spanning Tree +--------------------- + +.. automodule:: cugraph.tree.maximum_spanning_tree + :members: + :undoc-members: From 62e32371daac6ec84584d3a66ae557b3cc5988ea Mon Sep 17 00:00:00 2001 From: Ishika Roy Date: Mon, 7 Dec 2020 23:27:57 -0600 Subject: [PATCH 122/384] update doc and notebook --- notebooks/demo/mg_pagerank.ipynb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index a0db55eda..db1f69ccb 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -163,13 +163,10 @@ "source": [ "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", "G = cugraph.DiGraph()\n", - "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst', renumber=False)\n", - "\n", - "# (optional) request the transposed here so that we can analyse pagerank solver time alone\n", - "G.compute_local_data(by='dst')\n", + "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst')\n", "\n", "# Print time\n", - "print(\"Read, load and transpose: \", time.time()-t_start, \"s\")" + "print(\"Read, load and renumber: \", time.time()-t_start, \"s\")" ] }, { From 8b7f4167d551e7b642739c68e600cd028f4492b0 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Thu, 10 Dec 2020 12:54:24 -0900 Subject: [PATCH 123/384] REL v0.17.0 release From 5359350e92fe0248c5224f345c96a4bcf97e38d7 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Mon, 11 Jan 2021 14:13:58 -0500 Subject: [PATCH 124/384] drop duplicate edge centrality entry --- docs/source/api.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index 459e5fbf4..b36fc6449 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -40,13 +40,6 @@ Betweenness Centrality :members: :undoc-members: -Edge Betweenness Centrality ---------------------------- - -.. automodule:: cugraph.centrality.edge_betweenness_centrality - :members: - :undoc-members: - Katz Centrality --------------- From 61f2ea8c5dd49dce2b84efd08ab8ff6e5b0bf2af Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Mon, 11 Jan 2021 14:14:09 -0500 Subject: [PATCH 125/384] added more introp doc --- docs/source/cugraph_intro.md | 66 +++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md index 5bf2b7154..073e13d37 100644 --- a/docs/source/cugraph_intro.md +++ b/docs/source/cugraph_intro.md @@ -1,8 +1,72 @@ # 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. -## Terminology +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 20x 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. + +Every release of RAPIDS is accompanied with one or more wonderful BLOG(s) +about the features of that release (for example, see the release 0.8 blog [1] +or Life after Hadoop). This article is slightly different. While current +features will be discussed, the main focus is on presenting the vision of +cuGraph and how we envision users will interact with the libraries. The cuGraph +team has been working hard to provide a rich set of initial features. Over the +past three releases (RAPIDS release 0.6 was the first to include cuGraph), the +team has provided over a dozen algorithms. The initial goal was to simply get +graph analytics released and available with a familiar NetworkX-like API. That +is great in the short term since it allows an easy path to switch to RAPIDS. +However, cuGraph development will slowly shift towards improving ease-of-use, +interoperability, and integration with the rest of RAPIDS. That is not an easy +task since there is still so much to be added to the cuGraph ecosystem. Don’t +worry, the goal of getting new analytics out will continue since there is a very +long list of algorithms to release. + + + +# Terminology cuGraph is a collection of GPU accelerated graph algorithms and graph utility functions. The application of graph analysis covers a lot of areas. From 84334c66ac1ae1c35cd5f824d0f672001885a6cd Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 13 Jan 2021 15:32:29 -0500 Subject: [PATCH 126/384] updated intro --- docs/source/cugraph_intro.md | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md index 073e13d37..cbbb9ef4e 100644 --- a/docs/source/cugraph_intro.md +++ b/docs/source/cugraph_intro.md @@ -48,23 +48,6 @@ 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. -Every release of RAPIDS is accompanied with one or more wonderful BLOG(s) -about the features of that release (for example, see the release 0.8 blog [1] -or Life after Hadoop). This article is slightly different. While current -features will be discussed, the main focus is on presenting the vision of -cuGraph and how we envision users will interact with the libraries. The cuGraph -team has been working hard to provide a rich set of initial features. Over the -past three releases (RAPIDS release 0.6 was the first to include cuGraph), the -team has provided over a dozen algorithms. The initial goal was to simply get -graph analytics released and available with a familiar NetworkX-like API. That -is great in the short term since it allows an easy path to switch to RAPIDS. -However, cuGraph development will slowly shift towards improving ease-of-use, -interoperability, and integration with the rest of RAPIDS. That is not an easy -task since there is still so much to be added to the cuGraph ecosystem. Don’t -worry, the goal of getting new analytics out will continue since there is a very -long list of algorithms to release. - - # Terminology From d8604692d2148c3f76f1f02d76593e3bfad9d577 Mon Sep 17 00:00:00 2001 From: BradReesWork Date: Wed, 13 Jan 2021 16:03:01 -0500 Subject: [PATCH 127/384] updated perf gain --- docs/source/cugraph_intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/cugraph_intro.md b/docs/source/cugraph_intro.md index cbbb9ef4e..142395fb7 100644 --- a/docs/source/cugraph_intro.md +++ b/docs/source/cugraph_intro.md @@ -35,7 +35,7 @@ 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 20x faster on average over NetworkX. +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 From 8224036e080eacf25967d6d047c14868c1981119 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Wed, 27 Jan 2021 13:52:59 -0500 Subject: [PATCH 128/384] DOC v0.19 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 6b484a5f5..eb4745a61 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '0.18' +version = '0.19' # The full version, including alpha/beta/rc tags. -release = '0.18.0' +release = '0.19.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From a23f51ff56bd7fc96773655fcbd63c95c05af475 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 3 Feb 2021 15:42:49 -0500 Subject: [PATCH 129/384] Update the conda environments and README file (#1369) updated the conda environments to have cmake 3.18 and update the README file Authors: - Brad Rees (@BradReesWork) Approvers: - AJ Schmidt (@ajschmidt8) - Rick Ratzel (@rlratzel) - Alex Fender (@afender) URL: https://github.com/rapidsai/cugraph/pull/1369 --- docs/source/cugraph_blogs.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/cugraph_blogs.rst b/docs/source/cugraph_blogs.rst index 84e31d40a..cbbc93a1b 100644 --- a/docs/source/cugraph_blogs.rst +++ b/docs/source/cugraph_blogs.rst @@ -23,6 +23,12 @@ BLOGS * `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 `_ + +2021 +------ + * + Media From a63193fe723891711e0753ef88ab979ff01940a2 Mon Sep 17 00:00:00 2001 From: Alex Fender Date: Thu, 4 Feb 2021 15:14:43 -0600 Subject: [PATCH 130/384] EgoNet (#1365) ### Description Let the egonet graph of a node x be the subgraph that includes the neighborhood of x and all edges between them. Here is a basic description (1-hop, single seed) : - Add center node x to the graph. - Go through all the neighbors y of this center node x, add edge (x, y) to the graph. - For each neighbor y of center node x, go through all the neighbors z of center node x, if there is an edge between y and z in the original graph, add edge (y, z) to our new graph. ### Proposed solution Rather than doing custom one/two hops features, we propose a generic k-hops solution leveraging BFS with cutoff to identify neighbors within a given radius. In addition to the single source version (matching what's available in Nx), we propose to handle multiple sources (seeds) at once which allows better performances. This PR also enables a path in the experimental stack for returning multiple graphs (edge list format) from CUDA prims to python without using the legacy classes. As future work, we want to enable concurrency for the cutoff BFS for each seed. This is dependent of #957 Close #475 Authors: - Alex Fender (@afender) - @Iroy30 Approvers: - @Iroy30 - Brad Rees (@BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/1365 --- docs/source/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index b36fc6449..dcdf3e6ff 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -51,6 +51,13 @@ Katz Centrality Community ========= +EgoNet +------------------------------------ + +.. automodule:: cugraph.community.egonet + :members: + :undoc-members: + Ensemble clustering for graphs (ECG) ------------------------------------ From 164c793aed01d09567e5697edef9ff4704af1610 Mon Sep 17 00:00:00 2001 From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com> Date: Fri, 5 Feb 2021 14:43:30 -0500 Subject: [PATCH 131/384] Build a Dendrogram class, adapt Louvain/Leiden/ECG to use it (#1359) Preparing for MNMG Leiden and ECG identified an area for code cleanup. The original cuGraph implementation of Louvain would flatten the hierarchical clustering as it was computed, filling (and returning) the final clustering. This adds an awkward step in the middle of the Louvain computation. Additionally, since Louvain (and Leiden and ECG which derive from it) is actually a hierarchical clustering algorithm it would be nice to generate the actual Dendrogram. This PR implements a Dendrogram class, a function for flattening the Dendrogram, and modifies Louvain, Leiden and ECG to use the Dendrogram class. It was suggested that the Dendrogram class could be moved to raft, decided to defer that until later, it's easy enough to move. Authors: - Chuck Hastings (@ChuckHastings) Approvers: - Alex Fender (@afender) - Brad Rees (@BradReesWork) - Andrei Schaffer (@aschaffer) - Rick Ratzel (@rlratzel) - AJ Schmidt (@ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/1359 --- notebooks/cugraph_benchmarks/bfs_benchmark.ipynb | 1 + notebooks/cugraph_benchmarks/louvain_benchmark.ipynb | 1 + notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb | 1 + notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb | 1 + notebooks/cugraph_benchmarks/release.ipynb | 1 + notebooks/cugraph_benchmarks/sssp_benchmark.ipynb | 1 + notebooks/demo/uvm.ipynb | 1 + 7 files changed, 7 insertions(+) diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb index 58eb94bf0..6ae695e20 100644 --- a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# BFS Performance Benchmarking\n", + "# Skip notebook test\n", "\n", "This notebook benchmarks performance of running BFS within cuGraph against NetworkX. \n", "\n", diff --git a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb index a12b7c4bc..00e99a286 100644 --- a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# Louvain Performance Benchmarking\n", + "# Skip notebook test\n", "\n", "This notebook benchmarks performance improvement of running the Louvain clustering algorithm within cuGraph against NetworkX. The test is run over eight test networks (graphs) and then results plotted. \n", "

\n", diff --git a/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb b/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb index 6f76868f9..403c317ac 100644 --- a/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb +++ b/notebooks/cugraph_benchmarks/nx_cugraph_bc_benchmarking.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# Benchmarking NetworkX compatibility\n", + "# Skip notebook test\n", "This notebook benchmark the use of a NetworkX Graph object as input into algorithms.

\n", "The intention of the feature is to be able to drop cuGraph into existing NetworkX code in spot where performance is not optimal.\n", "\n", diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb index c2933a10c..d0416efdd 100644 --- a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# PageRank Performance Benchmarking\n", + "# Skip notebook test\n", "\n", "This notebook benchmarks performance of running PageRank within cuGraph against NetworkX. NetworkX contains several implementations of PageRank. This benchmark will compare cuGraph versus the defaukt Nx implementation as well as the SciPy version\n", "\n", diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index d3110da36..3c6da55ab 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# Release Benchmarking\n", + "# Skip notebook test\n", "\n", "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n", "This notebook, starting with release 0.15, runs all the various algorithms to computes the performance gain. \n", diff --git a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb index 2d040e0ac..32b562e7a 100644 --- a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb @@ -5,6 +5,7 @@ "metadata": {}, "source": [ "# SSSP Performance Benchmarking\n", + "# Skip notebook test\n", "\n", "This notebook benchmarks performance of running SSSP within cuGraph against NetworkX. \n", "\n", diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index d279be8ed..8fa2b08b6 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -6,6 +6,7 @@ "source": [ "# Oversubscribing GPU memory in cuGraph\n", "#### Author : Alex Fender\n", + "# Skip notebook test\n", "\n", "In this notebook, we will show how to **scale to 4x larger graphs than before** without incurring a performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", "\n", From c4e56d481521e1d8af1d8d7bc2274aa14ba2e8e5 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 24 Feb 2021 13:41:52 -0800 Subject: [PATCH 132/384] REL v0.18.0 release From 7f0a43b420cccca13ca93b215d5508bbad3ace14 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 17 Mar 2021 12:17:46 -0400 Subject: [PATCH 133/384] Updating docs (#1448) * added Hungarian to api.rst * fixed missing examples * fixed syntax Authors: - Brad Rees (@BradReesWork) Approvers: - Rick Ratzel (@rlratzel) - Alex Fender (@afender) URL: https://github.com/rapidsai/cugraph/pull/1448 --- docs/source/api.rst | 62 +++++++++++++++++++++++++++++++ docs/source/dask-cugraph.rst | 71 ++++++++++++++---------------------- 2 files changed, 89 insertions(+), 44 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index dcdf3e6ff..b02f8f488 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -48,6 +48,13 @@ Katz Centrality :undoc-members: +Katz Centrality (MG) +-------------------- + +.. automodule:: cugraph.dask.centrality.katz_centrality + :members: + :undoc-members: + Community ========= @@ -86,6 +93,14 @@ Louvain :members: :undoc-members: +Louvain (MG) +------------ + +.. automodule:: cugraph.dask.community.louvain + :members: + :undoc-members: + + Spectral Clustering ------------------- @@ -148,6 +163,17 @@ Force Atlas 2 :undoc-members: +Linear Assignment +================= + +Hungarian +------------- + +.. automodule:: cugraph.linear_assignment.hungarian + :members: + :undoc-members: + + Link Analysis ============= @@ -165,6 +191,13 @@ Pagerank :members: :undoc-members: +Pagerank (MG) +--------- + +.. automodule:: cugraph.dask.link_analysis.pagerank + :members: pagerank + :undoc-members: + Link Prediction =============== @@ -202,6 +235,13 @@ Breadth-first-search :members: :undoc-members: +Breadth-first-search (MG) +-------------------- + +.. automodule:: cugraph.dask.traversal.bfs + :members: + :undoc-members: + Single-source-shortest-path --------------------------- @@ -209,6 +249,13 @@ Single-source-shortest-path :members: :undoc-members: +Single-source-shortest-path (MG) +--------------------------- + +.. automodule:: cugraph.dask.traversal.sssp + :members: + :undoc-members: + Tree ========= @@ -227,3 +274,18 @@ Maximum Spanning Tree :members: :undoc-members: + +DASK MG Helper functions +=========================== + +.. automodule:: cugraph.comms.comms + :members: initialize + :undoc-members: + +.. automodule:: cugraph.comms.comms + :members: destroy + :undoc-members: + +.. automodule:: cugraph.dask.common.read_utils + :members: get_chunksize + :undoc-members: diff --git a/docs/source/dask-cugraph.rst b/docs/source/dask-cugraph.rst index b27ad3828..51487bfbf 100644 --- a/docs/source/dask-cugraph.rst +++ b/docs/source/dask-cugraph.rst @@ -13,58 +13,41 @@ With cuGraph and Dask, whether you’re using a single NVIDIA GPU or multiple no If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. +Example +======== -Distributed Graph Algorithms ----------------------------- +.. code-block:: python -.. automodule:: cugraph.dask.link_analysis.pagerank - :members: pagerank - :undoc-members: + from dask.distributed import Client, wait + from dask_cuda import LocalCUDACluster + import cugraph.comms as Comms + import cugraph.dask as dask_cugraph -.. automodule:: cugraph.dask.traversal.bfs - :members: bfs - :undoc-members: + cluster = LocalCUDACluster() + client = Client(cluster) + Comms.initialize(p2p=True) + # Helper function to set the reader chunk size to automatically get one partition per GPU + chunksize = dask_cugraph.get_chunksize(input_data_path) -Helper functions ----------------- + # Multi-GPU CSV reader + e_list = dask_cudf.read_csv(input_data_path, + chunksize = chunksize, + delimiter=' ', + names=['src', 'dst'], + dtype=['int32', 'int32']) -.. automodule:: cugraph.comms.comms - :members: initialize - :undoc-members: + G = cugraph.DiGraph() + G.from_dask_cudf_edgelist(e_list, source='src', destination='dst') -.. automodule:: cugraph.comms.comms - :members: destroy - :undoc-members: + # now run PageRank + pr_df = dask_cugraph.pagerank(G, tol=1e-4) -.. automodule:: cugraph.dask.common.read_utils - :members: get_chunksize - :undoc-members: + # All done, clean up + Comms.destroy() + client.close() + cluster.close() -Consolidation -============= -cuGraph can transparently interpret the Dask cuDF Dataframe as a regular Dataframe when loading the edge list. This is particularly helpful for workflows extracting a single GPU sized edge list from a distributed dataset. From there any existing single GPU feature will just work on this input. +| -For instance, consolidation allows leveraging Dask cuDF CSV reader to load file(s) on multiple GPUs and consolidate this input to a single GPU graph. Reading is often the time and memory bottleneck, with this feature users can call the Multi-GPU version of the reader without changing anything else. - -Batch Processing -================ - -cuGraph can leverage multi GPUs to increase processing speed for graphs that fit on a single GPU, providing faster analytics on such graphs. -You will be able to use the Graph the same way as you used to in a Single GPU environment, but analytics that support batch processing will automatically use the GPUs available to the dask client. -For example, Betweenness Centrality scores can be slow to obtain depending on the number of vertices used in the approximation. Thank to Multi GPUs Batch Processing, -you can create Single GPU graph as you would regularly do it using cuDF CSV reader, enable Batch analytics on it, and obtain scores much faster as each GPU will handle a sub-set of the sources. -In order to use Batch Analytics you need to set up a Dask Cluster and Client in addition to the cuGraph communicator, then you can simply call `enable_batch()` on you graph, and algorithms supporting batch processing will use multiple GPUs. - -Algorithms supporting Batch Processing --------------------------------------- -.. automodule:: cugraph.centrality - :members: betweenness_centrality - :undoc-members: - :noindex: - -.. automodule:: cugraph.centrality - :members: edge_betweenness_centrality - :undoc-members: - :noindex: From a5fa9bb45417aee742f1b08042d95679a49a5325 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 25 Mar 2021 14:19:09 -0400 Subject: [PATCH 134/384] DOC v0.20 Updates --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index eb4745a61..77053a346 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '0.19' +version = '0.20' # The full version, including alpha/beta/rc tags. -release = '0.19.0' +release = '0.20.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From ca960553afb18bc12dddb9c6fd6ae684ad82f2ce Mon Sep 17 00:00:00 2001 From: Joseph Nke <76006812+jnke2016@users.noreply.github.com> Date: Wed, 7 Apr 2021 18:51:32 -0500 Subject: [PATCH 135/384] Random Walks - Python Bindings (#1516) Python bindings for random walks closes #1488 check the rendering after the PR is merged to make sure everything render as expected Authors: - Joseph Nke (https://github.com/jnke2016) Approvers: - Brad Rees (https://github.com/BradReesWork) - Andrei Schaffer (https://github.com/aschaffer) - Alex Fender (https://github.com/afender) URL: https://github.com/rapidsai/cugraph/pull/1516 --- docs/source/api.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/source/api.rst b/docs/source/api.rst index b02f8f488..b9b8ea485 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -225,6 +225,17 @@ Overlap Coefficient :undoc-members: +Sampling +======== + +Random Walks +------------ + +.. automodule:: cugraph.sampling.random_walks + :members: + :undoc-members: + + Traversal ========= From 8a8a3ec88e5aef4e0a47f900ec40af2305266b86 Mon Sep 17 00:00:00 2001 From: Ayush Dattagupta Date: Thu, 8 Apr 2021 09:53:50 -0700 Subject: [PATCH 136/384] Update docs and remove all warnings (#1521) This pr fixes the following - Add traveling salesperson problem to the docs - Update docs to address all build warnings To remove some warnings. updated the use of `NOTE:` in cases like the one shown below. | Old | New | | ------------- | ------------- | | ![image](https://user-images.githubusercontent.com/19949207/113936070-283a2380-97ac-11eb-9705-9f261c965fa9.png) | ![image](https://user-images.githubusercontent.com/19949207/113935703-b06bf900-97ab-11eb-93a4-7df2f711c1aa.png) | Authors: - Ayush Dattagupta (https://github.com/ayushdg) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/1521 --- docs/source/api.rst | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/source/api.rst b/docs/source/api.rst index b9b8ea485..e2c2c19cf 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -192,7 +192,7 @@ Pagerank :undoc-members: Pagerank (MG) ---------- +------------- .. automodule:: cugraph.dask.link_analysis.pagerank :members: pagerank @@ -247,7 +247,7 @@ Breadth-first-search :undoc-members: Breadth-first-search (MG) --------------------- +------------------------- .. automodule:: cugraph.dask.traversal.bfs :members: @@ -261,12 +261,19 @@ Single-source-shortest-path :undoc-members: Single-source-shortest-path (MG) ---------------------------- +-------------------------------- .. automodule:: cugraph.dask.traversal.sssp :members: :undoc-members: +Traveling-salesperson-problem +----------------------------- + +.. automodule:: cugraph.traversal.traveling_salesperson + :members: + :undoc-members: + Tree ========= @@ -275,27 +282,25 @@ Minimum Spanning Tree --------------------- .. automodule:: cugraph.tree.minimum_spanning_tree - :members: + :members: minimum_spanning_tree :undoc-members: Maximum Spanning Tree --------------------- -.. automodule:: cugraph.tree.maximum_spanning_tree - :members: +.. automodule:: cugraph.tree.minimum_spanning_tree + :members: maximum_spanning_tree :undoc-members: + :noindex: -DASK MG Helper functions +DASK MG Helper functions =========================== .. automodule:: cugraph.comms.comms - :members: initialize - :undoc-members: - -.. automodule:: cugraph.comms.comms - :members: destroy + :members: initialize, destroy :undoc-members: + :member-order: bysource .. automodule:: cugraph.dask.common.read_utils :members: get_chunksize From 15a0e40e79ae972622ea0147fba3a5369519faa5 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:39:03 -0500 Subject: [PATCH 137/384] Fixed copyright date and format. (#1526) Update copyright data and format Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/1526 --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index eb4745a61..3422428c9 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2018-2020 NVIDIA CORPORATION. +# Copyright (c) 2018-2021, NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by # sphinx-quickstart on Wed May 3 10:59:22 2017. From ec3f007dbe11dfde5fd35e1acf76d043b593cfdf Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Fri, 16 Apr 2021 09:15:49 -0400 Subject: [PATCH 138/384] Reorganized docs and environment files (#1537) * reorganized docs so that information is under ./docs/cugraph that better matches the rest of rapids * Updated yml files * removed unneeded packages in the yml files * drop old notebook * marked FA2 notebook as skip Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) - https://github.com/Iroy30 URL: https://github.com/rapidsai/cugraph/pull/1537 --- docs/{ => cugraph}/Makefile | 0 docs/{ => cugraph}/README.md | 0 docs/{ => cugraph}/make.bat | 0 docs/{ => cugraph}/requirement.txt | 0 docs/{ => cugraph}/source/_static/EMPTY | 0 .../source/_static/copybutton.css | 0 .../source/_static/copybutton_pydocs.js | 65 ++++++++++++++++++ .../source/_static/example_mod.js | 0 docs/{ => cugraph}/source/_static/params.css | 0 .../source/_static/references.css | 0 docs/{ => cugraph}/source/api.rst | 0 docs/{ => cugraph}/source/conf.py | 10 +-- docs/{ => cugraph}/source/cugraph_blogs.rst | 0 docs/{ => cugraph}/source/cugraph_intro.md | 0 docs/{ => cugraph}/source/cugraph_ref.rst | 30 ++++++-- docs/{ => cugraph}/source/dask-cugraph.rst | 0 docs/{ => cugraph}/source/images/Nx_Cg_1.png | Bin docs/{ => cugraph}/source/images/Nx_Cg_2.png | Bin docs/{ => cugraph}/source/index.rst | 0 docs/{ => cugraph}/source/nx_transition.rst | 0 .../source/sphinxext/github_link.py | 14 ++++ 21 files changed, 110 insertions(+), 9 deletions(-) rename docs/{ => cugraph}/Makefile (100%) rename docs/{ => cugraph}/README.md (100%) rename docs/{ => cugraph}/make.bat (100%) rename docs/{ => cugraph}/requirement.txt (100%) rename docs/{ => cugraph}/source/_static/EMPTY (100%) rename docs/{ => cugraph}/source/_static/copybutton.css (100%) create mode 100644 docs/cugraph/source/_static/copybutton_pydocs.js rename docs/{ => cugraph}/source/_static/example_mod.js (100%) rename docs/{ => cugraph}/source/_static/params.css (100%) rename docs/{ => cugraph}/source/_static/references.css (100%) rename docs/{ => cugraph}/source/api.rst (100%) rename docs/{ => cugraph}/source/conf.py (98%) rename docs/{ => cugraph}/source/cugraph_blogs.rst (100%) rename docs/{ => cugraph}/source/cugraph_intro.md (100%) rename docs/{ => cugraph}/source/cugraph_ref.rst (61%) rename docs/{ => cugraph}/source/dask-cugraph.rst (100%) rename docs/{ => cugraph}/source/images/Nx_Cg_1.png (100%) rename docs/{ => cugraph}/source/images/Nx_Cg_2.png (100%) rename docs/{ => cugraph}/source/index.rst (100%) rename docs/{ => cugraph}/source/nx_transition.rst (100%) rename docs/{ => cugraph}/source/sphinxext/github_link.py (88%) diff --git a/docs/Makefile b/docs/cugraph/Makefile similarity index 100% rename from docs/Makefile rename to docs/cugraph/Makefile diff --git a/docs/README.md b/docs/cugraph/README.md similarity index 100% rename from docs/README.md rename to docs/cugraph/README.md diff --git a/docs/make.bat b/docs/cugraph/make.bat similarity index 100% rename from docs/make.bat rename to docs/cugraph/make.bat diff --git a/docs/requirement.txt b/docs/cugraph/requirement.txt similarity index 100% rename from docs/requirement.txt rename to docs/cugraph/requirement.txt diff --git a/docs/source/_static/EMPTY b/docs/cugraph/source/_static/EMPTY similarity index 100% rename from docs/source/_static/EMPTY rename to docs/cugraph/source/_static/EMPTY diff --git a/docs/source/_static/copybutton.css b/docs/cugraph/source/_static/copybutton.css similarity index 100% rename from docs/source/_static/copybutton.css rename to docs/cugraph/source/_static/copybutton.css diff --git a/docs/cugraph/source/_static/copybutton_pydocs.js b/docs/cugraph/source/_static/copybutton_pydocs.js new file mode 100644 index 000000000..cec05777e --- /dev/null +++ b/docs/cugraph/source/_static/copybutton_pydocs.js @@ -0,0 +1,65 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-pycon .highlight,' + + '.highlight-default .highlight'); + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '1.5em', + 'border-radius': '0 3px 0 0', + 'transition': "0.5s" + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); + diff --git a/docs/source/_static/example_mod.js b/docs/cugraph/source/_static/example_mod.js similarity index 100% rename from docs/source/_static/example_mod.js rename to docs/cugraph/source/_static/example_mod.js diff --git a/docs/source/_static/params.css b/docs/cugraph/source/_static/params.css similarity index 100% rename from docs/source/_static/params.css rename to docs/cugraph/source/_static/params.css diff --git a/docs/source/_static/references.css b/docs/cugraph/source/_static/references.css similarity index 100% rename from docs/source/_static/references.css rename to docs/cugraph/source/_static/references.css diff --git a/docs/source/api.rst b/docs/cugraph/source/api.rst similarity index 100% rename from docs/source/api.rst rename to docs/cugraph/source/api.rst diff --git a/docs/source/conf.py b/docs/cugraph/source/conf.py similarity index 98% rename from docs/source/conf.py rename to docs/cugraph/source/conf.py index 5e87622bd..a4633d04f 100644 --- a/docs/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -42,17 +42,17 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'numpydoc', - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', + "sphinx.ext.intersphinx", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "numpydoc", + "sphinx_markdown_tables", 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', 'sphinx.ext.linkcode', "IPython.sphinxext.ipython_console_highlighting", "IPython.sphinxext.ipython_directive", "nbsphinx", "recommonmark", - "sphinx_markdown_tables", ] diff --git a/docs/source/cugraph_blogs.rst b/docs/cugraph/source/cugraph_blogs.rst similarity index 100% rename from docs/source/cugraph_blogs.rst rename to docs/cugraph/source/cugraph_blogs.rst diff --git a/docs/source/cugraph_intro.md b/docs/cugraph/source/cugraph_intro.md similarity index 100% rename from docs/source/cugraph_intro.md rename to docs/cugraph/source/cugraph_intro.md diff --git a/docs/source/cugraph_ref.rst b/docs/cugraph/source/cugraph_ref.rst similarity index 61% rename from docs/source/cugraph_ref.rst rename to docs/cugraph/source/cugraph_ref.rst index 591619fb3..e0f113eab 100644 --- a/docs/source/cugraph_ref.rst +++ b/docs/cugraph/source/cugraph_ref.rst @@ -2,22 +2,35 @@ 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. + + +| + +| + ********** 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. +- 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 - 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, “*ast Triangle Counting on GPU* Irregular Applications: Architectures and Algorithms (IA3), 2014 +- O. Green, P. Yalamanchili, L.M. Munguia, *Fast Triangle Counting on GPU* Irregular Applications: Architectures and Algorithms (IA3), 2014 Hungarian Algorithm @@ -27,6 +40,15 @@ Hungarian Algorithm | +************* +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. + +| + +| + ********** Data Sets ********** diff --git a/docs/source/dask-cugraph.rst b/docs/cugraph/source/dask-cugraph.rst similarity index 100% rename from docs/source/dask-cugraph.rst rename to docs/cugraph/source/dask-cugraph.rst diff --git a/docs/source/images/Nx_Cg_1.png b/docs/cugraph/source/images/Nx_Cg_1.png similarity index 100% rename from docs/source/images/Nx_Cg_1.png rename to docs/cugraph/source/images/Nx_Cg_1.png diff --git a/docs/source/images/Nx_Cg_2.png b/docs/cugraph/source/images/Nx_Cg_2.png similarity index 100% rename from docs/source/images/Nx_Cg_2.png rename to docs/cugraph/source/images/Nx_Cg_2.png diff --git a/docs/source/index.rst b/docs/cugraph/source/index.rst similarity index 100% rename from docs/source/index.rst rename to docs/cugraph/source/index.rst diff --git a/docs/source/nx_transition.rst b/docs/cugraph/source/nx_transition.rst similarity index 100% rename from docs/source/nx_transition.rst rename to docs/cugraph/source/nx_transition.rst diff --git a/docs/source/sphinxext/github_link.py b/docs/cugraph/source/sphinxext/github_link.py similarity index 88% rename from docs/source/sphinxext/github_link.py rename to docs/cugraph/source/sphinxext/github_link.py index a7a46fdd9..fa8fe3f5f 100644 --- a/docs/source/sphinxext/github_link.py +++ b/docs/cugraph/source/sphinxext/github_link.py @@ -1,3 +1,17 @@ +# Copyright (c) 2019-2021, 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. + +# NOTE: # This contains code with copyright by the scikit-learn project, subject to the # license in /thirdparty/LICENSES/LICENSE.scikit_learn From 4beef09ec481abd8dbccf747b7252ab6a80fd9d8 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 21 Apr 2021 12:49:06 -0700 Subject: [PATCH 139/384] REL v0.19.0 release From 06a44eec5928c079ade4bed33a811569f010977b Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 28 Apr 2021 11:25:23 -0400 Subject: [PATCH 140/384] Add centrality and random walk notebook (#1546) This PR adds three new notebooks: - A general Centrality notebook that summarizes all the centrality metrics - A example notebook for Random Walk - A performance benchmarking notebook on Random Walk Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/1546 --- .../random_walk_benchmark.ipynb | 544 +++++++++++++++ .../cugraph_benchmarks/random_walk_perf.ipynb | 621 ++++++++++++++++++ notebooks/cugraph_benchmarks/release.ipynb | 3 +- 3 files changed, 1167 insertions(+), 1 deletion(-) create mode 100644 notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb create mode 100644 notebooks/cugraph_benchmarks/random_walk_perf.ipynb diff --git a/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb new file mode 100644 index 000000000..be50c0754 --- /dev/null +++ b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb @@ -0,0 +1,544 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Random Walk Performance\n", + "# Skip notebook test¶ \n", + "\n", + "Random walk performance is governed by the length of the paths to find, the number of seeds, and the size or structure of the graph.\n", + "This benchmark will use several test graphs of increasingly larger sizes. While not even multiples in scale, the four test graphs should give an indication of how well Random Walk performs as data size increases. \n", + "\n", + "### Test Data\n", + "Users must run the _dataPrep.sh_ script before running this notebook so that the test files are downloaded\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "| ---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import the modules\n", + "import cugraph\n", + "import cudf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# system and other\n", + "import gc\n", + "import os\n", + "import time\n", + "import random\n", + "\n", + "# MTX file reader\n", + "from scipy.io import mmread" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')\n", + "\n", + "import matplotlib.pyplot as plt; plt.rcdefaults()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read the data and create a graph" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", + "def read_and_create(datafile):\n", + " print('Reading ' + str(datafile) + '...')\n", + " M = mmread(datafile).asfptype()\n", + "\n", + " _gdf = cudf.DataFrame()\n", + " _gdf['src'] = M.row\n", + " _gdf['dst'] = M.col\n", + " _gdf['wt'] = 1.0\n", + " \n", + " _g = cugraph.Graph()\n", + " _g.from_cudf_edgelist(_gdf, source='src', destination='dst', edge_attr='wt', renumber=False)\n", + " \n", + " print(\"\\t{:,} nodes, {:,} edges\".format(_g.number_of_nodes(), _g.number_of_edges() ))\n", + " \n", + " return _g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the call to RandomWalk\n", + "We are only interested in the runtime, so throw away the results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def run_rw(_G, _seeds, _depth):\n", + " t1 = time.time()\n", + " _, _ = cugraph.random_walks(_G, _seeds, _depth)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test 1: Runtime versus path depth" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\t100,000 nodes, 499,985 edges\n", + "update i\n", + "Reading ./data/dblp-2010.mtx...\n", + "\t326,183 nodes, 807,700 edges\n", + "update i\n", + "Reading ./data/coPapersCiteseer.mtx...\n", + "\t434,102 nodes, 16,036,720 edges\n", + "update i\n", + "Reading ./data/as-Skitter.mtx...\n", + "\t1,696,415 nodes, 11,095,298 edges\n", + "update i\n" + ] + } + ], + "source": [ + "# some parameters\n", + "max_depth = 6\n", + "num_seeds = 500\n", + "\n", + "# arrays to capture performance gains\n", + "names = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " G = read_and_create(v)\n", + " \n", + " num_nodes = G.number_of_nodes()\n", + " nodes = G.nodes().to_array().tolist()\n", + "\n", + " seeds = random.sample(nodes, num_seeds)\n", + "\n", + " for j in range (2, max_depth+1) :\n", + " t = run_rw(G, seeds, j)\n", + " time_algo_cu[i].append(t)\n", + "\n", + " # update i\n", + " i = i + 1\n", + " print(\"update i\")\n", + " \n", + " del G\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "seed_idx = list(range(2,max_depth +1))\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "\n", + "for i in range(len(data)):\n", + " plt.plot(seed_idx, time_algo_cu[i], label = names[i])\n", + "\n", + "\n", + "plt.title(f'Runtime vs. Path Length ({num_seeds} Seeds)')\n", + "plt.xlabel('Path length')\n", + "plt.ylabel('Runtime')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "12979" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "del time_algo_cu\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test 2: Runtime versus number of seeds\n", + "The number of seeds will be increased over a range in increments of 10. \n", + "The runtime will be the sum of runtime per increment. Increaing number of seeds by 1 would make for very long execution times " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\t100,000 nodes, 499,985 edges\n", + "\t.................................................................................................... \n", + "Reading ./data/dblp-2010.mtx...\n", + "\t326,183 nodes, 807,700 edges\n", + "\t.................................................................................................... \n", + "Reading ./data/coPapersCiteseer.mtx...\n", + "\t434,102 nodes, 16,036,720 edges\n", + "\t.................................................................................................... \n", + "Reading ./data/as-Skitter.mtx...\n", + "\t1,696,415 nodes, 11,095,298 edges\n", + "\t.................................................................................................... \n" + ] + } + ], + "source": [ + "# some parameters\n", + "rw_depth = 4\n", + "max_seeds = 1000\n", + "\n", + "# arrays to capture performance gains\n", + "names = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " G = read_and_create(v)\n", + " \n", + " num_nodes = G.number_of_nodes()\n", + " nodes = G.nodes().to_array().tolist()\n", + " \n", + " print('\\t', end='')\n", + " for j in range (10, max_seeds +1, 10) :\n", + " print('.', end='')\n", + " seeds = random.sample(nodes, j+1)\n", + " t = run_rw(G, seeds, rw_depth)\n", + " time_algo_cu[i].append(t)\n", + "\n", + " # update i\n", + " i = i + 1\n", + " print(\" \")\n", + " \n", + " del G\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "seed_idx = list(range (10, max_seeds +1, 10))\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "\n", + "for i in range(len(data)):\n", + " plt.plot(seed_idx, time_algo_cu[i], label = names[i])\n", + "\n", + "\n", + "plt.title('Runtime vs. Number of Seeds')\n", + "plt.xlabel('Number of Seeds')\n", + "plt.ylabel('Runtime')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4094" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "del time_algo_cu\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test 3: Multi-seed versus Sequential\n", + "This test uses a single files since sequential execution is slow" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/coPapersCiteseer.mtx...\n", + "\t434,102 nodes, 16,036,720 edges\n" + ] + } + ], + "source": [ + "G = read_and_create('./data/coPapersCiteseer.mtx')\n", + "nodes = G.nodes().to_array().tolist()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "rw_depth = 4\n", + "max_seeds = 100\n", + "num_nodes = G.number_of_nodes()\n", + "runtime_seq = [0] * max_seeds" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# sequenctial = so also get a single random seed\n", + "for i in range (max_seeds) :\n", + " for j in range(i):\n", + " seeds = random.sample(nodes, 1)\n", + " t = run_rw(G, seeds, rw_depth)\n", + " runtime_seq[i] = runtime_seq[i] + t" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "runtime = [None] * max_seeds\n", + "\n", + "for i in range (max_seeds) :\n", + " seeds = random.sample(nodes, i+1)\n", + " t = run_rw(G, seeds, rw_depth)\n", + " runtime[i] = t" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AMaMGbPO49OmTWPcuHGsWrWK3r17c+SRR67z+H333UfLli2ZOHEixcXFDBw4kCFDhqzTZf2VV16hXbt2/Pe//wVg2bJllJaW8vvf/54XXniBtm3b8sQTT3DxxRdz//33c9ZZZ3HXXXfRuXNnxo8fz29/+1veeOMN/vCHP/Cb3/yG0047jdtvv71i/Y8++ihDhw7l4osvJpVKsXr16mq9dhGpZ74aD69eCPMnw/Y94cf/hI4Da7WErAWYmTUFEu6+Ivp9CPCXbG0vmzp16kSPHj0A6NatG4cccghmRo8ePX5wlrUljjnmGBo3bkzjxo056KCDmDBhAr169ap4fNSoUUybNo2nn34aCOH06aefrhNgPXr04E9/+hPnn38+w4YNY//992fGjBnMmDGDwYMHA+FMbvvtt2flypW89957HH/88RXLFxcXA/Duu+/yzDPPADB8+HDOP/98APr378+ZZ55JaWkpxx577Dr1iUgDsPgzGH05zHwRmm8Px94Je54IidrvUpHNM7BtgeeibtV5wKPu/sqWrHBjZ0rZ0qhRo4rfE4lExe1EIkFZWRkAeXl5pNPpiudtznehKndBr3zb3bn11lsZOnRolevo0qULU6ZM4aWXXuKSSy7hkEMO4Uc/+hHdunXj/fffX+e5y5cvp1WrVkydOrVa9QAccMABvP322/z3v//l9NNP549//COnnXZaNV+hiOSs1d/DW3+DifdCsgAGXQT7ng0FTWMrKWuR6e6fu3vP6Kebu1+drW3VBR07dmTKlCkATJkyhS+++OIHz2nevDkrVqyoch0vvPACRUVFLF68mDFjxtC/f/91Hh86dCh33nknpaWha+qsWbNYtWrVOs/5+uuvadKkCaeeeiojRoxgypQp7LbbbixcuLAiwEpLS/noo49o0aIFnTp14qmnngJCQH744YcADBw4kMcffxyARx55pGL9X375Jdtuuy2//OUv+cUvflHxmkWknipdA+/8A27uBRPuhl4nwTlTYND5sYYX5MBQUrniuOOO4+GHH6Zbt27svffedOnS5QfP2XPPPUkmk/Ts2ZPTTz+d3r17/+Dxgw46iEWLFnHppZfSrl27dZoof/GLXzBnzhz69OmDu9O2bdsfXH+bPn06I0aMIJFIkJ+fz5133klBQQFPP/0055xzDsuWLaOsrIxzzz2Xbt268cgjj/Cb3/yG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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "seed_idx = list(range(1,max_seeds +1))\n", + "\n", + "\n", + "plt.figure(figsize=(7,4))\n", + "plt.plot(seed_idx, runtime, label = \"multiple seeds\")\n", + "plt.plot(seed_idx, runtime_seq, label = \"sequential\")\n", + "\n", + "\n", + "plt.title('Runtime vs. Number of Seeds')\n", + "plt.xlabel('Number of Seeds')\n", + "plt.ylabel('Runtime')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "-----\n", + "Copyright (c) 2021, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/cugraph_benchmarks/random_walk_perf.ipynb b/notebooks/cugraph_benchmarks/random_walk_perf.ipynb new file mode 100644 index 000000000..738298767 --- /dev/null +++ b/notebooks/cugraph_benchmarks/random_walk_perf.ipynb @@ -0,0 +1,621 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Random Walk Performance\n", + "# Skip notebook test¶ \n", + "\n", + "Random walk performance is governed by the length of the paths to find, the number of seeds, and the size or structure of the graph.\n", + "This benchmark will use several test graphs of increasingly larger sizes. While not even multiples in scale, the four test graphs should give an indication of how well Random Walk performs as data size increases. \n", + "\n", + "### Test Data\n", + "Users must run the _dataPrep.sh_ script before running this notebook so that the test files are downloaded\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "| ---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import the modules\n", + "import cugraph\n", + "import cudf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# system and other\n", + "import gc\n", + "import os\n", + "import time\n", + "import random\n", + "\n", + "# MTX file reader\n", + "from scipy.io import mmread\n", + "\n", + "import networkx as nx" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import matplotlib\n", + "except ModuleNotFoundError:\n", + " os.system('pip install matplotlib')\n", + "\n", + "import matplotlib.pyplot as plt; plt.rcdefaults()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import pybind11\n", + "except ModuleNotFoundError:\n", + " os.system('pip install pybind11')\n", + " \n", + "import pybind11" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import walker\n", + "except ModuleNotFoundError:\n", + " os.system('pip install graph-walker')\n", + "\n", + "import walker" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Test File\n", + "data = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read the data and create a graph" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Data reader - the file format is MTX, so we will use the reader from SciPy\n", + "def read_data(datafile):\n", + " print('Reading ' + str(datafile) + '...')\n", + " M = mmread(datafile).asfptype()\n", + "\n", + " _gdf = cudf.DataFrame()\n", + " _gdf['src'] = M.row\n", + " _gdf['dst'] = M.col\n", + " _gdf['wt'] = 1.0\n", + " \n", + " return _gdf" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def create_cu_ugraph(_df):\n", + " _g = cugraph.Graph()\n", + " _g.from_cudf_edgelist(_df, source='src', destination='dst', edge_attr='wt', renumber=False)\n", + " return _g" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def create_nx_ugraph(_df):\n", + " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr='wt', create_using=nx.Graph)\n", + " return _gnx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the call to RandomWalk\n", + "We are only interested in the runtime, so throw away the results" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def run_cu_rw(_G, _seeds, _depth):\n", + " t1 = time.time()\n", + " _, _ = cugraph.random_walks(_G, _seeds, _depth)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def run_wk_rw(_G, _seeds, _depth):\n", + " t1 = time.time()\n", + " _ = walker.random_walks(_G, n_walks=1, walk_len=_depth, start_nodes=_seeds)\n", + " t2 = time.time() - t1\n", + " return t2 \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test 1: Runtime versus path depth" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=2.23s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=2.48s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=2.02s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=2.31s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=2.01s\n", + "update i\n", + "Reading ./data/dblp-2010.mtx...\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=4.21s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=4.03s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=3.59s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=3.95s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=3.68s\n", + "update i\n", + "Reading ./data/coPapersCiteseer.mtx...\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=59.64s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=49.43s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=47.45s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=54.66s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=46.96s\n", + "update i\n", + "Reading ./data/as-Skitter.mtx...\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=53.14s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=44.36s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=46.38s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=41.96s\n", + "\tcuGraph\n", + "\tWalkerRandom walks - T=53.18s\n", + "update i\n" + ] + } + ], + "source": [ + "# some parameters\n", + "max_depth = 6\n", + "num_seeds = 100\n", + "\n", + "# arrays to capture performance gains\n", + "names = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "time_algo_wk = [] # will be two dimensional\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " time_algo_wk.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " gdf = read_data(v)\n", + " pdf = gdf.to_pandas()\n", + " \n", + " # Create the Graphs\n", + " Gcg = create_cu_ugraph(gdf)\n", + " Gnx = create_nx_ugraph(pdf)\n", + " \n", + " num_nodes = Gcg.number_of_nodes()\n", + " nodes = Gcg.nodes().to_array().tolist()\n", + "\n", + " seeds = random.sample(nodes, num_seeds)\n", + "\n", + " for j in range (2, max_depth+1) :\n", + " print(\"\\tcuGraph\")\n", + " tc = run_cu_rw(Gcg, seeds, j)\n", + " time_algo_cu[i].append(tc)\n", + " \n", + " print(\"\\tWalker\", end='')\n", + " tw = run_wk_rw(Gnx, seeds, j)\n", + " time_algo_wk[i].append(tw)\n", + "\n", + " # update i\n", + " i = i + 1\n", + " print(\"update i\")\n", + " \n", + " del Gcg\n", + " del Gnx\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAFNCAYAAADRi2EuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAACN0ElEQVR4nOzdd3hUxf748ffsphcgQIBQEyAJ6QlJ6CACAopgQYoVrGDv2Lv+roUrKnq/qAjoVRABEfUiIgoSejO0BAgl9B5Ib7s7vz/O5pCQEIKShPJ5Pc8+u2fPzJw5Z9tn58yZUVprhBBCCCFE9bPUdgWEEEIIIS4XEngJIYQQQtQQCbyEEEIIIWqIBF5CCCGEEDVEAi8hhBBCiBoigZcQQgghRA2RwEuIi4hSqqVSKkcpZa3tutQ2pdQipdQ9tV2Pc6GUelUp9fU55pmmlLq+mqpU65RSI5VSS6qQ7t9Kqftrok5CVCcJvIT4h5RS6UqpfGdAdEgpNUUp5XMey+5Tsqy13qO19tFa289H+TXNeWyKnMcqQyn1m1KqXRXynXPAclr+nkqpfX83f21tUykVDcQAc5zLAUqpH5VSB5RSWikVeFp6d6XUJKVUlvO9+MRp63srpbYopfKUUguVUq0q2XY3pdQypVSm87VaqpRK/Cf78w+NBZ5XSrnVYh2E+Mck8BLi/BiotfYBYoE44Lnarc4F7V3nsWoOHAGm1G51LmijgG/0qZGuHcA8YPAZ0r8KBAOtgCuBMUqp/gBKqYbA98BLQH1gDTC9okKUUnWAn4HxzrTNgNeAwn+8R3+T1vogsAUYVFt1EOJ8kMBLiPNIa30I+BUjAKuw1aN0K5azJec7pdRXSqlspdRmpVSCc91/gZbAT84WojFKqUBnS4eLM80ipdSbzpaJHKXUT0qpBkqpb5ytHqtLt4oopdo5W5kylFJblVJDK9oPpdQwpdSa0557XCn1o/PxNUqpFGed9yulnvobxyoPmApEOsv8UCm111nvtUqp7s7n+wPPA8Oc+7i+VDGtnC0x2Uqp+c7g4pwopZoqpWYppY4qpXYppR4pte6Mr49zfXul1F/OdTOUUtOdr4c38AvQ1FnnHKVUU2c2tzOVV4GrgT9LHbPDWuv/AKvPkH4E8IbW+oTWOhX4HBjpXHcjsFlrPUNrXYARpMWcocUxxLm9aVpru9Y6X2s9X2u9odS+36WUSlVKnVBK/Vq69ayy95nz/fmj83VeBbQptU4ppcYppY44129USkWWqtciYEAlx0uIC54EXkKcR0qp5hg/ltvPIdsg4FugHvAj8DGA1vp2YA/O1jSt9btnyD8cuB2jVaINsByYjNFSkQq84qybN/AbRrDTyJnvP0qp8ArK/AkIVUoFl3ruFmdegC+AUVprX4zA6Y9z2F+c9fEBbgX+cj61GiNgre/czgyllIfWeh7w/4DpzuMQc1qd7nTujxtwTgGgUsqCsa/rMY5fb+AxpVS/UskqfH2cp7xmY7TY1QemATcAaK1zMd4HB5x19tFaH6isvArq5g0EAVuruC9+QIBzX0qsByKcjyNKr3PWcUep9aVtA+xKqS+VUlc7yy69reswguEbAX8gybn/VXmffQIUOOt6l/NWoi/QAyPwqwsMBY6XWp+KcepViIuWBF5CnB8/KKWygb0Yp89eOYe8S7TWc539tv7Luf+wTNZa79BaZ2K0suzQWi/QWtuAGRinPgGuBdK11pO11jat9V/ALGDI6QU6W6PmADcDOAOwdhiBAkAxEK6UquNsXVl3DvV9Sil1EiM49cHZIqO1/lprfdxZt38D7kBoFfZ9m9Y6H/gOZ0vjOUgE/LXWr2uti7TWOzFaiYaXSnOm16cT4AJ8pLUu1lp/D6yqwjar+nrXc95nV3FfSvoVZpZ6LhPwLbU+k7JKrzdprbOAboDGOB5Hna1UjZ1JRgP/0lqnOt9n/w+IdbZ6nfF9poyLQgYDL2utc7XWm4AvS2262FmfdoByln+w1PpsTh0XIS5KEngJcX5c72z96Ynxo3Eup7wOlXqcB3iUnEqsosOlHudXsFzyg9wK6KiUOllyw2hxanKGcqfiDLwwWpZ+cAZkYPx4XgPsVkr9qZTqfA71Hau1rqe1bqK1HqS13gGglHrKeeoq01m3upz9OJ5+7M71ooZWGKcDSx+T54HGpdKc6fVpCuwv1f8KjMD7bKr6ep903pcLjM4gx3lfp9RzdTgVuOWctu709WU4g56RWuvmGK2aTYEPnKtbAR+WOmYZgMJoNazsfeaPEayWPk67S23zD4wWwE+AI0qpz5TR36yEL6eOixAXJQm8hDiPtNZ/Ypx6Gut8KhfwKlnv/Mfvfy5FnrfKGT92fzqDnpKbj9b6TJfo/wb4K6ViMQKwktOMaK1Xa62vwziV9ANGa9Pf5uzPNQbj1JKf1roeRmuMKtnkPym/EnuBXacdE1+t9TVVyHsQaKaUUqWea1Hq8T+qc6lTgSFVTH/CWafSLWgxwGbn482l1zlPCbYptb6ysrdgvK9L+lvtxTjVXPq4eWqtl1H5++woYKPscWp52rY+0lrHA+HOfX+61Oowyp5KFeKiI4GXEOffB8BVSqkYjL4yHkqpAUopV+BFjFNoVXUYaH2e6vUzEKKUul0p5eq8JSqlwipKrLUuxjhV+R5GH6bfwOjbpJS6VSlV15kmC+Nqu3/CF+MH+SjgopR6mbKtM4eBQGefrL9NKeVR+oZxajBbKfWMUspTKWVVSkWqqg2bsBywAw8ppVyc/Z46nFbnBkqpuv+gynOBK07fB069h9ydyyW+Al5USvk5O83fy6mrRmcDkUqpwc48LwMbnEFVGc7O8U86+yyilGqBEXyvcCaZADynlIpwrq+rlCo5ZX3G95nz9Or3wKtKKS9nv68RpbabqJTq6Pys5GL0BSv93roC43S6EBctCbyEOM+01kcxfgBfdva7egCYCOzH+DE5l7Gd/oXxQ3pS/Y0rB0+rVzZG5+XhwAGMU17vUHkgOBXoA8xw9uUpcTuQrpTKwujvcyuUGeC1ZfmiKvUrxjAJ2zBOPRVQ9nTUDOf9caXUufQnK60ZxqnX0rcgjD5JscAu4BjGa3XWYElrXYTRufxujNNft2EEHYXO9VswOpzvdL5+Tc9QVGU+A249rVUtn1OnFbc4l0u8gtFKthvjasj3nBcnlLwvBwNvASeAjpTty1ZatnP9SqVULkbAtQl40lnWbIz3zrfO98AmjIsJqvI+ewjjlPAhjKBwcqnt1sHoU3bCuQ/HMQJ/lFIBGK1gP5zpYAlxMVBluycIIYT4u5RSK4EJWuvJZ01c9TKnAt9prX84X2VejJRS/8a4cOQ/tV0XIf4JCbyEEOJvUkpdgTHcwzGMVr8JQOvTrsQTQgjTuVw5JYQQoqxQjAsLvIGdwE0SdAkhKiMtXkIIIYQQNUQ61wshhBBC1BAJvIQQQgghashF0cerYcOGOjAwsLarIYQQQghxVmvXrj2mta5wsOyLIvAKDAxkzZo1tV0NIYQQQoizUkrtPtM6OdUohBBCCFFDJPASQgghhKghEngJIYQQQtQQCbyEEEIIIWqIBF5CCCGEEDWkWgMvpVQ9pdRMpdQWpVSqUqqzUqq+Uuo3pVSa896vOusghBBCCHGhqO4Wrw+BeVrrdkAMkAo8C/yutQ4GfncuCyGEEEJc8qot8FJK1QV6AF8AaK2LtNYngeuAL53JvgSur646CCGEEEJcSKqzxSsIOApMVkr9pZSaqJTyBhprrQ860xwCGldjHYQQQgghLhjVGXi5AO2B/9NaxwG5nHZaUWutAV1RZqXUfUqpNUqpNUePHq3GahqO7UmnuKCg2rcjhBBCiMtXdU4ZtA/Yp7Ve6VyeiRF4HVZKBWitDyqlAoAjFWXWWn8GfAaQkJBQYXB2vmit+WHsm+SePEHruERCOnWjdVwCrh4e1blZIYQQQlxmqi3w0lofUkrtVUqFaq23Ar2BFOdtBPC2835OddXhXPQb9QhbVywlbeVStq1Ygou7O63bdyC0U1eC4hJwdZcgTAghhBD/jDLO9lVT4UrFAhMBN2AncCfG6c3vgJbAbmCo1jqjsnISEhJ0TU2S7XDY2ZeymW0rlpC2ahl5mSfNIKzDoME0bt22RuohhBBCiIuTUmqt1jqhwnXVGXidLzUZeJV2KghLYtvKZVz76BhaRsaQcWAfx/bupnX7Dri4utZ4vYQQQghx4aos8KrOPl4XPYvFSsvIaFpGRtPrztEopQBIWfwHq3/8nvs//xoXV1dOHj6Et58frm7utVxjIYQQQlzIJPCqIovVaj7uMuRWQjp1w8PbB4BfPv43R3fvonV8B0I7dyMwNl6CMCGEEEKUI4HX32CxWmkU2Npc7jrsNrYuTyJt5TK2LluMq4cnbeI7ENKpqwRhQgghhDBJH6/zyGG3s3fzRratWMK2VcsoyM4yg7C4/gNpGtKutqsohBBCiGomfbxqiMVqpVV0LK2iY+l99/3s3byRrSuSSFu1nNbtE2ka0o6cjOMc2pFGYGy8dMwXQgghLjPS4lUD7DYboLG6uLL2fz+w6KuJ3P3RROo1bkJOxnE8fHxxcXOr7WoKIYQQ4jyQFq9aZnU5dZhj+11LkzYh1GvcBIA/Jn/K7o1/0Sa+IyGduxMYHSdBmBBCCHGJksCrhlldXGjWLtxcjul7De7e3mxftZzUJYtw8/SkTUInQjp1IzCmvZyOFEIIIS4hcqrxAmG32dizaT3bVixh+6rlFOTm4ObpRZuEjkT36U/zdhG1XUUhhBBCVIGcarwIWF1cCIqNJyg2nj73PMCejevZumIJ21cvp1Fga5q3i6AwL499qZtoFR0nLWFCCCHERUhavC5wdlsxDpsdVw8PUpMWMvfjfzP89fdoFhpGfk42bh4eWF0kCBNCCCEuFNLidRGzuriagVVI5254+tahaXAoAEunf82WpYtom9CJkM7daBUVK0GYEEIIcQGTwOsiYnVxJTA23lwO6dgFW2EB21evYPOfv+Pu7U3bhM6Edu5Gy6gYCcKEEEKIC4wEXhexlpExtIyMwVZczJ6NyUbH/NXL2fznAiMIS+xM5BV9aB4eWdtVFUIIIQQSeF0SXFxdad0+kdbtE7EVF7N7w19sW7GEtJXL8PStQ/PwSBx2O3s2JtMiMqbMuGJCCCGEqDnyC3yJcXF1pU18B9rEd8BWXIytqBCAvZs3MutfrzDoyecJ7tCFooJ8Z/8xeQsIIYQQNUV+dS9hLq6u5rATzcIiuH7MS7SMigVg7f9+YN3cH2mb2JnQTl2lJUwIcUkrLizg0PZt7NuymfysLHrdOQowrhyX/rCiJskv7WXCaAnraC43D4vkxMEDbFuRxKaF8/Hw8TWCsM7daBERLUGYEOKilp+dxf4tKezfmsL+1M0c3rUdh90OShHX/1oAtNZMfOhuInv1pevQ29BaU1xYgJuHZy3XXlzK5Nf1MtUiPIoW4VHYiopI3/AX25YnlQnCgjt0JqxbT1pERNd2VYUQospW/ziLzX/+zvF9ewBjcOrGbUJIuPYGmrWLoGlIGB4+PgDYi4uJ7NWXAOcQPScPH2Ty46Np0jqYFhFRtIiIplloOK4eHrW2P+LSI4HXZc7FzY22CR1pm9DRCMLWr2PbiiVsWZaEvbiYFhHRaK3Zn7qZpqFhWKzW2q6yEOIypx0OAJTFQkrSQpbPmMqIf/8HF1dXbEVF1GnoT1i3njRrF06TNiG4uLlVWI6Lmxtdh952atnVjQ7X3cSezRtY8/NsVs2ZicVqpUmbECMQC4+maWg7XN0lEBN/n4xcLypUXFRIUV4e3vX8OLYnnS+ffog+9zxIzFVXYysuxmKxSBAmhKgRtqIiDu1MM04dbtnMga2p3PjcqzQNCSN9w19s+mM+V468D+96fudtm0UF+RzYksLelI3s3byRQzvT0A4HFqsLN7/xHk3aBFOQk4PVzRVXN/fztl1xaZCR68U5c3VzN79M6jVpyqCnXqBZaDgAKX/+zpJvvyK4QxdCOnWjRUSUBGFCiPOmIDeHA9tS2Z+6mf1bUzi0Iw17cTEADZq3JLRzd7MfVmB0HIHRcee9Dm4engTGxpuDVhfm5XFgqxGINWjeAoDVP83ir19+4oGJU3FxcyPr2BG86vrJXLqiUhJ4Oe3fv5969erh7e1d21W54Li4uRGc2Nlcrt+8BS2jYkldsogNv8/D07cOwR2dQVi4BGFCiHOTffwYDruduo0ac+LgfiY9Phq0xmK10rh1W+L6D3T2z2qHV526tVJHdy8vguISCIo71YjRun0HvOvWM09l/vLx+xzavo2AkHbOU5NRNGkbKoHYBcDhcLBr1y7q1q1Lw4YNa7UucqoR48qWjz76iBMnTtCsWTOCg4MJDg4mICAAi8VSbdu92BUXFpCevI6ty5PYuW41xYUFeNapS3CHzrTr0kM65gshytEOBxkH9pGfnUXzsEi0w8En99xMSKdu9L3vYbTDwao5M2ka0o4mbUMuqv5Uu/5aw+6Nf7Fn80aO7t4FWuPi5k7TkHbGBU0R0TRpGyzDV9SgwsJC3N3dKSgoYOzYsSQkJNC/f/9q325lpxol8MIIvA4cOEBaWhppaWns378fAG9vb9q2bUvbtm1p06YNXl5e1VaHi11xYQG7kteybfkSdqxbRbPQcG564Q0ADu/cjn9gEBaLtIQJcbmx24o5vHM7+7eksM/ZP6sgJ5sGzVsy8t//ASBt9XL8mjSlYYtWtVzb8yc/J5t9qZvYt3kjezdv4OiedADCu1/J1Q89idaawzvS8A9sLcP3nGe5ubls2rSJ9evXA3DfffcBsHfvXpo0aYJrDbRASuB1jnJzc9mxYwdpaWls376d/Px8lFL069ePTp064XA4UEqhlKqxOl1MigsLyMvMpG6jxuSePMGE0XfQbdjtdLxhKA6HHUCCMCEuYQe2bWHXX6vZt2Uzh9K2YSsuAsAvoCnN2kXQLDScZmER+DVpWss1rTn52VnsS9mEVz0/moWGcfLwIb545B5633U/sf0GkJ+TzclDB2gc1Fa6a/wNNpuNbdu2sX79etLS0nA4HAQEBBATE0OHDh1q/OyVBF7/gMPhYP/+/aSlpRESEkLz5s3ZvXs3M2bM4Oabb6ZZs2a1Uq+Lha2oiJ3rVtG4dVvqNmrCjrUrmf/peII7diW0U1eahUVIECbERe7wrh2kLP6DHrfeidXFhYVTPuOveT/TKKi1EWi1C6dZaPh5verwYldUkE968lqatA2lTkN/Uhb/wS+fvI+bpyfN2kWYpyYbBbWW78gz0Fqzb98+1q9fz6ZNmygoKMDX15fo6Giio6Np3LhxrdVNAq/z7MCBAyxdupSBAwfi4eHBsmXL2Lp1K8HBwbRt25bGjRtLa9gZHEzbypqfZ7Nz3WpsRYV41a1HSKeuhHTqRrN24fIFI8QFTGvNiYMH2L9lM/u3pBB/7fX4twxk6/Ik5v3fB9z2rw9o0KwFeZkncXFzw81TumdUVX52Fns2rWfv5g3s3byRjAP7AHDz9KJ5WAQtIqJpER5Fo8DWqMu877HWGqUUW7Zs4dtvv8XV1ZWwsDBiYmIICgq6IPpmS+BVzdatW8eqVas4dOgQAL6+vmYH/datW+PuLmO8nK64oICdf61m2/Il7PxrDbaiQrzr+ZlXRzYPi5TgVYha5rDbOZK+0wy09m9NIS/zJAAevnXoN/pR2iZ0xG4rBpT0VTqPck5ksM85htjelI2cOLgfZbHw0KRvcfP04mDaVqyurjQKbF3bVa0xNpuN//73v7Rt25bu3btTXFzM5s2bCQsLu+B+ZyXwqiFZWVls376dtLQ0du7cSWFhIRaLhZYtWxIREUFiYmJtV/GCVFSQz66/1rB1eRK7/lpLvSYBjHjvYwCO79+LX0BTaQkTogaUtCTkZZ7kf+PHcnDbFooLCwCo26ix2TerWWgE9Zs1lz9HNSg74xhHd++idZzxO/Ld689TmJvL7e98CEDaqmXUaxxAwxatLpkWMbvdzs6dOzly5Ahdu3YFYM6cObRo0YL27dvXcu0qJ4FXLbDb7ezdu9e8UtLf358hQ4YA8McffxAcHEyLFi1quZYXnqKCfLKPHaVB85YUFxXyf/fcSnSffvS841601qD1JfOlIkRtsxUVmWNQzXjjeRq2COTKkffhcNiZ/sqzNApqY/TPaheOb/3aHftIlJV9/Bh5mSdp3LotdpuNj+8ahq2wEA/fOrQIizTnmmzQvOVFFyAfOnSI9evXs2HDBnJzc/Hx8eHRRx+tkasRzxcJvC4ANpsNFxcXcnNz+fDDD+nVqxedOnUiNzeXDRs2EBwcTIMGDS66D0h1shUXs331cuo3bU6jwNYc3L6VH8e+RXDHroR07kazkDAJwoSoIq01mUcOO08bGqcOXdzczRaTRf/9gnqNmhDbb0At11T8HVlHj5jTG+1N2UDW0SMAeNapa3TUD48iKC6Buo1qr8N5ZbKzs9m4cSPr16/n8OHDWCwWQkJCiI2NpW3btrhcZKexJfC6wNhsNhwOB25ubqSmpjJ9+nQA/Pz8aNu2LcHBwQQGBuJ2holdL1eHd+1g5ffT2fXXGmzFRfj41Se4pGO+BGFClOFw2Dm6O92c33D/1hRyT2QA4OHtQ9PQMJqHR5Fw7Q3yh+8SlHnksNFR3xmMZR8/ypUjR9H+6oHkZZ4kbdUygjt2rbWZAEocO3aMefPmsWPHDrTWNGvWjJiYGCIjIy/qsTNrLfBSSqUD2YAdsGmtE5RS9YHpQCCQDgzVWp+orJxLLfA63YkTJ8y+Ybt27aK4uBgXFxcCAwPNKyUbNGhQ29W8YBTl57FjndExf1fyGuzFxfjUb0Bwxy6EdupO05B2EoSJy05xUSGHt6fRtF0YFouVP6Z8yl+//ASAb0N/moWG0zzMGEOrQfOW8hm5jJS0drp5euJVpy5blyfx8wfvcNu/PqBx67Yc2LaFY3vSaRERRb0mTas1ENdas3v3bpRStGrVipycHL744gsiIyOJiYmp9el8zpfaDrwStNbHSj33LpChtX5bKfUs4Ke1fqayci71wKu04uJidu/ebQZix48fRynFmDFj8PT05OTJk3h7e19U57qr06kgLIldyWtx9/Jm1IQvsVisZB07gm/9hvIDIy5J+TnZHNiaQqPANvg2aEhq0kLmfvxvbn/nIxoFtubQ9m2cOHSAZu3CqdOwUW1XV1xAtNacPHSAuo2bYLFY+fPrSaz56XsAfOo3MMcQaxEeRd3GTc5LIJaXl4eXlxdaa8aPH0/9+vW57bbbzPpcaq2uF1rgtRXoqbU+qJQKABZprUMrK+dyCrxOl5GRwYEDB4iMjATgyy+/pLCw0JwCITc3Vyb2dirMy+PEwf00aROMdjj47ME7aRUVR/8HHgMuzQ+3uHxkHT3C/i2b2efsn3V83x4Aet01mrh+15KXlcnBtC20iIjGzcOzlmsrLiZaazIO7GNfykb2bN7IvpSN5rAhvg38aREeSYvIGCKu6H1O36F5eXls3ryZ9evXc+zYMZ566ilcXFw4fPgwfn5+l3R3mtoMvHYBJwANfKq1/kwpdVJrXc+5XgEnSpZPy3sfcB9Ay5Yt43fv3l1t9byYbN++HZvNRrt27bDZbLz77rvUqVPHHDesZcuWF10nxOrgsNvZumwxPg0a0iI8iqyjR/j2lWeM05GduxHQNlRawsQFrbiokM2Lfjc7wmcfPwoYA2o2DQ0zTh22i6Bx22Bc3S6sMYzExU1rTcb+vUZHfWc/MZ/6Dbjj3fEArPl5Nn4BTWkT37FcXpvNxvbt20lOTmbbtm04HA4aNWpETEwMiYmJl3SwVVptBl7NtNb7lVKNgN+Ah4EfSwdaSqkTWutK55G4nFu8KlNUVMS6detIS0sjPT0du92Oq6srrVu3NvuG1atXr7areUE4vm8Pi6dOYff6ddhtNnwaNCTU2TFfgjBxoVg3dw6uHp5E9eprDBFw5zDcvb3N+Q2bh0XQsGUrGddO1CjtcJCXlYl3PT+01kx8+B6C4hLoc/f9OBx2fv9iAp5Nm3Os0MbWNGN+Y29vb6KiooiJiaFJk/NzuvJickFc1aiUehXIAe5FTjWed0VFRezatcscNywzMxMAf39/BgwYQGBgYO1W8AJRmJfLjjUr2bpiiRmEWaxW3L198PD2Zvhr7+JVtx5pq5aRvn4dfe5+AGWxsH9rKjkZx/Hw9sHd29u49/HB3ctLfgTFOSvMy+XA1lT2b00hPzuLq+59CIDprz2Ll29dBj7xHGCMXu5dz++y+9ESFzbtcFBcWICLuwfZx44w5cUxnGjaGhwOPG0FBDZpTGRsHK0iY/Cpf3leGFZZ4FVt56SUUt6ARWud7XzcF3gd+BEYAbztvJ9TXXW4nLi5uREaGkpoaChaa44dO2YGYSV9wLZs2cL69esZOHDgRX2Z7j/h7uVNeI9ehPfoZQRha1dxfO9uCvNyKcjJwdXdA4CMA/vZlbzWbAlbP/9/pC5ZVGGZbp5euHt741WnHrf9axwAmxb+RnbGMToPvhmAPZs2YCsqdAZ4p4I3l8uk2f1yl51x7NSwDltSOLon3RwMOKBtKA6HHYvFyk0vvIHV5dSFMz5+9Wuv0kKcgbJY+OGnn3FxceHGG2/kkQlTWL54EZbMDA5tS2XfX6uYt3QhAH4BzWgREUX7q6+jQXMZNByqMfACGgOznf/UXICpWut5SqnVwHdKqbuB3cDQaqzDZUkphb+/P/7+/nTp0sV8Pj8/nxMnTuDhYQQXy5YtIy8vj+DgYJo3b47Venm13Lh7eRPe/coK13W8fggdrx9iLvcccS8drruJgtwcCnJzKczNobDU44LcHLTDYabfvzWVY3vTzcBr6fT/cmBbarntWF1dnYGYD/4tA7n2MeMC33Vz5+Di7kF0734ApG/4C4vFeqq1zdsbd08vOUV6ASo5i6CUYuPC+az8fjqZRw4D4OruQUBIOzoPvpnmYREEtA3F1fl5BMoEXUJcKBwOh3lGpV+/fiilaNy4sfmboSwWuvTsVSq9naPpu8z+YVuW/klUL+O7bPeGZNJWLaPr8Nvx9PGtlf2pbTKA6mVs9uzZbNy4EYfDgYeHR5m+Yb6+l+cHorpkHjlMXuZJM0graWEreVyYk4NXvXr0vut+AKa/+iwePj5c99SLAEwYdTu5J8sOd6eUBXcvo7XN3duHVtFx9LhlJAArvp+Of6sg2sR3MMbNWb8O99KnSb295Uf+PLHbinE4HLi6ubN7YzI/f/guw175Fw1btGLbyqVsWfKn0UerXTiNAltjucz+4IiL15EjR8ype7Kzs3F3d2f06NH4+VXaLbsch92OUgplsZA8fy4rZk3j3k8mY3VxYc3Ps8k8cogW4VE0D4+q9QFdz5cLoo/XPyGBV/UpKChg586d5mnJnJwcAAICAggODiYsLIyAgIBaruXlqfTwF0f3pFOQnUWBM0grHbwV5hmtbo1bt6XLkFsB+L/7bqNdlx5cOfI+iosK+ej2weXKd3F3N4IwL288fHxo17UnsX2vweGws2LWtwTGxNM0pB3FRYUc2r7NbJnz8PbG1cPzsu13VJSfx4FtW9i/NYX9qZs5uH0bV468l+je/ck8cojlM78l8brBNGgmp1XExScnJ4dNmzaxfv16Dh48iFKK4OBgYmJiCAkJOS9jSGqHw2yt/2Pyp2xa+Js5GXvDloHOccSiaB4WiadvnX+8vdoggZeoEq01hw4dIi0tje3bt7N37146duxI//79sdvtbNq0ieDg4Mu2f9jFpuTLzWG3c2jHNiNYy8k5Fbw5A7aS4C24Q2fi+g8kPyeb/9x9M1eOvI/2Vw/i2N7dfPnUg2XKVhaLGYSVBGSx/a6lbUJH8rIy2bTwN9omdqZ+02YU5OZw8tDBU61tXt4XVatP7skTZt+sfVs2czR9F1o7UMqCf2AQzdtF0K7bFQS0rfQaISEuaLm5ucyZM4e0tDS01gQEBJhT9/j4+FTrtu02G4d3pjnnmdzI/q0p2AoLQSn8WwbSrusVdLjupmqtw/lWK53rxcVHKUVAQAABAQH06NGD/Px8bDYbAPv372f27NkMGTKEiIgIsrKyyMrKomnTplikn9EFqeQfpcVqpWlIWJXzefr48vi0OWiH8aesjn8jbnrxzXItbCWPC5z93Ry2YsAY6DNp6hQaNG9B/abN2L8lhR/efb3MNtw8PY3AzcvbeXWoD51uHEaTNsGcPHyInetW065Ld7zq1iMvK5O8zJOlLkhwr9bWthOHDlCYm0uTNsHYiov5/KG7sBcX4+LmTkDbEDreOJRmoeE0DWmHm6f8CREXr71795KdnU14eDienp7k5ubSpUsXoqOjady45ibTtrq40DQkjKYhYXS8YSh2WzGHtqc555ncYHaz0A4H373xPDFXXUO7Lj1qrH7nmwRe4ow8PU+Nft28eXPuu+8+c87IDRs2sGDBAry8vMyJvdu0aSOtYZcIi8UKznjazcOTVlGxVc7buHVbHvlqptmq1aRNMNePeYnCXCNIKxO8OS9OyDxyCHuxEbgd3pnGwimf0jIyGq+69diy9E8WTvnMLN/q4uLsr3YqcPPw9qH7LSOp09CfI+k7ObQjjfDuV+Li5kbuyRPmFaWnX5DgsNs5unsXJw7up13XKwD45ZP3UShufuM9XFxd6TfqEeo2DqBx6zbSL05c9LKzs80+vEuWLOHo0aOEhYVhsVi49957a7l2BquLK83ahdOsXTidbhxmPp+fk41Spz6/x/ft5ZdP/m1Ob9SsXQTuF8FvkJxqFH9LXl6eOZ/kjh07yMvLQylFs2bNzFH0mzRpIq1h4pw57HYKcnPw8PbBYrVy8tBBDu/aXq6FrezVpTkMefEt6vg3YuUPM1gy7Use+Womru4eLPzyc9bNdY5ao5RxQYKXMQbbycOHKC7Ix+riwkOTv8PFzY2DaVtx8/SSS9/FJaOgoMCcumfPnj08+uij+Pn5cfLkSTw9PXF3vzhnPji0fRt/fj2Jg2lbsNtsKGWhces2RiAWEU2z0LBaa5WWPl6iWjkcDg4cOGB20D9w4AAADRs25MEHH0Qphd1uv+yGqxC1o7iokPysTHwb+KOU4vDO7Rzdk15u+I/C3Bzq+DeiWWg4zdpF4NugYW1XXYjzxm63s2PHDtavX8+WLVuw2+00bNiQmJgY2rdvf0nN8VtcVMjBbVvMU5MH07bhsNtQFgtN2gRz7WPP1PhE8dLHS1Qri8VC8+bNad68OVdeeSU5OTns2LGD/Px8sy/Op59+Sps2bejXzxjLRSasFtXF1c0d11Jfso1bt6Vx67a1WCMhakbJBVLr169n48aN5Obm4unpSXx8PDExMTRt2vSS/N51dXOnZWQMLSNjACguLODAViMQO7AtFe96xvAXSdO+xMPbh8RB5a/yrkkSeInzzsfHh5iYGHPZbrcTGhpqdtbMzc01A7Hg4GBat25tDuoqhBDi3NhsNlxcXCgqKmLSpEnmd25MTAxt27bFxeXy+ql3dfegVXQsraJjyzzv28Cf+k2b1U6lSpFTjaLGZWRksGDBAnbs2EFhYSEWi4WWLVuag7c2atTokvxXJmpXfn6+eSsoKKCgoAAPDw8aNGhAnTp1pD+iuCjNmzePPXv2cN999wGwY8cOAgIC5EKnWiZ9vMQFyW63s3fvXrOT/uHDxrQqderUITg4mCuuuII6dS7OwfPE+edwOCgoKDADp4rurVYrvXv3BuCnn36ioKCAIUOMqZ8+/vhjjh07VmHZVquV+vXr07ZtW/N0+IEDB6hTp061j2EkRFU5HA52797Nhg0b6NevHx4eHmzYsIFjx45xxRVXSD/aC4j08RIXJKvVSmBgIIGBgfTp04fMzEwzCNu8ebP5A5qSksLJkyfp1KmTtEpc5Ox2e6XBU0FBAVdddRVKKZYuXcrOnTu5/fbbAZg2bRppaWlnLLskeCp539StW7fMkCg9e/bEZrPh4eGBp6cnHh4e5OXlcfz4cTIyMjh+/HiZ8r7++mvatWvHoEGDcDgczJo1Cz8/P+rXr0+DBg2oX78+Pj4+0jorqt2xY8fMqXsyMzNxc3MjNjaWVq1aER0dXdvVE+dIAi9xwahbty7x8fHEx8fjcDjMICstLY19+/aZE36vWbMGX19fgoKCcHNzq80qX5bsdnulrU6JiYl4eXmxefNmVq9ezW233YaLiwu//vory5cvr7RsFxcXrrjiCtzd3XF1dS3T9y8uLo42bdqUCZxK358+lUmPHmUHWIyMjKxwm0FBQeWe01ozePBg83RNfn4+hw4dIjU1FUepydDd3NzMQKxBgwaEhITQvHnzMhNlC/F35OXlmVP37N+/H6UUbdq0oU+fPoSGhsp330VMAi9xQSrdsnXddddRWFgIGE3tixYtIicnx2wxKxk3rGRwV3F2NpvtjIFTSEgIfn5+7N27lyVLlnD11VdTr1491qxZw6+//kqxc6DTMwkNDcXLywutNQ6Hw+z427p1a9zd3SsMmjw8PPDw8CgTPHXo0IEOHTqYy+Hh4dV2PE5X8iNXwtvbm4cffhi73U5mZmaZVrKMjAwOHDhASkoKnp6eNG/enIyMDD7//HOuv/562rVrR1ZWFunp6WaQVrolTojS7HY7M2fOZOvWrTgcDho1akTfvn2JiooyBz4VFzcJvMRFoWSAP4vFwmOPPcbu3bvNOSXnzZvHvHnz8PPzM4OwwMDA8zKZ64WsuLi4wuApICCARo0acfLkSRYuXEjHjh1p2rQpO3fuZPbs2RQUFFQaPNWpUwc/Pz9sNhsnTpygqKgIAH9/f+Lj488YOJXcl1xBFRkZWaaVqeS1uZiVnM6sX79+uXU2m81sDbNarURGRuLnZ1zGvnv3br7//nszraenp3m6svS9v7//Jf++FeUdPHiQffv2kZiYiNVqxWq10rFjR2JiYmjSpEltV0+cZ9K5Xlz0MjIyzL5hu3btwmaz0bdvX7p06UJhYSG5ubkV/lBeCIqLi8sFTnXq1CEgIICioiJ+//13QkJCaNOmDRkZGUybNs1MVzKP5ulK9v348eN89dVXDBgwgJCQEI4cOcKyZcvKBEpnCp6kk+75ZbPZyMjIKNNKVnKflZVlprvnnnto3rw527dvZ9OmTfTr1w9PT0/y8vJwcXGR00uXkJMnT+Lr64vVamXBggWsWrWKJ5988qIdRV6UJZ3rxSWtfv365mmp4uJidu/ejb+/P2D0D5s5cyb33nsvzZo1Iy8vDzc3t/M2ro3WulzLk6urK02bNgUgKSmJhg0bEhYWhs1m48svvywTaNnt9nJldujQgYCAACwWC8nJyfj5+dGmTRvc3Nxo2LBhpa1NHh4e5umIBg0a8Pjjj5vlNmrUiOuvv/687Lc4Ny4uLjRq1IhGjcqPnl1UVMSJEyc4fvy4+b7NzMxkx44dZuvXn3/+ycqVK/H19S3XSlbSAictZRe+wsJCUlJSWL9+Penp6dx6660EBwfTpUsXunXrJkHXZUJavMQlLTMzk61bt5KQkIDFYmHu3Ln89ddfBAUFmae+6tatS1FRkXlVncPhICAgAID169djsViIiooCYNasWZw4caJMoHV68BQcHMytt94KwPvvv09oaCgDBgxAa83UqVMJDAzEw8MDpVSFN4vFIldvijJsNpt5KtPhcGC32zn9u9tiseDr64tSCpvNhtb6ognGPDw8aN68+UVT33PhcDjYuXMn69evJzU1FZvNhp+fHzExMcTFxVG3bt3arqKoBtLiJS5bdevWLddBW2tNWloa27ZtA4wfrNJXqjVs2JCHHnoIgLVr15YJvIqLi3Fzc6NOnTpnbHUqPfbYY489ZgZRSim6dOmCr68vDRo0kCvexD9ScuGCzWbDbrfjcDjMH/Fjx46htTZb0DIyMtBaY7VacXFxMW9Wq7XW34daa44fP86+ffsqvML0YnX48GFzCIicnBw8PDyIjY0lOjqaFi1a1PpxF7VHAi9xWSkZN0xrzbFjx9i+fTu5ubllAqfSA2aWDIVQYvjw4ee0vdNbrgoKCggMDJQvXfGPWSwW3NzcKuz35efnV6ZFzGKxUFxcTFFRUbmWspJgzN3d3Xzv2+12LBZLjbxPlVI0aNCAo0ePVvu2qltRURFubm5orfnuu+84ceIEwcHBxMTEEBwcfEm26IlzJ4GXuCwppfD39zdbBM6kOjozS9AlqtvpF0fUq1cPoMwQH3a73WwxK7mVpDly5AheXl7UrVsXrTVZWVllWsnOd0vZpfCZWLZsGUlJSTzxxBO4urpy4403Uq9ePby9vWu7auICI4GXEEJcJpRSZuBUmTp16pitM3a7ndzc3HJpTj9l6e7uftlMxqy1Zs+ePaxfv56OHTvSuHFjmjVrRvv27bHZbLi6utKsWe1PxiwuTNKDVwhxTpKSkoiIiCA2Npb8/Pxq286UKVM4cOCAuXzPPfeQkpJSaZ6ePXtS+kKc5ORklFLMmzfPfC49PZ2pU6eWSTN37ty/Xc/AwMAzzgFZHf5pfU+Xk5PD/fffT5s2bWjfvj0JCQlMnTrVbO11cXExx4Zr0KABdevWxdvbG6vVis1mIycnh8zMTHOQ4+LiYo4cOWIuX3HFFSxbtqzCCwIuNhkZGSxcuJCPPvqIyZMns3HjRnOO2VatWnHVVVfJ4LjirC6PvydCiHNit9vP2CryzTff8Nxzz3HbbbdVqSytNVrrc75Sc8qUKURGRppDc0ycOPGc8oMxv2O3bt2YNm0a/fv3B04FXrfccgtgBDJr1qzhmmuuOefya8P5ru8999xD69atSUtLw2KxcPToUSZNmlQmTcmpQHd393JDHmitsdvtZU4XWq1W8/V2OBxkZmZy+PBhlFJmC9npLWYXqvz8fDZv3sz69evZu3cvAK1bt6Znz560a9dOhoAQ567kS/FCvsXHx2shLgUpKSm1XQW9a9cuHRoaqm+55Rbdrl07PXjwYJ2bm6tbtWqlx4wZo+Pi4vS0adP0r7/+qjt16qTj4uL0TTfdpLOzs/Xnn3+u/fz8dGBgoL7lllu01lq/++67OiEhQUdFRemXX37Z3EZISIi+/fbbdXh4uE5PTz9junbt2ul77rlHh4eH66uuukrn5eXpGTNmaG9vbx0SEqJjYmJ0Xl6evuKKK/Tq1au11lqPHj1ax8fH6/DwcLMsrXWZNA6HQwcFBent27frgIAAnZ+fr7XWumPHjrpOnTo6JiZGv/3227pFixa6YcOGOiYmRn/77bd65cqVulOnTjo2NlZ37txZb9myRWuttc1m008++aSOiIjQUVFR+qOPPtJaa92qVSv98ssv67i4OB0ZGalTU1O11lq/8sor+o477tDdunXTLVu21LNmzdJPP/20joyM1P369dNFRUVaa63XrFmje/Toodu3b6/79u2rDxw4YO7LmDFjdGJiog4ODtaLFy/WhYWF5ep7ulWrVunOnTvr6OhonZiYqLOysvTkyZP1gw8+aKYZMGCAXrhwod6+fbsOCgrSdru9wvfKwoULdbdu3fTAgQN1cHCw1lrr6667Trdv316Hh4frTz/91Ezr7e2tH3vsMR0eHq579eqljxw5orXWukePHvqJJ57Q8fHxuk2bNvqnn37Shw4d0vv37y9z27hxo9Za6x07duiFCxeax8dms1X+hq5GP/30k3799df1K6+8osePH6+TkpL0yZMna60+4uIBrNFniGmkxUuIWvLaT5tJOZB19oTnILxpHV4ZGHHWdFu3buWLL76ga9eu3HXXXfznP/8BjEFX161bx7Fjx7jxxhtZsGAB3t7evPPOO7z//vu8/PLLLFmyhGuvvZabbrqJ+fPnk5aWxqpVq9BaM2jQIBYvXkzLli1JS0vjyy+/pFOnTmdNN23aND7//HOGDh3KrFmzuO222/j4448ZO3YsCQnlh8J56623qF+/Pna7nd69e7Nhwwaio6PLpFm2bBlBQUG0adOGnj178r///Y/Bgwfz9ttvM3bsWH7++WcAGjduzJo1a/j4448ByMrKIikpCRcX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IYQQta5aAy+lVHNgADDRuayAXsBMZ5Ivgeursw5CCCGEEBeK6m7x+gAYA5SM3NcAOKm1LhlBbx/QrJrrIIQQQghxQai2wEspdS1wRGu99m/mv08ptUYptebo0aPnuXZCiL8rKSmJiIgIYmNjzzrK/D8xZcoUc9oaMMbRSklJqTRPz549KT30THJyMkop5s2bZz6Xnp7O1KlTy6SZO3fu365nYGAgx44d+9v5z9U/re+ZvPrqq4wdOxYofxyFEOdPdbZ4dQUGKaXSgW8xTjF+CNRTSpUM3Noc2F9RZq31Z1rrBK11QlXn3BJCnB8lo5hX5JtvvuG5554jOTm5SqN8a63LTFdTVacHXhMnTiQ8PPycypg2bRrdunUrM/XR+Q68atqFXN+qTAckxOWu2gIvrfVzWuvmWutAYDjwh9b6VmAhcJMz2QhgTnXVQQhRXnp6Ou3atePWW28lLCyMm266iby8PAIDA3nmmWdo3749M2bMYP78+XTu3Jn27dszZMgQcnJymDhxIt999x0vvfQSt956KwDvvfceiYmJREdH88orr5jbCA0N5Y477iAyMpK9e/eeMV1YWBj33nsvERER9O3bl/z8fGbOnMmaNWu49dZbzZa10q0w999/PwkJCURERJhlnU5rzYwZM5gyZQq//fabOafgs88+S1JSErGxsbzzzju8/PLLTJ8+ndjYWKZPn86qVavo3LkzcXFxdOnSha1btwJGMPrUU08RGRlJdHR0mZH+x48fT/v27YmKimLLli2A0YI0YsQIunfvTqtWrfj+++8ZM2YMUVFR9O/f35x8e+3atVxxxRXEx8fTr18/Dh48CBitTs888wwdOnQgJCSEpKQkioqKytW3tNWrV5sTUs+ZMwdPT0+KioooKCigdevWAHz++eckJiYSExPD4MGDycvLO+N7xeFwMHLkSHNKoaefftp8DT/99FPAmL+xe/fuDBo06JwDYyEuS1rrar8BPYGfnY9bA6uA7cAMwP1s+ePj47UQl4KUlJSyT0y65uy3JR+WTb/ua+NxzrHyaatg165dGtBLlizRWmt955136vfee0+3atVKv/POO1prrY8ePaq7d++uc3JytNZav/322/q1117TWms9YsQIPWPGDK211r/++qu+9957tcPh0Ha7XQ8YMED/+eefeteuXVoppZcvX37WdFarVf/1119aa62HDBmi//vf/2qttb7iiiv06tWrzXqXXj5+/LjWWmubzaavuOIKvX79+nJplixZonv16qW11vrmm2/WM2fO1FprvXDhQj1gwACz3MmTJ+sHH3zQXM7MzNTFxcVaa61/++03feONN2qttf7Pf/6jBw8ebK4rqUOrVq30Rx99pLXW+pNPPtF333231lrrV155RXft2lUXFRXp5ORk7enpqefOnau11vr666/Xs2fP1kVFRbpz5876yJEjWmutv/32W33nnXea+/LEE09orbX+3//+p3v37l1hfUsrLi7WQUFBWmutn3zySZ2QkKCXLFmiFy1apIcPH6611vrYsWNm+hdeeMGs+yuvvKLfe+89c9vLly/Xw4cP12+++abWWutPP/1Uv/HGG1prrQsKCnR8fLzeuXOnXrhwofby8tI7d+6ssE5VVe6zIcRFDFijzxDT1MhcjVrrRcAi5+OdQIea2K4QomKl5zi87bbb+OijjwDMef9WrFhBSkqKmaaoqMicZ7G0+fPnM3/+fOLi4gBjEM20tDRatmxJq1atzLn8KksXFBREbGwsAPHx8aSnp5+1/t999x2fffYZNpuNgwcPkpKSQnR0dJk006ZNY/jw4QAMHz6cr776isGDB5+17MzMTEaMGEFaWhpKKbNlasGCBYwePRoXF+Nrs379+maeklam+Ph4vv/+e/P5q6++GldXV6KiorDb7fTv3x+AqKgo0tPT2bp1K5s2bTIndbbb7QQEBFRYblWOi4uLC23atCE1NZVVq1bxxBNPsHjxYux2O927dwdg06ZNvPjii5w8eZKcnBz69etXYVmjRo1i6NChvPDCC4DxGm7YsMGcCDszM5O0tDTc3Nzo0KEDQUFBZ62fEEImyRaidt35v7+f3rvBued3MkZ2Kb/s7e0NGC3hV111VZm+URXRWvPcc88xatSoMs+np6ebZZ0tnbu7u7lstVrP2mF/165djB07ltWrV+Pn58fIkSPN04gl7HY7s2bNYs6cObz11ltorTl+/DjZ2dmVlg3w0ksvceWVVzJ79mzS09Pp2bPnWfOU7IPVai3Tz6nkeYvFgqurq3mcLRYLNpsNrTURERFlJgGvSrml9evXj8OHD5OQkMDEiRPp0aMHv/zyC66urvTp04eRI0dit9t57733AGPy8R9++IGYmBimTJnCokWLKiy3S5cuLFy4kCeffBIP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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "seed_idx = list(range(2,max_depth +1))\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "\n", + "for i in range(len(data)):\n", + " plt.plot(seed_idx, time_algo_cu[i], label = (str(names[i] + \"-cuGraph\")))\n", + "\n", + " plt.plot(seed_idx, time_algo_wk[i], label = (str(names[i] + \"-walker\")), linestyle='-.')\n", + "\n", + "\n", + "plt.title(f'Runtime vs. Path Length ({num_seeds} Seeds)')\n", + "plt.xlabel('Path length')\n", + "plt.ylabel('Runtime')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5164" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "del time_algo_cu\n", + "del time_algo_wk\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test 2: Runtime Speedup versus number of seeds\n", + "The number of seeds will be increased over a range in increments of 50. \n", + "The runtime will be the sum of runtime per increment. Increaing number of seeds by 1 would make for very long execution times " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\t.Random walks - T=2.28s\n", + ".Random walks - T=2.29s\n", + ".Random walks - T=2.28s\n", + ".Random walks - T=2.21s\n", + ".Random walks - T=1.95s\n", + ".Random walks - T=2.38s\n", + ".Random walks - T=2.00s\n", + ".Random walks - T=2.19s\n", + ".Random walks - T=1.99s\n", + ".Random walks - T=2.40s\n", + ".Random walks - T=1.95s\n", + ".Random walks - T=2.17s\n", + ".Random walks - T=1.95s\n", + ".Random walks - T=2.39s\n", + ".Random walks - T=1.97s\n", + ".Random walks - T=2.23s\n", + ".Random walks - T=2.63s\n", + ".Random walks - T=4.08s\n", + ".Random walks - T=3.44s\n", + ".Random walks - T=3.77s\n", + " \n", + "Reading ./data/dblp-2010.mtx...\n", + "\t.Random walks - T=6.61s\n", + ".Random walks - T=6.57s\n", + ".Random walks - T=6.48s\n", + ".Random walks - T=6.69s\n", + ".Random walks - T=6.11s\n", + ".Random walks - T=6.18s\n", + ".Random walks - T=4.98s\n", + ".Random walks - T=5.64s\n", + ".Random walks - T=3.83s\n", + ".Random walks - T=4.28s\n", + ".Random walks - T=4.34s\n", + ".Random walks - T=4.14s\n", + ".Random walks - T=3.79s\n", + ".Random walks - T=4.37s\n", + ".Random walks - T=4.00s\n", + ".Random walks - T=3.66s\n", + ".Random walks - T=4.01s\n", + ".Random walks - T=3.67s\n", + ".Random walks - T=4.32s\n", + ".Random walks - T=3.70s\n", + " \n", + "Reading ./data/coPapersCiteseer.mtx...\n", + "\t.Random walks - T=56.64s\n", + ".Random walks - T=52.26s\n", + ".Random walks - T=45.66s\n", + ".Random walks - T=48.81s\n", + ".Random walks - T=56.16s\n", + ".Random walks - T=56.73s\n", + ".Random walks - T=45.43s\n", + ".Random walks - T=44.96s\n", + ".Random walks - T=51.77s\n", + ".Random walks - T=58.39s\n", + ".Random walks - T=43.35s\n", + ".Random walks - T=42.89s\n", + ".Random walks - T=57.96s\n", + ".Random walks - T=45.03s\n", + ".Random walks - T=64.27s\n", + ".Random walks - T=52.57s\n", + ".Random walks - T=46.91s\n", + ".Random walks - T=55.62s\n", + ".Random walks - T=46.85s\n", + ".Random walks - T=44.84s\n", + " \n", + "Reading ./data/as-Skitter.mtx...\n", + "\t.Random walks - T=51.36s\n", + ".Random walks - T=52.06s\n", + ".Random walks - T=44.91s\n", + ".Random walks - T=49.73s\n", + ".Random walks - T=47.45s\n", + ".Random walks - T=52.21s\n", + ".Random walks - T=47.65s\n", + ".Random walks - T=45.49s\n", + ".Random walks - T=47.84s\n", + ".Random walks - T=43.48s\n", + ".Random walks - T=45.67s\n", + ".Random walks - T=45.75s\n", + ".Random walks - T=55.03s\n", + ".Random walks - T=46.39s\n", + ".Random walks - T=50.64s\n", + ".Random walks - T=43.87s\n", + ".Random walks - T=40.98s\n", + ".Random walks - T=49.42s\n", + ".Random walks - T=51.94s\n", + ".Random walks - T=49.28s\n", + " \n" + ] + } + ], + "source": [ + "# some parameters\n", + "rw_depth = 4\n", + "max_seeds = 1000\n", + "\n", + "# arrays to capture performance gains\n", + "names = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "time_algo_wk = [] # will be two dimensional\n", + "perf = [] # will be two dimensional\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " time_algo_wk.append([])\n", + " perf.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " gdf = read_data(v)\n", + " pdf = gdf.to_pandas()\n", + " \n", + " # Create the Graphs\n", + " Gcg = create_cu_ugraph(gdf)\n", + " Gnx = create_nx_ugraph(pdf)\n", + " \n", + " num_nodes = Gcg.number_of_nodes()\n", + " nodes = Gcg.nodes().to_array().tolist()\n", + " \n", + " print('\\t', end='')\n", + " for j in range (50, max_seeds +1, 50) :\n", + " print('.', end='')\n", + " seeds = random.sample(nodes, j)\n", + " tc = run_cu_rw(Gcg, seeds, rw_depth)\n", + " tw = run_wk_rw(Gnx, seeds, rw_depth)\n", + " \n", + " time_algo_cu[i].append(tc)\n", + " time_algo_wk[i].append(tw) \n", + " perf[i].append(tw/tc)\n", + " \n", + "\n", + " # update i\n", + " i = i + 1\n", + " print(\" \")\n", + " \n", + " del Gcg\n", + " del Gnx\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6CIqKyv585//zD//+U9uueUWLr/8cgB+/etfM378eAoKCrj11lujrzF06FC+8pWvMHLkSDZv3nzA9YYNG8bXv/51RowYwemnn05NTQ1PPvkkixYt4vLLL4/2xMX2fn3rW99i3LhxjBgxIrqvppxzPPHEE8yZM4f//Oc/0bFVN954I/PmzaOwsJA777yTn/zkJzz++OMUFhby+OOPs3DhQiZOnMiYMWM4+eSTWb16NRAJqddddx0jR46koKCA++67L/pa9913H0VFRYwaNYpVq1YB8NOf/pRZs2Zx6qmn0r9/f5566imuv/56Ro0axZlnnkl9fT0AixcvZsqUKYwdO5YzzjiD7du3A5HevhtuuIEJEyYwZMgQ5s2bRyAQ2K/ez8w512kfY8eOdW1p7qdz3cg5I93C7Qvb9HVERKR9rVy5Mt4luI0bNzrAvf32284557761a+6X//6165///7uzjvvdM45V1xc7E499VRXWVnpnHPujjvucD/72c+cc87NmjXLPfHEE845515++WX39a9/3YXDYRcKhdzZZ5/t3nzzTbdx40ZnZm7+/PmHXM/v97sPPvjAOefcRRdd5B566CHnnHNTpkxx77//frTu2Pndu3c755wLBoNuypQpbtmyZfut8/bbb7vp06c755y79NJL3ZNPPumcc27u3Lnu7LPPju73b3/7m7vmmmui82VlZa6+vt4559x//vMf98UvftE559wf/vAHd8EFF0SXNdTQv39/d++99zrnnPv973/vvva1rznnnLv11lvdKaec4gKBgFu6dKlLTU11L774onPOufPPP989/fTTLhAIuIkTJ7pdu3Y555x77LHH3Fe/+tXoe/nBD37gnHPuhRdecDNmzGi23qaa+xkDFrkDZBpd9uIgxnQbA8CSnUsY32N8nKsREZG28LPnPmLltvJW3efwXlnceu6IQ67Xt29fTjnlFACuuOIK7r33XgAuvvhiABYsWMDKlSuj6wQCASZOnLjffl555RVeeeUVxoyJ/L9VWVnJ2rVr6devH/379+ekk0465HoDBw6ksLAQgLFjx7Jp06ZD1v/Pf/6TBx54gGAwyPbt21m5ciUFBQWN1nn00Ue55JJLALjkkkv4+9//zgUXXHDIfZeVlTFr1izWrl2LmUV7sl599VW++c1vkpAQiTC5ubnRbb74xS9G63/qqaei7Wed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dgguHG403yWlC8d3OV5X7BcREZFWo0B2EJVvvsnaSadSv2NHo/aibkUsLV5KKByKU2UiIiJyNFEgO4jEvv0IlZZS8frrjdqLuhdRVV/F6j2rD7CliIiISMspkB1E8qCBJA0aROWrrzVq143GRUREpDUpkB1C5ozpVC1cSKi8PNrWI70HvdJ76XpkIiLSLn7605/Su3fv6A3Hn3322bjUsWbNGj73uc8xePBgioqK+NKXvsTOnTtZtGgR3/3udwF44403ePfdd+NSX2emQHYImTNmQDBI5ZtvNWov6l7Ekp1L6MzXcRMRkc7j2muvZenSpTzxxBNceeWVhJucdNZagsFgs+21tbWcffbZfOtb32Lt2rUsWbKE//f//h/FxcWMGzeOe++9F4hvIAuFOu/YbgWyQ0gpKMCfn0fFa40PWxZ1L2J37W4+rfg0TpWJiEhn9/e//52CggJGjx7Nl7/8ZTZt2sT06dMpKChgxowZfPrp/v/HDBs2jISEBEpKSjj//PMZO3YsI0aM4IEHHoiuk5GRwbXXXsuIESOYMWMGxcXFAKxfv54zzzyTsWPHcuqpp7Jq1SogcqHZb37zm5x44olcf/31vPnmmxQWFlJYWMiYMWOoqKjgkUceYeLEiZx77rnR15k6dSojR47kjTfe4JxzzmHTpk3cf//93H333RQWFjJv3jyKi4u54IILGD9+POPHj+edd94BaPY1AH79618zfvx4CgoKuPXWW6Ov9Y9//IMJEyZQWFjI1VdfHQ1fGRkZ/PCHP2T06NHMnz+/lb+hduSc67SPsWPHuvaw7Se3ulVjilyotjbatm7POjdyzkj31Jqn2qUGERFpPStXrox3CW7FihVu8ODBrri42Dnn3O7du90555zj5syZ45xz7i9/+Ys777zznHPO3Xrrre7Xv/61c865BQsWuJ49e7pwOOx2797tnHOuurrajRgxwpWUlDjnnAPcP/7xD+eccz/72c/cNddc45xzbvr06W7NmjXR/UybNs0559ysWbPc2Wef7YLBoHPOuXPOOce9/fbbzjnnKioqXH19vbv22mvdb3/722bfy9y5c93ZZ5+9X63OOXfppZe6efPmOeec++STT9wJJ5xwwNd4+eWX3de//nUXDoddKBRyZ599tnvzzTfdypUr3TnnnOMCgYBzzrlvfetb7sEHH4y+18cff/ywP/+21tzPGLDIHSDT6MKwLZA5cwZ7H3+c6gULyJgyBYBB2YPoktyFxTsX84XBX4hzhSIicqTuXHgnq0pXteo+T8g9gRsm3HDQdV5//XUuuugi8vLyAMjNzWX+/Pk89dRTAHz5y1/m+uuvj65/9913849//IPMzEwef/xxzIx7772Xp59+GoDNmzezdu1aunbtis/n4+KLLwbgiiuu4Itf/CKVlZW8++67XHTRRdF91tXVRacvuugi/H4/AKeccgo/+MEPuPzyy/niF79Inz59jvizePXVV1m5cmV0vry8nMrKymZf45VXXuGVV15hzJjIRdgrKytZu3Yty5cvZ/HixdH7fdbU1NCtWzcA/H4/F1xwwRHX11EokLVA2okn4ktPp+LV16KBzMwY022MBvaLiEi7uPbaa7nuuuui82+88Qavvvoq8+fPJy0tjalTp1JbW9vstmZGOBymS5cuLF26tNl10tPTo9M33ngjZ599Ni+++CKnnHIKL7/8MiNGjODNN9887LrD4TALFizY7+bnzb2Gc46bbrqJq6++utG69913H7NmzeKXv/zlfvtPSUmJBsnOTIGsBXxJSWRMmUzF3Ln0CIcxX2To3djuY5m7eS7F1cXkp+XHuUoRETkSh+rJaivTp0/nC1/4Aj/4wQ/o2rUrpaWlnHzyyTz22GN8+ctf5uGHH+bUU0894PZlZWXk5OSQlpbGqlWrWLBgQXRZOBzmySef5JJLLuGRRx5h0qRJZGVlMXDgQJ544gkuuuginHMsX76c0aNH77fv9evXM2rUKEaNGsX777/PqlWruOyyy/jlL3/JCy+8wNlnnw3AW2+9RW5ubqNtMzMzKY+5MsHpp5/Offfdx49+9CMAli5dSmFhYbOvccYZZ3DLLbdw+eWXk5GRwdatW0lMTGTGjBmcd955XHvttXTr1o3S0lIqKiro37//Z/oOOhIN6m+hjBkzCJWUULNsWbStqFsRAIt3LY5XWSIi0kmNGDGCH//4x0yZMoXRo0fzgx/8gPvuu4+//e1vFBQU8NBDD3HPPfcccPszzzyTYDDIsGHDuPHGGznppJOiy9LT01m4cCEjR47k9ddf5yc/+QkADz/8MH/5y18YPXo0I0aM4Jlnnml237/97W8ZOXIkBQUFJCYmctZZZ5Gamsrzzz/Pfffdx+DBgxk+fDh/+MMfyM9v3CFx7rnn8vTTT0cH9d97770sWrSIgoIChg8fzv3333/A1zj99NO57LLLmDhxIqNGjeLCCy+koqKC4cOH8/Of/5zTTz+dgoICTjvtNLZv3/5Zv4IOxVwnvmzDuHHj3KJFi9rltUIVFaw5+RS6zvoK3bwu4/pwPac8egrnH38+N594c7vUISIin93HH3/MsGHD4l1Gm8nIyKCysjLeZRzTmvsZM7PFzrlxza2vHrIW8mdmkj5hAhX/eTV67bFEXyIF+QW6Yr+IiIh8JgpkhyFz5gwCn3xCYMOGaNvYbmNZs2cN5YHyg2wpIiLSftQ71vkokB2GjOnTAaiIubdlUfciHI6lu5bGqSoRERHp7BTIDkNi9+6kFBQ0ump/QX4BCZbAB7s+iGNlIiIi0pkpkB2mzBkzqF2+nPqdOwFITUhleNfhGkcmIiIiR0yB7DBlzpwBQOXrr0fbiroX8WHJh9SF6g60mYiIiMgBKZAdpqRBg0gaMKDROLIx3cZQH65nRcmKOFYmIiLHittvv50RI0ZQUFBAYWEh7733HgADBgygpKRkv/VPPvlkADZt2sQjjzwSbV+6dCkvvvhi+xQtB6VAdpjMjMyZM6hauJCQd2f6hgvE6rCliIi0tfnz5/P888+zZMkSli9fzquvvkrfvn0Pus27774LtE4gCwaDh1+0HJIC2RHImDED6uupfOstALqkdOG47ON0xX4RETks559/PmPHjmXEiBE88MADhEIhZs+ezciRIxk1ahR33333ftts376dvLw8kpOTAcjLy6NXr16N1qmpqeGss87iT3/6ExC5UCxE7h85b948CgsLufPOO/nJT37C448/TmFhIY8//jhVVVVceeWVTJgwgTFjxkSv5D9nzhw+//nPM336dGbMmNGWH8kxS/eyPAKpo0fjz8uj8rXXyPbu51XUvYh/b/w3oXAIv6/z3+RURETa3l//+ldyc3Opqalh/PjxjB07lq1bt7JiRWQIzN69e/fb5vTTT+e2225jyJAhzJw5k4svvpgpU6ZEl1dWVnLJJZfwla98ha985SuNtr3jjju46667eP755wHo3r07ixYt4ne/+x0AN998M9OnT+evf/0re/fuZcKECcycORMg2iPX9N6V0joUyI6A+XxkTptG+YsvEg4E8CUlUdS9iCfWPMGaPWsY1vXovR2HiMjRZscvfkHdx6tadZ/Jw06gx82H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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "seed_idx = list(range (50, max_seeds +1, 50))\n", + "\n", + "plt.figure(figsize=(10,5))\n", + "\n", + "for i in range(len(data)):\n", + " plt.plot(seed_idx, perf[i], label = names[i] )\n", + "\n", + "plt.title('Speedup vs. Number of Seeds')\n", + "plt.xlabel('Number of Seeds')\n", + "plt.ylabel('Speedup')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3786" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "del time_algo_cu\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "-----\n", + "Copyright (c) 2021, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_dev", + "language": "python", + "name": "cugraph_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index 3c6da55ab..a6eeeb65c 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -22,6 +22,7 @@ "| Triangle Counting | X | |\n", "\n", "### Test Data\n", + "Users must run the _dataPrep.sh_ script before running this notebook so that the test files are downloaded\n", "\n", "| File Name | Num of Vertices | Num of Edges |\n", "| ---------------------- | --------------: | -----------: |\n", @@ -594,7 +595,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.8" } }, "nbformat": 4, From e526bcbc42693d485050cb5386014c90aa76d9c6 Mon Sep 17 00:00:00 2001 From: Joseph Nke <76006812+jnke2016@users.noreply.github.com> Date: Mon, 10 May 2021 08:53:26 -0500 Subject: [PATCH 141/384] Bindings for RMAT (#1573) Bindings for RMAT Bindings for the list of RMAT graphs includes some quick fixes to address some sphinx doc-building warnings closes #1473 Authors: - Joseph Nke (https://github.com/jnke2016) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Andrei Schaffer (https://github.com/aschaffer) - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1573 --- docs/cugraph/source/api.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/cugraph/source/api.rst b/docs/cugraph/source/api.rst index e2c2c19cf..adcf33d11 100644 --- a/docs/cugraph/source/api.rst +++ b/docs/cugraph/source/api.rst @@ -10,7 +10,7 @@ Structure Graph ----- -.. autoclass:: cugraph.structure.graph.Graph +.. autoclass:: cugraph.structure.graph_classes.Graph :members: :undoc-members: @@ -143,7 +143,7 @@ Core Number .. automodule:: cugraph.cores.core_number :members: :undoc-members: - + K-Core ------ @@ -196,7 +196,7 @@ Pagerank (MG) .. automodule:: cugraph.dask.link_analysis.pagerank :members: pagerank - :undoc-members: + :undoc-members: Link Prediction From 0b2175c152794039fc69d8a05b5115b926d5fc2b Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 25 May 2021 12:04:52 -0400 Subject: [PATCH 142/384] =?UTF-8?q?address=20'ValueError:=20Series=20conta?= =?UTF-8?q?ins=20NULL=20values'=20from=20from=5Fcudf=5Fedge=E2=80=A6=20(#1?= =?UTF-8?q?610)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `G.from_cudf_edgelist` after the `cudf.read_csv` fails with the following error - ``` --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 1 t_start_build_sg = time.perf_counter() 2 G = cugraph.DiGraph() ----> 3 G.from_cudf_edgelist(e_list, source='src', destination='dst') 4 t_stop_build_sg = time.perf_counter() /opt/conda/envs/rapids/lib/python3.7/site-packages/cugraph/structure/graph_classes.py in from_cudf_edgelist(self, input_df, source, destination, edge_attr, renumber) 127 destination=destination, 128 edge_attr=edge_attr, --> 129 renumber=renumber) 130 131 def from_cudf_adjlist(self, offset_col, index_col, value_col=None): /opt/conda/envs/rapids/lib/python3.7/site-packages/cugraph/structure/graph_implementation/simpleGraph.py in __from_edgelist(self, input_df, source, destination, edge_attr, renumber) 171 source_col, dest_col = symmetrize( 172 source_col, dest_col, multi=self.properties.multi_edge, --> 173 symmetrize=not self.properties.directed) 174 175 self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, /opt/conda/envs/rapids/lib/python3.7/site-packages/cugraph/structure/symmetrize.py in symmetrize(source_col, dest_col, value_col, multi, symmetrize) 200 ) 201 csg.null_check(source_col) --> 202 csg.null_check(dest_col) 203 if value_col is not None: 204 if isinstance(value_col, cudf.Series): /opt/conda/envs/rapids/lib/python3.7/site-packages/cugraph/structure/graph_classes.py in null_check(col) 23 def null_check(col): 24 if col.null_count != 0: ---> 25 raise ValueError("Series contains NULL values") 26 27 ValueError: Series contains NULL values ``` the header from the input is turning into NULLs - ``` $ head soc-LiveJournal1.txt # Directed graph (each unordered pair of nodes is saved once): soc-LiveJournal1.txt # Directed LiveJournal friednship social network # Nodes: 4847571 Edges: 68993773 # FromNodeId ToNodeId 0 1 0 2 0 3 ``` `e_list` ||src|dst |---|---|--- |0|0|NA |1|0|NA |2|0|NA |3|0|0 |4|0|1 ... this issue has existed since at least 0.16 and may warrant further test coverage for cudf's read_csv. Authors: - Matthew Farrellee (https://github.com/mattf) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/1610 --- notebooks/demo/batch_betweenness.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb index e2ad83ff1..885d26c95 100644 --- a/notebooks/demo/batch_betweenness.ipynb +++ b/notebooks/demo/batch_betweenness.ipynb @@ -138,7 +138,7 @@ "outputs": [], "source": [ "t_start_read_sg = time.perf_counter()\n", - "e_list = cudf.read_csv(input_data_path, delimiter='\\t', names=['src', 'dst'], dtype=['int32', 'int32'])\n", + "e_list = cudf.read_csv(input_data_path, delimiter='\\t', names=['src', 'dst'], dtype=['int32', 'int32'], comment='#')\n", "t_stop_read_sg = time.perf_counter()" ] }, From f551f9dc6826a09d0518392857383512c4b1cebb Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 4 Jun 2021 15:46:46 -0500 Subject: [PATCH 143/384] Made call to cugraph.random_walks() ignore the unused return value (#1648) Made call to cugraph.random_walks() ignore the unused return value. Manually tested in browser with jupyterlab. Author: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/1648 --- notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb index be50c0754..65cf9fb59 100644 --- a/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb @@ -124,7 +124,8 @@ "source": [ "def run_rw(_G, _seeds, _depth):\n", " t1 = time.time()\n", - " _, _ = cugraph.random_walks(_G, _seeds, _depth)\n", + " # cugraph.random_walks() returns a 3-tuple, which is being ignored here.\n", + " cugraph.random_walks(_G, _seeds, _depth)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -450,7 +451,7 @@ "metadata": {}, "outputs": [], "source": [ - "# sequenctial = so also get a single random seed\n", + "# sequential = so also get a single random seed\n", "for i in range (max_seeds) :\n", " for j in range(i):\n", " seeds = random.sample(nodes, 1)\n", From 40fa3018bd9762b35fde1f4cb30d7e76bf541859 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 9 Jun 2021 14:06:45 -0700 Subject: [PATCH 144/384] REL v21.06.00 release --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index a4633d04f..66c0cbc6b 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '0.20' +version = '21.06' # The full version, including alpha/beta/rc tags. -release = '0.20.0' +release = '21.06.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From fefc22008401f9b609e3d48d5d154b5c449fe6de Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 15 Jul 2021 16:59:20 -0400 Subject: [PATCH 145/384] DOC v21.10 Updates --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index a4633d04f..f2d60f53b 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '0.20' +version = '21.10' # The full version, including alpha/beta/rc tags. -release = '0.20.0' +release = '21.10.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 6fbfab3c8f0af75edb53836d87cc33dce7e1aa0d Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 20 Jul 2021 14:54:36 -0400 Subject: [PATCH 146/384] Doc updates (#1719) Added generator to API docs Removed reference to 11.2 environment Updated list of algorithms Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/1719 --- docs/cugraph/source/api.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/cugraph/source/api.rst b/docs/cugraph/source/api.rst index adcf33d11..a07044ecf 100644 --- a/docs/cugraph/source/api.rst +++ b/docs/cugraph/source/api.rst @@ -133,6 +133,12 @@ Connected Components :members: :undoc-members: +Connected Components (MG) +-------------------- + +.. automodule:: cugraph.dask.components.connectivity + :members: + :undoc-members: Cores ===== @@ -294,6 +300,18 @@ Maximum Spanning Tree :noindex: +Generator +========= + + RMAT + --------------------- + +.. automodule:: cugraph.generators +:members: rmat +:undoc-members: +:noindex: + + DASK MG Helper functions =========================== From 386fb964fdd6ca12789bd6f4802463b567f5f6c1 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Thu, 29 Jul 2021 09:09:02 -0400 Subject: [PATCH 147/384] Docs for RMAT (#1735) Fixed indentations so that docs appear correctly Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1735 --- docs/cugraph/source/api.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/cugraph/source/api.rst b/docs/cugraph/source/api.rst index a07044ecf..81c5e3e4e 100644 --- a/docs/cugraph/source/api.rst +++ b/docs/cugraph/source/api.rst @@ -302,14 +302,13 @@ Maximum Spanning Tree Generator ========= - - RMAT - --------------------- + +RMAT +--------------------- .. automodule:: cugraph.generators -:members: rmat -:undoc-members: -:noindex: + :members: rmat + :undoc-members: DASK MG Helper functions From 2419b7cee3d0a3cacf91ddd96641be52e2e20950 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:47:59 -0700 Subject: [PATCH 148/384] REL v21.08.00 release --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 66c0cbc6b..1198e2213 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -80,9 +80,9 @@ # built documents. # # The short X.Y version. -version = '21.06' +version = '21.08' # The full version, including alpha/beta/rc tags. -release = '21.06.00' +release = '21.08.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 76764424164905ea676075fd4291dca9f7f4975a Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 6 Aug 2021 13:28:43 -0700 Subject: [PATCH 149/384] REL v21.08.01 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 1198e2213..e570fa56c 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -82,7 +82,7 @@ # The short X.Y version. version = '21.08' # The full version, including alpha/beta/rc tags. -release = '21.08.00' +release = '21.08.01' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 64b9be60fb2059e550d9a58372990cf689276581 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Mon, 9 Aug 2021 09:54:26 -0400 Subject: [PATCH 150/384] updating notebooks (#1761) updating notebooks Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1761 --- notebooks/demo/uvm.ipynb | 60 +++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index 8fa2b08b6..08b04a99c 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -20,11 +20,41 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Data\n", + "### Data\n", "We will be analyzing **1.47 billion social relations** on 41.7 million user profiles from the Twitter dataset. The CSV file is 26GB and was collected in :
\n", "*What is Twitter, a social network or a news media? Haewoon Kwak, Changhyun Lee, Hosung Park, and Sue Moon. 2010.*
\n", "\n", - "Notice that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 80GB of memory available" + "__Notice__ that the memory requirement to read this 26GB dataset is already bigger than the memory of a single GPU. While we are not limited by the device memory size in this case, the whole system (host+device memory) should still have at least 84GB of memory available. Additionally, the more that host memory is used, the slower the process will be. \n", + "\n", + "If you run into memory issues (kernel crashing), then you can limit the amount of data loaded using the _nrows_ option with _read_csv_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize RMM\n", + "RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in RAPIDS libraries. Using RMM in python code is straightforward. Simply `import rmm` and configure RMM options to be used before making any call to a RAPIDS library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import rmm " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Set RMM to allocate all memory as managed memory (cudaMallocManaged underlying allocator)\n", + "rmm.mr.set_current_device_resource(rmm.mr.ManagedMemoryResource())\n", + "assert(rmm.is_initialized())" ] }, { @@ -43,7 +73,6 @@ "source": [ "# Import needed libraries. We recommend using cugraph_dev env through conda\n", "import time\n", - "import rmm \n", "import cudf \n", "import cugraph " ] @@ -105,25 +134,6 @@ "input_data_path = data_dir+fn" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Initialize RMM\n", - "RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in RAPIDS libraries. Using RMM in python code is straightforward. Simply `import rmm` and configure RMM options to be used before making any call to a RAPIDS library." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Set RMM to allocate all memory as managed memory (cudaMallocManaged underlying allocator)\n", - "rmm.reinitialize(managed_memory=True)\n", - "assert(rmm.is_initialized())" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -280,9 +290,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "cugraph_dev", "language": "python", - "name": "python3" + "name": "cugraph_dev" }, "language_info": { "codemirror_mode": { @@ -294,7 +304,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.10" } }, "nbformat": 4, From 82f50386b1a028b15ebc2e5e88dfbeb41ca113f6 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Mon, 16 Aug 2021 09:29:59 -0700 Subject: [PATCH 151/384] REL v21.08.02 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index e570fa56c..98b3aeec5 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -82,7 +82,7 @@ # The short X.Y version. version = '21.08' # The full version, including alpha/beta/rc tags. -release = '21.08.01' +release = '21.08.02' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 9c9ef95e0d9c5f5d100de36da5c3cb3aef1be63c Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Tue, 17 Aug 2021 07:01:00 -0700 Subject: [PATCH 152/384] REL v21.08.03 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 98b3aeec5..2b4c8bdb1 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -82,7 +82,7 @@ # The short X.Y version. version = '21.08' # The full version, including alpha/beta/rc tags. -release = '21.08.02' +release = '21.08.03' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 0e83e8fa722282ed2af8a8404bfcd2525c29310e Mon Sep 17 00:00:00 2001 From: GALI PREM SAGAR Date: Mon, 23 Aug 2021 14:56:13 -0500 Subject: [PATCH 153/384] Change python docs to pydata theme (#1785) This PR changes docs theme from sphinx_rtd_theme to use pydata-theme: https://pydata-sphinx-theme.readthedocs.io/en/latest/ Authors: - GALI PREM SAGAR (https://github.com/galipremsagar) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/1785 --- .gitignore | 3 + docs/cugraph/Makefile | 5 +- docs/cugraph/README.md | 21 +- docs/cugraph/requirement.txt | 4 - docs/cugraph/source/_static/copybutton.css | 42 --- .../source/_static/copybutton_pydocs.js | 65 ---- docs/cugraph/source/_static/example_mod.js | 61 ---- docs/cugraph/source/_static/params.css | 21 ++ docs/cugraph/source/api.rst | 324 ------------------ docs/cugraph/source/api_docs/centrality.rst | 29 ++ docs/cugraph/source/api_docs/community.rst | 81 +++++ docs/cugraph/source/api_docs/components.rst | 25 ++ docs/cugraph/source/api_docs/cores.rst | 21 ++ .../source/{ => api_docs}/dask-cugraph.rst | 0 docs/cugraph/source/api_docs/generator.rst | 14 + .../source/api_docs/helper_functions.rst | 16 + docs/cugraph/source/api_docs/index.rst | 27 ++ docs/cugraph/source/api_docs/layout.rst | 14 + .../source/api_docs/linear_assignment.rst | 13 + .../cugraph/source/api_docs/link_analysis.rst | 29 ++ .../source/api_docs/link_prediction.rst | 34 ++ docs/cugraph/source/api_docs/sampling.rst | 13 + docs/cugraph/source/api_docs/structure.rst | 68 ++++ docs/cugraph/source/api_docs/traversal.rst | 49 +++ docs/cugraph/source/api_docs/tree.rst | 22 ++ .../source/{ => basics}/cugraph_blogs.rst | 0 .../source/{ => basics}/cugraph_intro.md | 0 .../source/{ => basics}/cugraph_ref.rst | 0 docs/cugraph/source/basics/index.rst | 12 + .../source/{ => basics}/nx_transition.rst | 4 +- docs/cugraph/source/conf.py | 22 +- docs/cugraph/source/index.rst | 10 +- 32 files changed, 525 insertions(+), 524 deletions(-) delete mode 100644 docs/cugraph/requirement.txt delete mode 100644 docs/cugraph/source/_static/copybutton.css delete mode 100644 docs/cugraph/source/_static/copybutton_pydocs.js delete mode 100644 docs/cugraph/source/_static/example_mod.js delete mode 100644 docs/cugraph/source/api.rst create mode 100644 docs/cugraph/source/api_docs/centrality.rst create mode 100644 docs/cugraph/source/api_docs/community.rst create mode 100644 docs/cugraph/source/api_docs/components.rst create mode 100644 docs/cugraph/source/api_docs/cores.rst rename docs/cugraph/source/{ => api_docs}/dask-cugraph.rst (100%) create mode 100644 docs/cugraph/source/api_docs/generator.rst create mode 100644 docs/cugraph/source/api_docs/helper_functions.rst create mode 100644 docs/cugraph/source/api_docs/index.rst create mode 100644 docs/cugraph/source/api_docs/layout.rst create mode 100644 docs/cugraph/source/api_docs/linear_assignment.rst create mode 100644 docs/cugraph/source/api_docs/link_analysis.rst create mode 100644 docs/cugraph/source/api_docs/link_prediction.rst create mode 100644 docs/cugraph/source/api_docs/sampling.rst create mode 100644 docs/cugraph/source/api_docs/structure.rst create mode 100644 docs/cugraph/source/api_docs/traversal.rst create mode 100644 docs/cugraph/source/api_docs/tree.rst rename docs/cugraph/source/{ => basics}/cugraph_blogs.rst (100%) rename docs/cugraph/source/{ => basics}/cugraph_intro.md (100%) rename docs/cugraph/source/{ => basics}/cugraph_ref.rst (100%) create mode 100644 docs/cugraph/source/basics/index.rst rename docs/cugraph/source/{ => basics}/nx_transition.rst (99%) diff --git a/.gitignore b/.gitignore index c2498b35c..3afdcbccc 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,6 @@ python/_external_repositories/ # created by Dask tests python/dask-worker-space + +# Sphinx docs & build artifacts +docs/cugraph/source/api_docs/api/* diff --git a/docs/cugraph/Makefile b/docs/cugraph/Makefile index 9c35aa6fc..330c06bed 100644 --- a/docs/cugraph/Makefile +++ b/docs/cugraph/Makefile @@ -4,7 +4,7 @@ # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build -SPHINXPROJ = cuGraph +SPHINXPROJ = cugraph SOURCEDIR = source BUILDDIR = build IMGDIR = images @@ -18,5 +18,4 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - cp -r $(SOURCEDIR)/$(IMGDIR) $(BUILDDIR)/html + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/cugraph/README.md b/docs/cugraph/README.md index 199e743cd..734867af9 100644 --- a/docs/cugraph/README.md +++ b/docs/cugraph/README.md @@ -1,25 +1,28 @@ # Building Documentation -A basic python environment with packages listed in `./requirement.txt` is -enough to build the docs. Doc generation does not get run by default +All prerequisite for building docs are in the cugraph development conda environment. +[See build instructions](../../SOURCEBUILD.md) on how to create the development conda environment -## Get additional dependency +## Steps to follow: -```bash -pip install -r requirement.txt -``` +In order to build the docs, we need the conda dev environment from cugraph and we need to build cugraph from source. + +1. Create a conda env and build cugraph from source. The dependencies to build rapids from source are installed in that conda environment, and then rapids is built and installed into the same environment. + +2. Once cugraph is built from source, navigate to `../docs/cugraph/`. If you have your documentation written and want to turn it into HTML, run makefile: -## Run makefile: ```bash +# most be in the /docs/cugraph directory make html ``` -Outputs to `build/html/index.html` +This should run Sphinx in your shell, and outputs to `build/html/index.html` + ## View docs web page by opening HTML in browser: -First navigate to `/build/html/` folder, i.e., `cd build/html` and then run the following command: +First navigate to `/build/html/` folder, and then run the following command: ```bash python -m http.server diff --git a/docs/cugraph/requirement.txt b/docs/cugraph/requirement.txt deleted file mode 100644 index f636fd879..000000000 --- a/docs/cugraph/requirement.txt +++ /dev/null @@ -1,4 +0,0 @@ -sphinx -sphinx_rtd_theme -numpydoc -ipython \ No newline at end of file diff --git a/docs/cugraph/source/_static/copybutton.css b/docs/cugraph/source/_static/copybutton.css deleted file mode 100644 index 5eef6e366..000000000 --- a/docs/cugraph/source/_static/copybutton.css +++ /dev/null @@ -1,42 +0,0 @@ -/* This contains code with copyright by the scikit-learn project, subject to -the license in /thirdparty/LICENSES/LICENSE.scikit_learn */ - -/* copybutton */ -/* Adds "Show/Hide Output" button to Examples */ - -.copybutton { - cursor: pointer; - position: absolute; - top: 0px; - right: 0px; - border: 1px solid rgb(221, 221, 221); - color: rgb(221, 221, 221); - font-family: monospace; - padding-left: 0.2rem; - padding-right: 0.2rem; -} - -div.highlight:hover span.copybutton::after { - background: #3F556B; - border-radius: 0.25rem; - color: white; - content: attr(title); - padding: 0.25rem; - position: absolute; - z-index: 98; - width: 100px; - font-size: 0.7rem; - top: 0; - right: 0; -} - -/* copy buttonn */ -div.highlight:hover span.copybutton { - background-color: #3F556B; - color: white; -} - -div.highlight:hover span.copybutton:hover { - background-color: #20252B; -} - diff --git a/docs/cugraph/source/_static/copybutton_pydocs.js b/docs/cugraph/source/_static/copybutton_pydocs.js deleted file mode 100644 index cec05777e..000000000 --- a/docs/cugraph/source/_static/copybutton_pydocs.js +++ /dev/null @@ -1,65 +0,0 @@ -$(document).ready(function() { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-python3 .highlight,' + - '.highlight-pycon .highlight,' + - '.highlight-default .highlight'); - var pre = div.find('pre'); - - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide the prompts and output'; - var show_text = 'Show the prompts and output'; - var border_width = pre.css('border-top-width'); - var border_style = pre.css('border-top-style'); - var border_color = pre.css('border-top-color'); - var button_styles = { - 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', - 'border-color': border_color, 'border-style': border_style, - 'border-width': border_width, 'text-size': '75%', - 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '1.5em', - 'border-radius': '0 3px 0 0', - 'transition': "0.5s" - } - - // create and add the button to all the code blocks that contain >>> - div.each(function(index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('>>>'); - button.css(button_styles) - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function() { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); - - // define the behavior of the button when it's clicked - $('.copybutton').click(function(e){ - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); -}); - diff --git a/docs/cugraph/source/_static/example_mod.js b/docs/cugraph/source/_static/example_mod.js deleted file mode 100644 index 77dc618a8..000000000 --- a/docs/cugraph/source/_static/example_mod.js +++ /dev/null @@ -1,61 +0,0 @@ -// This contains code with copyright by the scikit-learn project, subject to -// the license in /thirdparty/LICENSES/LICENSE.scikit_learn - -$(document).ready(function () { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-python3 .highlight,' + - '.highlight-pycon .highlight,' + - '.highlight-default .highlight') - var pre = div.find('pre'); - - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide prompts and outputs'; - var show_text = 'Show prompts and outputs'; - - // create and add the button to all the code blocks that contain >>> - div.each(function (index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('>>>'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function () { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); - - // define the behavior of the button when it's clicked - $('.copybutton').click(function (e) { - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre') - .find('.gt') - .nextUntil('.gp, .go') - .css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre') - .find('.gt') - .nextUntil('.gp, .go') - .css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); -}); \ No newline at end of file diff --git a/docs/cugraph/source/_static/params.css b/docs/cugraph/source/_static/params.css index dc5cb9640..b57bcdb7c 100644 --- a/docs/cugraph/source/_static/params.css +++ b/docs/cugraph/source/_static/params.css @@ -7,3 +7,24 @@ margin: 0.5em; content: ":"; } + +:root { + + --pst-color-active-navigation: 114, 83, 237; + --pst-color-navbar-link: 77, 77, 77; + --pst-color-navbar-link-hover: var(--pst-color-active-navigation); + --pst-color-navbar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-link: 77, 77, 77; + --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); + --pst-color-sidebar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-expander-background-hover: 244, 244, 244; + --pst-color-sidebar-caption: 77, 77, 77; + --pst-color-toc-link: 119, 117, 122; + --pst-color-toc-link-hover: var(--pst-color-active-navigation); + --pst-color-toc-link-active: var(--pst-color-active-navigation); + +} + +.special-table td, .special-table th { + border: 1px solid #dee2e6; +} \ No newline at end of file diff --git a/docs/cugraph/source/api.rst b/docs/cugraph/source/api.rst deleted file mode 100644 index 81c5e3e4e..000000000 --- a/docs/cugraph/source/api.rst +++ /dev/null @@ -1,324 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~ -cuGraph API Reference -~~~~~~~~~~~~~~~~~~~~~ - - - -Structure -========= - -Graph ------ - -.. autoclass:: cugraph.structure.graph_classes.Graph - :members: - :undoc-members: - - -Symmetrize ----------- - -.. automodule:: cugraph.structure.symmetrize - :members: - :undoc-members: - -Conversion from Other Formats ------------------------------ - -.. automodule:: cugraph.structure.convert_matrix - :members: - :undoc-members: - - -Centrality -========== - -Betweenness Centrality ----------------------- - -.. automodule:: cugraph.centrality.betweenness_centrality - :members: - :undoc-members: - -Katz Centrality ---------------- - -.. automodule:: cugraph.centrality.katz_centrality - :members: - :undoc-members: - - -Katz Centrality (MG) --------------------- - -.. automodule:: cugraph.dask.centrality.katz_centrality - :members: - :undoc-members: - -Community -========= - -EgoNet ------------------------------------- - -.. automodule:: cugraph.community.egonet - :members: - :undoc-members: - -Ensemble clustering for graphs (ECG) ------------------------------------- - -.. automodule:: cugraph.community.ecg - :members: - :undoc-members: - -K-Truss -------- - -.. automodule:: cugraph.community.ktruss_subgraph - :members: - :undoc-members: - -Leiden -------- - -.. automodule:: cugraph.community.leiden - :members: - :undoc-members: - -Louvain -------- - -.. automodule:: cugraph.community.louvain - :members: - :undoc-members: - -Louvain (MG) ------------- - -.. automodule:: cugraph.dask.community.louvain - :members: - :undoc-members: - - -Spectral Clustering -------------------- - -.. automodule:: cugraph.community.spectral_clustering - :members: - :undoc-members: - -Subgraph Extraction -------------------- - -.. automodule:: cugraph.community.subgraph_extraction - :members: - :undoc-members: - -Triangle Counting ------------------ - -.. automodule:: cugraph.community.triangle_count - :members: - :undoc-members: - - -Components -========== - -Connected Components --------------------- - -.. automodule:: cugraph.components.connectivity - :members: - :undoc-members: - -Connected Components (MG) --------------------- - -.. automodule:: cugraph.dask.components.connectivity - :members: - :undoc-members: - -Cores -===== - -Core Number ------------ - -.. automodule:: cugraph.cores.core_number - :members: - :undoc-members: - -K-Core ------- - -.. automodule:: cugraph.cores.k_core - :members: - :undoc-members: - - -Layout -====== - -Force Atlas 2 -------------- - -.. automodule:: cugraph.layout.force_atlas2 - :members: - :undoc-members: - - -Linear Assignment -================= - -Hungarian -------------- - -.. automodule:: cugraph.linear_assignment.hungarian - :members: - :undoc-members: - - -Link Analysis -============= - -HITS ---------- - -.. automodule:: cugraph.link_analysis.hits - :members: - :undoc-members: - -Pagerank ---------- - -.. automodule:: cugraph.link_analysis.pagerank - :members: - :undoc-members: - -Pagerank (MG) -------------- - -.. automodule:: cugraph.dask.link_analysis.pagerank - :members: pagerank - :undoc-members: - - -Link Prediction -=============== - -Jaccard Coefficient -------------------- - -.. automodule:: cugraph.link_prediction.jaccard - :members: - :undoc-members: - -.. automodule:: cugraph.link_prediction.wjaccard - :members: - :undoc-members: - -Overlap Coefficient -------------------- - -.. automodule:: cugraph.link_prediction.overlap - :members: - :undoc-members: - -.. automodule:: cugraph.link_prediction.woverlap - :members: - :undoc-members: - - -Sampling -======== - -Random Walks ------------- - -.. automodule:: cugraph.sampling.random_walks - :members: - :undoc-members: - - -Traversal -========= - -Breadth-first-search --------------------- - -.. automodule:: cugraph.traversal.bfs - :members: - :undoc-members: - -Breadth-first-search (MG) -------------------------- - -.. automodule:: cugraph.dask.traversal.bfs - :members: - :undoc-members: - -Single-source-shortest-path ---------------------------- - -.. automodule:: cugraph.traversal.sssp - :members: - :undoc-members: - -Single-source-shortest-path (MG) --------------------------------- - -.. automodule:: cugraph.dask.traversal.sssp - :members: - :undoc-members: - -Traveling-salesperson-problem ------------------------------ - -.. automodule:: cugraph.traversal.traveling_salesperson - :members: - :undoc-members: - - -Tree -========= - -Minimum Spanning Tree ---------------------- - -.. automodule:: cugraph.tree.minimum_spanning_tree - :members: minimum_spanning_tree - :undoc-members: - -Maximum Spanning Tree ---------------------- - -.. automodule:: cugraph.tree.minimum_spanning_tree - :members: maximum_spanning_tree - :undoc-members: - :noindex: - - -Generator -========= - -RMAT ---------------------- - -.. automodule:: cugraph.generators - :members: rmat - :undoc-members: - - -DASK MG Helper functions -=========================== - -.. automodule:: cugraph.comms.comms - :members: initialize, destroy - :undoc-members: - :member-order: bysource - -.. automodule:: cugraph.dask.common.read_utils - :members: get_chunksize - :undoc-members: diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst new file mode 100644 index 000000000..2f43354ea --- /dev/null +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -0,0 +1,29 @@ +========== +Centrality +========== +.. currentmodule:: cugraph + + + +Betweenness Centrality +---------------------- +.. autosummary:: + :toctree: api/ + + cugraph.centrality.betweenness_centrality.betweenness_centrality + cugraph.centrality.betweenness_centrality.edge_betweenness_centrality + +Katz Centrality +--------------- +.. autosummary:: + :toctree: api/ + + cugraph.centrality.katz_centrality.katz_centrality + +Katz Centrality (MG) +-------------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.centrality.katz_centrality.call_katz_centrality + cugraph.dask.centrality.katz_centrality.katz_centrality diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/community.rst new file mode 100644 index 000000000..7f7752ae4 --- /dev/null +++ b/docs/cugraph/source/api_docs/community.rst @@ -0,0 +1,81 @@ +========= +Community +========= +.. currentmodule:: cugraph + + + +EgoNet +------ +.. autosummary:: + :toctree: api/ + + cugraph.community.egonet.batched_ego_graphs + cugraph.community.egonet.ego_graph + +Ensemble clustering for graphs (ECG) +------------------------------------ +.. autosummary:: + :toctree: api/ + + cugraph.community.ecg.ecg + + +K-Truss +------- +.. autosummary:: + :toctree: api/ + + cugraph.community.ktruss_subgraph.k_truss + cugraph.community.ktruss_subgraph.ktruss_subgraph + +Leiden +------ +.. autosummary:: + :toctree: api/ + + cugraph.community.leiden.leiden + + +Louvain +------- +.. autosummary:: + :toctree: api/ + + cugraph.community.louvain.louvain + + +Louvain (MG) +------------ +.. autosummary:: + :toctree: api/ + + cugraph.dask.community.louvain.call_louvain + cugraph.community.ktruss_subgraph.ktruss_subgraph + +Spectral Clustering +------------------- +.. autosummary:: + :toctree: api/ + + cugraph.community.spectral_clustering.analyzeClustering_edge_cut + cugraph.community.spectral_clustering.analyzeClustering_modularity + cugraph.community.spectral_clustering.analyzeClustering_ratio_cut + cugraph.community.spectral_clustering.spectralBalancedCutClustering + cugraph.community.spectral_clustering.spectralModularityMaximizationClustering + + +Subgraph Extraction +------------------- +.. autosummary:: + :toctree: api/ + + cugraph.community.subgraph_extraction.subgraph + + +Triangle Counting +----------------- +.. autosummary:: + :toctree: api/ + + cugraph.community.triangle_count.triangles diff --git a/docs/cugraph/source/api_docs/components.rst b/docs/cugraph/source/api_docs/components.rst new file mode 100644 index 000000000..0f7d3a9c2 --- /dev/null +++ b/docs/cugraph/source/api_docs/components.rst @@ -0,0 +1,25 @@ +========== +Components +========== +.. currentmodule:: cugraph + + + +Connected Components +-------------------- +.. autosummary:: + :toctree: api/ + + cugraph.components.connectivity.connected_components + cugraph.components.connectivity.strongly_connected_components + cugraph.components.connectivity.weakly_connected_components + + +Connected Components (MG) +------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.components.connectivity.call_wcc + cugraph.dask.components.connectivity.weakly_connected_components + diff --git a/docs/cugraph/source/api_docs/cores.rst b/docs/cugraph/source/api_docs/cores.rst new file mode 100644 index 000000000..344725914 --- /dev/null +++ b/docs/cugraph/source/api_docs/cores.rst @@ -0,0 +1,21 @@ +===== +Cores +===== +.. currentmodule:: cugraph + + + +Core Number +----------- +.. autosummary:: + :toctree: api/ + + cugraph.cores.core_number.core_number + + +K-Core +------ +.. autosummary:: + :toctree: api/ + + cugraph.centrality.katz_centrality.katz_centrality diff --git a/docs/cugraph/source/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst similarity index 100% rename from docs/cugraph/source/dask-cugraph.rst rename to docs/cugraph/source/api_docs/dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/generator.rst b/docs/cugraph/source/api_docs/generator.rst new file mode 100644 index 000000000..e89fe25e8 --- /dev/null +++ b/docs/cugraph/source/api_docs/generator.rst @@ -0,0 +1,14 @@ +========= +Generator +========= +.. currentmodule:: cugraph + + + +RMAT +---- +.. autosummary:: + :toctree: api/ + + cugraph.generators.rmat + diff --git a/docs/cugraph/source/api_docs/helper_functions.rst b/docs/cugraph/source/api_docs/helper_functions.rst new file mode 100644 index 000000000..f8a3f0495 --- /dev/null +++ b/docs/cugraph/source/api_docs/helper_functions.rst @@ -0,0 +1,16 @@ +======================== +DASK MG Helper functions +======================== +.. currentmodule:: cugraph + + + +Methods +------- +.. autosummary:: + :toctree: api/ + + cugraph.comms.comms.initialize + cugraph.comms.comms.destroy + cugraph.dask.common.read_utils.get_chunksize + diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst new file mode 100644 index 000000000..974217dfe --- /dev/null +++ b/docs/cugraph/source/api_docs/index.rst @@ -0,0 +1,27 @@ +============= +API reference +============= + +This page provides a list of all publicly accessible modules, methods and classes through +``cugraph.*`` namespace. + +.. toctree:: + :maxdepth: 2 + :caption: API Documentation + + structure + centrality + community + components + cores + layout + linear_assignment + link_analysis + link_prediction + sampling + traversal + tree + generator + helper_functions + dask-cugraph.rst + diff --git a/docs/cugraph/source/api_docs/layout.rst b/docs/cugraph/source/api_docs/layout.rst new file mode 100644 index 000000000..fc81df722 --- /dev/null +++ b/docs/cugraph/source/api_docs/layout.rst @@ -0,0 +1,14 @@ +====== +Layout +====== +.. currentmodule:: cugraph + + + +Force Atlas 2 +------------- +.. autosummary:: + :toctree: api/ + + cugraph.layout.force_atlas2.force_atlas2 + diff --git a/docs/cugraph/source/api_docs/linear_assignment.rst b/docs/cugraph/source/api_docs/linear_assignment.rst new file mode 100644 index 000000000..147597879 --- /dev/null +++ b/docs/cugraph/source/api_docs/linear_assignment.rst @@ -0,0 +1,13 @@ +================= +Linear Assignment +================= +.. currentmodule:: cugraph + + + +Hungarian +--------- +.. autosummary:: + :toctree: api/ + + cugraph.linear_assignment.hungarian diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/link_analysis.rst new file mode 100644 index 000000000..809fd3647 --- /dev/null +++ b/docs/cugraph/source/api_docs/link_analysis.rst @@ -0,0 +1,29 @@ +============= +Link Analysis +============= +.. currentmodule:: cugraph + + + +HITS +---- +.. autosummary:: + :toctree: api/ + + cugraph.link_analysis.hits.hits + + +Pagerank +-------- +.. autosummary:: + :toctree: api/ + + cugraph.centrality.katz_centrality.katz_centrality + +Pagerank (MG) +------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.link_analysis.pagerank.pagerank + diff --git a/docs/cugraph/source/api_docs/link_prediction.rst b/docs/cugraph/source/api_docs/link_prediction.rst new file mode 100644 index 000000000..0ecfde58d --- /dev/null +++ b/docs/cugraph/source/api_docs/link_prediction.rst @@ -0,0 +1,34 @@ +=============== +Link Prediction +=============== +.. currentmodule:: cugraph + + + +Jaccard Coefficient +------------------- +.. autosummary:: + :toctree: api/ + + cugraph.link_prediction.jaccard.jaccard + cugraph.link_prediction.jaccard.jaccard_coefficient + cugraph.link_prediction.wjaccard.jaccard_w + + +Overlap Coefficient +------------------- +.. autosummary:: + :toctree: api/ + + cugraph.link_prediction.overlap.overlap + cugraph.link_prediction.overlap.overlap_coefficient + cugraph.link_prediction.woverlap.overlap_w + + +Pagerank (MG) +------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.link_analysis.pagerank.pagerank + diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/sampling.rst new file mode 100644 index 000000000..de7f707fb --- /dev/null +++ b/docs/cugraph/source/api_docs/sampling.rst @@ -0,0 +1,13 @@ +======== +Sampling +======== +.. currentmodule:: cugraph + + + +Random Walks +------------ +.. autosummary:: + :toctree: api/ + + cugraph.sampling.random_walks.random_walks diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst new file mode 100644 index 000000000..e1781eda7 --- /dev/null +++ b/docs/cugraph/source/api_docs/structure.rst @@ -0,0 +1,68 @@ +========= +Structure +========= +.. currentmodule:: cugraph.structure.graph_classes + +Constructor +----------- +.. autosummary:: + :toctree: api/ + + Graph + + +Methods +------- +.. autosummary:: + :toctree: api/ + + Graph.add_internal_vertex_id + Graph.add_nodes_from + Graph.clear + Graph.from_cudf_adjlist + Graph.from_cudf_edgelist + Graph.from_dask_cudf_edgelist + Graph.from_numpy_array + Graph.from_numpy_matrix + Graph.from_pandas_adjacency + Graph.from_pandas_edgelist + Graph.has_isolated_vertices + Graph.is_bipartite + Graph.is_directed + Graph.is_multigraph + Graph.is_multipartite + Graph.is_renumbered + Graph.is_weighted + Graph.lookup_internal_vertex_id + Graph.to_directed + Graph.to_undirected + Graph.unrenumber + +.. currentmodule:: cugraph + +Symmetrize +---------- +.. autosummary:: + :toctree: api/ + + cugraph.structure.symmetrize.symmetrize + cugraph.structure.symmetrize.symmetrize_ddf + cugraph.structure.symmetrize.symmetrize_df + + +Conversion from Other Formats +----------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.structure.convert_matrix.from_adjlist + cugraph.structure.convert_matrix.from_cudf_edgelist + cugraph.structure.convert_matrix.from_edgelist + cugraph.structure.convert_matrix.from_numpy_array + cugraph.structure.convert_matrix.from_numpy_matrix + cugraph.structure.convert_matrix.from_pandas_adjacency + cugraph.structure.convert_matrix.from_pandas_edgelist + cugraph.structure.convert_matrix.to_numpy_array + cugraph.structure.convert_matrix.to_numpy_matrix + cugraph.structure.convert_matrix.to_pandas_adjacency + cugraph.structure.convert_matrix.to_pandas_edgelist \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/traversal.rst new file mode 100644 index 000000000..6a11a4a13 --- /dev/null +++ b/docs/cugraph/source/api_docs/traversal.rst @@ -0,0 +1,49 @@ +========= +Traversal +========= +.. currentmodule:: cugraph + + + +Breadth-first-search +-------------------- +.. autosummary:: + :toctree: api/ + + cugraph.traversal.bfs.bfs + cugraph.traversal.bfs.bfs_edges + +Breadth-first-search (MG) +------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.traversal.bfs.bfs + cugraph.dask.traversal.bfs.call_bfs + + +Single-source-shortest-path +--------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.traversal.sssp.filter_unreachable + cugraph.traversal.sssp.shortest_path + cugraph.traversal.sssp.shortest_path_length + cugraph.traversal.sssp.sssp + +Single-source-shortest-path (MG) +-------------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.traversal.sssp.call_sssp + cugraph.dask.traversal.sssp.sssp + + +Traveling-salesperson-problem +----------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.traversal.traveling_salesperson.traveling_salesperson diff --git a/docs/cugraph/source/api_docs/tree.rst b/docs/cugraph/source/api_docs/tree.rst new file mode 100644 index 000000000..7952c4fa3 --- /dev/null +++ b/docs/cugraph/source/api_docs/tree.rst @@ -0,0 +1,22 @@ +==== +Tree +==== +.. currentmodule:: cugraph + + + +Minimum Spanning Tree +--------------------- +.. autosummary:: + :toctree: api/ + + cugraph.tree.minimum_spanning_tree.minimum_spanning_tree + + +Maximum Spanning Tree +--------------------- +.. autosummary:: + :toctree: api/ + + cugraph.tree.minimum_spanning_tree.maximum_spanning_tree + diff --git a/docs/cugraph/source/cugraph_blogs.rst b/docs/cugraph/source/basics/cugraph_blogs.rst similarity index 100% rename from docs/cugraph/source/cugraph_blogs.rst rename to docs/cugraph/source/basics/cugraph_blogs.rst diff --git a/docs/cugraph/source/cugraph_intro.md b/docs/cugraph/source/basics/cugraph_intro.md similarity index 100% rename from docs/cugraph/source/cugraph_intro.md rename to docs/cugraph/source/basics/cugraph_intro.md diff --git a/docs/cugraph/source/cugraph_ref.rst b/docs/cugraph/source/basics/cugraph_ref.rst similarity index 100% rename from docs/cugraph/source/cugraph_ref.rst rename to docs/cugraph/source/basics/cugraph_ref.rst diff --git a/docs/cugraph/source/basics/index.rst b/docs/cugraph/source/basics/index.rst new file mode 100644 index 000000000..9260169ee --- /dev/null +++ b/docs/cugraph/source/basics/index.rst @@ -0,0 +1,12 @@ +====== +Basics +====== + + +.. toctree:: + :maxdepth: 2 + + cugraph_intro.md + cugraph_blogs.rst + cugraph_ref.rst + nx_transition.rst diff --git a/docs/cugraph/source/nx_transition.rst b/docs/cugraph/source/basics/nx_transition.rst similarity index 99% rename from docs/cugraph/source/nx_transition.rst rename to docs/cugraph/source/basics/nx_transition.rst index 6c57ab89c..3d116162c 100644 --- a/docs/cugraph/source/nx_transition.rst +++ b/docs/cugraph/source/basics/nx_transition.rst @@ -40,7 +40,7 @@ While module can be assigned any name can be used, we picked cnx to reduce the amount of text to be changed. The text highlighted in yellow indicates changes. -.. image:: ./images/Nx_Cg_1.png +.. image:: ../images/Nx_Cg_1.png :width: 600 It is that easy. All algorithms in cuGraph support a NetworkX graph object as @@ -191,7 +191,7 @@ If your code follows the above model of inserting one element at a time, the we 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 +.. 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/cugraph/source/conf.py b/docs/cugraph/source/conf.py index f2d60f53b..7857a4f0a 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -53,6 +53,7 @@ "IPython.sphinxext.ipython_directive", "nbsphinx", "recommonmark", + "sphinx_copybutton", ] @@ -72,7 +73,7 @@ # General information about the project. project = 'cugraph' -copyright = '2019-2020, NVIDIA' +copyright = '2019-2021, NVIDIA' author = 'NVIDIA' # The version info for the project you're documenting, acts as replacement for @@ -109,7 +110,7 @@ # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = 'pydata_sphinx_theme' # on_rtd is whether we are on readthedocs.org on_rtd = os.environ.get('READTHEDOCS', None) == 'True' @@ -118,16 +119,24 @@ # only import and set the theme if we're building docs locally # otherwise, readthedocs.org uses their theme by default, # so no need to specify it - import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + import pydata_sphinx_theme + html_theme = 'pydata_sphinx_theme' + html_theme_path = pydata_sphinx_theme.get_html_theme_path() +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + "external_links": [], + "github_url": "https://github.com/rapidsai/cugraph", + "twitter_url": "https://twitter.com/rapidsai", + "show_toc_level": 1, + "navbar_align": "right", +} # 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, @@ -202,7 +211,6 @@ def setup(app): - app.add_css_file('copybutton.css') app.add_css_file('params.css') app.add_css_file('references.css') diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 93184f40b..6eae4ceed 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -2,15 +2,11 @@ Welcome to cugraph's documentation! =================================== .. toctree:: - :maxdepth: 4 + :maxdepth: 2 :caption: Contents: - cugraph_intro.md - api.rst - dask-cugraph.rst - cugraph_blogs.rst - cugraph_ref.rst - nx_transition.rst + basics/index + api_docs/index Indices and tables ================== From 1e56ddacfb49bb2b0da0a9c465b24eff7efcc686 Mon Sep 17 00:00:00 2001 From: Paul Taylor Date: Fri, 10 Sep 2021 08:24:33 -0500 Subject: [PATCH 154/384] Add new new raft symlink path to .gitignore (#1808) Authors: - Paul Taylor (https://github.com/trxcllnt) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/1808 --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3afdcbccc..a2f8cab42 100644 --- a/.gitignore +++ b/.gitignore @@ -76,7 +76,8 @@ datasets/* cpp/doxygen/html # Raft symlink -python/cugraph/raft +python/cugraph/cugraph/raft +python/pylibcugraph/pylibcugraph/raft python/_external_repositories/ # created by Dask tests From baffbbd36401b880c67fcfbf279fba2f4da9c992 Mon Sep 17 00:00:00 2001 From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com> Date: Fri, 10 Sep 2021 11:06:06 -0400 Subject: [PATCH 155/384] remove tsp implementation from 21.10 (#1812) TSP implementation being removed Authors: - Chuck Hastings (https://github.com/ChuckHastings) Approvers: - Brad Rees (https://github.com/BradReesWork) - Seunghwa Kang (https://github.com/seunghwak) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1812 --- docs/cugraph/source/api_docs/traversal.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/traversal.rst index 6a11a4a13..2a6d6873f 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/traversal.rst @@ -39,11 +39,3 @@ Single-source-shortest-path (MG) cugraph.dask.traversal.sssp.call_sssp cugraph.dask.traversal.sssp.sssp - - -Traveling-salesperson-problem ------------------------------ -.. autosummary:: - :toctree: api/ - - cugraph.traversal.traveling_salesperson.traveling_salesperson From d4f4dcde641d70615827ebf78ef88853e55f2985 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 10 Sep 2021 10:07:15 -0500 Subject: [PATCH 156/384] Changed pylibcugraph connected_components APIs to use duck typing for CAI inputs, added doc placeholders (#1810) * Changed API to use duck-typing on `__cuda_array_interface__` types instead of requiring users to access and pass the `__cuda_array_interface__` object in directly. * Added initial placeholder for pylibcugraph docs and docstrings to cython file * Updated tests to not access the `__cuda_array_interface__` attr directly, added fixtures for easier code reuse, added test for invalid inputs, added FIXMEs to track tech debt in how return values are checked. Tested API changes by running new unit tests, and tested docs by running `./build.sh docs` and inspecting the html locally in a browser. NOTE: since this package is still limited to nightly releases (ie. it has not been part of a release yet), it is using the "non-breaking" label even though the user API has changed. attn: @BradReesWork and @raydouglass for the `pylibcugraph` placeholder docs in this PR ![image](https://user-images.githubusercontent.com/3039903/132440516-f3310756-d080-49bf-898a-0bc6581525eb.png) ![image](https://user-images.githubusercontent.com/3039903/132440640-920cf86a-6971-45bb-8d9d-c93229c762c4.png) Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/1810 --- docs/cugraph/source/api_docs/index.rst | 2 +- docs/cugraph/source/api_docs/pylibcugraph.rst | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 docs/cugraph/source/api_docs/pylibcugraph.rst diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 974217dfe..9da23c396 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -24,4 +24,4 @@ This page provides a list of all publicly accessible modules, methods and classe generator helper_functions dask-cugraph.rst - + pylibcugraph.rst diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/pylibcugraph.rst new file mode 100644 index 000000000..ffc2e84e3 --- /dev/null +++ b/docs/cugraph/source/api_docs/pylibcugraph.rst @@ -0,0 +1,15 @@ +~~~~~~~~~~~~~~~~~~~~~~ +pylibcugraph +~~~~~~~~~~~~~~~~~~~~~~ + +pylibcugraph + +.. currentmodule:: pylibcugraph + +Methods +------- +.. autosummary:: + :toctree: api/ + + pylibcugraph.components.strongly_connected_components + pylibcugraph.components.weakly_connected_components From 1882ca4933b093c27b4706390fe0b9a3dce0c278 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 14 Sep 2021 17:50:22 -0400 Subject: [PATCH 157/384] updated to new doc theme (#1793) Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1793 --- docs/cugraph/source/api_docs/structure.rst | 36 ++++++++++++-------- docs/cugraph/source/basics/cugraph_blogs.rst | 5 --- docs/cugraph/source/index.rst | 4 +++ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index e1781eda7..9f43079b7 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -1,31 +1,40 @@ -========= -Structure -========= -.. currentmodule:: cugraph.structure.graph_classes +============= +Graph Classes +============= +.. currentmodule:: cugraph -Constructor ------------ +Constructors +------------ .. autosummary:: :toctree: api/ Graph + MultiGraph + BiPartiteGraph -Methods -------- +Adding Data +----------- .. autosummary:: :toctree: api/ - Graph.add_internal_vertex_id - Graph.add_nodes_from - Graph.clear + Graph.from_cudf_adjlist Graph.from_cudf_edgelist Graph.from_dask_cudf_edgelist - Graph.from_numpy_array - Graph.from_numpy_matrix Graph.from_pandas_adjacency Graph.from_pandas_edgelist + Graph.from_numpy_array + Graph.from_numpy_matrix + Graph.add_internal_vertex_id + Graph.add_nodes_from + Graph.clear + +Checks +------ +.. autosummary:: + :toctree: api/ + Graph.has_isolated_vertices Graph.is_bipartite Graph.is_directed @@ -38,7 +47,6 @@ Methods Graph.to_undirected Graph.unrenumber -.. currentmodule:: cugraph Symmetrize ---------- diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/basics/cugraph_blogs.rst index cbbc93a1b..35db20ff4 100644 --- a/docs/cugraph/source/basics/cugraph_blogs.rst +++ b/docs/cugraph/source/basics/cugraph_blogs.rst @@ -48,8 +48,3 @@ Other BLOGS * `Where should I walk `_ * `Where really are the parking spots? `_ * `Accelerating Single Cell Genomic Analysis using RAPIDS `_ - - - - -Copyright (c) 2020, NVIDIA CORPORATION. diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 6eae4ceed..6b2d62fbd 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -1,5 +1,9 @@ Welcome to cugraph's documentation! =================================== +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 GPU DataFrames, +NetworkX Graphs, or even CuPy or SciPy sparse Matrices. .. toctree:: :maxdepth: 2 From f1b773da53310e8ec5b74254d64cb0132af13c54 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Thu, 16 Sep 2021 12:23:11 -0700 Subject: [PATCH 158/384] REL v21.08.04 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 2b4c8bdb1..9523bbd59 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -82,7 +82,7 @@ # The short X.Y version. version = '21.08' # The full version, including alpha/beta/rc tags. -release = '21.08.03' +release = '21.08.04' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 3014802e4f7adf28b689000088076df13e5199b1 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 16 Sep 2021 16:44:55 -0400 Subject: [PATCH 159/384] DOC v21.12 Updates --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 7857a4f0a..e9ccab365 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '21.10' +version = '21.12' # The full version, including alpha/beta/rc tags. -release = '21.10.00' +release = '21.12.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From f6a25b22b60e469c24ace53b9cedaa26ee309b87 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 6 Oct 2021 12:07:37 -0700 Subject: [PATCH 160/384] REL v21.10.00 release From e8dafa948105c54f72ed75d8934796c9f5e377f3 Mon Sep 17 00:00:00 2001 From: AJ Schmidt Date: Thu, 4 Nov 2021 10:03:47 -0400 Subject: [PATCH 161/384] DOC v22.02 Updates --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index e9ccab365..f0c0dc441 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '21.12' +version = '22.02' # The full version, including alpha/beta/rc tags. -release = '21.12.00' +release = '22.02.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From aea45228fc2c39325ec54c77e430e45836742d28 Mon Sep 17 00:00:00 2001 From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:45:27 -0500 Subject: [PATCH 162/384] add new demo notebook for louvain (#1927) Added a demonstration notebook for running MNMG Louvain Authors: - Chuck Hastings (https://github.com/ChuckHastings) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/1927 --- notebooks/demo/mg_louvain.ipynb | 403 ++++++++++++++++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 notebooks/demo/mg_louvain.ipynb diff --git a/notebooks/demo/mg_louvain.ipynb b/notebooks/demo/mg_louvain.ipynb new file mode 100644 index 000000000..1ce2150e6 --- /dev/null +++ b/notebooks/demo/mg_louvain.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multiple GPU Louvain in cuGraph\n", + "#### Author : Chuck Hastings\n", + "\n", + "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the Louvain partitions and global modularity score for a dataset.\n", + "\n", + "This notebook was tested using RAPIDS 21.12 and CUDA 11.4. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "\n", + "\n", + "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi GPU Louvain with cuGraph\n", + "### Basic setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries. We recommend using the [cugraph_dev](https://github.com/rapidsai/cugraph/tree/branch-21.12/conda/environments) env through conda\n", + "from dask.distributed import Client, wait\n", + "from dask_cuda import LocalCUDACluster\n", + "import cugraph.comms as Comms\n", + "import cugraph.dask as dask_cugraph\n", + "import cugraph\n", + "import dask_cudf\n", + "import time\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Hollywood dataset is in our S3 bucket and zipped. \n", + "1. We'll need to create a folder for our data in the `/data` folder\n", + "1. Download the zipped data into that folder from S3 (it will take some time as it it 6GB)\n", + "1. Decompress the zipped data for use (it will take some time as it it 26GB)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your data file, ../data/hollywood.csv, already exists\n" + ] + } + ], + "source": [ + "import urllib.request\n", + "import os\n", + "\n", + "data_dir = '../data/'\n", + "if not os.path.exists(data_dir):\n", + " print('creating data directory')\n", + " os.system('mkdir ../data')\n", + "\n", + "# download the Hollywood dataset\n", + "base_url = 'https://rapidsai-data.s3.us-east-2.amazonaws.com/cugraph/benchmark/'\n", + "fn = 'hollywood.csv'\n", + "comp = '.gz'\n", + "\n", + "if not os.path.isfile(data_dir+fn):\n", + " if not os.path.isfile(data_dir+fn+comp):\n", + " print(f'Downloading {base_url+fn+comp} to {data_dir+fn+comp}')\n", + " urllib.request.urlretrieve(base_url+fn+comp, data_dir+fn+comp)\n", + " print(f'Decompressing {data_dir+fn+comp}...')\n", + " os.system('gunzip '+data_dir+fn+comp)\n", + " print(f'{data_dir+fn+comp} decompressed!')\n", + "else:\n", + " print(f'Your data file, {data_dir+fn}, already exists')\n", + "\n", + "# File path, assuming Notebook directory\n", + "input_data_path = data_dir+fn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize multi-GPU environment\n", + "Before we get started, we need to setup a Dask local cluster of workers to execute our work and a client to coordinate and schedule work for that cluster. As we see below, we can initiate a cluster and client using only 3 lines of code." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n", + "distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n" + ] + } + ], + "source": [ + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "Comms.initialize(p2p=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Read the data from disk\n", + "cuGraph depends on cudf for data loading and the initial DataFrame creation. The CSV data file contains an edge list, which represents the connection of a vertex to another. The source to destination pairs is what is known as Coordinate Format (COO). In this test case, the data is just two columns. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Start ETL timer\n", + "t_start = time.time()\n", + "\n", + "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", + "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "\n", + "# Multi-GPU CSV reader\n", + "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a graph\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Read, load and renumber: 121.63822555541992 s\n" + ] + } + ], + "source": [ + "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", + "G = cugraph.DiGraph()\n", + "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst')\n", + "\n", + "# Print time\n", + "print(\"Read, load and renumber: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Call Louvain algorithm\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Louvain: 8.262660264968872 s\n" + ] + } + ], + "source": [ + "# Start Pagerank timer\n", + "t_start = time.time()\n", + "\n", + "# Get the Louvain partition assignments for each vertex and the global modularity score.\n", + "(louvain_df, modularity) = dask_cugraph.louvain(G)\n", + "\n", + "# Print time\n", + "print(\"Louvain: \", time.time()-t_start, \"s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It was that easy! Louvain should take 5-10 seconds to run on this 1.5GB input with two GPUs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Display subset of the Louvain result\n", + "\n", + "For now just display the louvain result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
partitionvertex
01484873
122951410343
21486216
32297098213
422970100890
.........
56961015711077778
5696110629654
56961233963203
569613273081077821
5696140239788
\n", + "

1139905 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " partition vertex\n", + "0 1 484873\n", + "1 22951 410343\n", + "2 1 486216\n", + "3 22970 98213\n", + "4 22970 100890\n", + "... ... ...\n", + "569610 1571 1077778\n", + "569611 0 629654\n", + "569612 33 963203\n", + "569613 27308 1077821\n", + "569614 0 239788\n", + "\n", + "[1139905 rows x 2 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "louvain_df.compute()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2021, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 97afba96a56ebe5f075d68449de71906c8d1bfb9 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:41:17 -0500 Subject: [PATCH 163/384] 22.02 dep fix (#1974) address cuDF deprecation of "to_array". some cleanup Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Joseph Nke (https://github.com/jnke2016) URL: https://github.com/rapidsai/cugraph/pull/1974 --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index a2f8cab42..fa7580040 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ __pycache__ .cache .coverage .vscode +.lock *.swp *.pytest_cache DartConfiguration.tcl @@ -32,6 +33,9 @@ dist/ cugraph.egg-info/ python/build python/cugraph/bindings/*.cpp + +## pylibcugraph build directories & artifacts +python/pylibcugraph/pylibcugraph.egg-info ## Patching *.diff @@ -82,6 +86,9 @@ python/_external_repositories/ # created by Dask tests python/dask-worker-space +python/cugraph/dask-worker-space +python/cugraph/cugraph/dask-worker-space +python/cugraph/cugraph/tests/dask-worker-space # Sphinx docs & build artifacts docs/cugraph/source/api_docs/api/* From 3bf5d085bdb1c65662e3e4f9cfab33f77789c2d4 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 8 Dec 2021 19:15:12 +0000 Subject: [PATCH 164/384] REL v21.12.00 release From 96b9c11839ed8c58363206c4aed7f685ea636a24 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 13 Jan 2022 10:38:10 -0500 Subject: [PATCH 165/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index f0c0dc441..c763f268f 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.02' +version = '22.04' # The full version, including alpha/beta/rc tags. -release = '22.02.00' +release = '22.04.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 428bb12d27d8c20876ab93dc6644b7d3da7a3b4d Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 25 Jan 2022 10:19:49 -0500 Subject: [PATCH 166/384] updated for release 22.02 (#2034) Updated the README with latest algorithm info and update the release benchmark notebook to include additional comparisons Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2034 --- notebooks/cugraph_benchmarks/release.ipynb | 623 ++++++++++++++++----- 1 file changed, 498 insertions(+), 125 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index a6eeeb65c..7d1c82468 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -4,22 +4,64 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Release Benchmarking\n", "# Skip notebook test\n", + "(this notebook is not executed as part of the RAPIDS cuGraph CI process. Execution could take a few hours)\n", + "\n", + "---\n", + "\n", + "# Release Benchmarking\n", "\n", "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n", "This notebook, starting with release 0.15, runs all the various algorithms to computes the performance gain. \n", "\n", + "\n", + "\n", + "\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Timing \n", + "When looking at the overall workflow, NetworkX and cuGraph do things differently. For example, NetworkX spends a lot of time creating the graph data structure. cuGraph on the other hand does a lazy creation of the data structure when an algorithm is called. \n", + "\n", + "To further complicate the comparison problem, NetworkX does not always return the answer. In some cases it returns a generator that is then called to get the data. \n", + "\n", + "This benchmark will measure time from an analyst perspective, how long does it take to create the graph and run an algorithm. \n", + "\n", + "__What is not timed__: Reading the data

\n", + "__What is timed__: (1) creating a Graph, (2) running the algorithm (3) run any generators\n", + "\n", + "\n", + "Notes:\n", + "* Since this is clean test data, we do not need to renumber the data.\n", + "* use default arguments in most cases\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "### Algorithms\n", - "| Algorithm | Graph | DiGraph |\n", - "| ------------------------| -------- | ----------- |\n", - "| BFS | X | |\n", - "| SSSP | X | |\n", - "| PageRank | | X |\n", - "| WCC | | X |\n", - "| Betweenness Centrality | X | |\n", - "| Louvain | X | |\n", - "| Triangle Counting | X | |\n", + "| Algorithm | Type | Graph | DiGraph | Notes\n", + "| ------------------------|---------------|------ | ------- |-------------\n", + "| Katz | Centrality | X | | \n", + "| Betweenness Centrality | Centrality | X | | Estimated, k = 100\n", + "| Betweenness Centrality | Centrality | X | | Estimated, k = 0.1% \n", + "| Louvain | Community | X | | Uses python-louvain for comparison\n", + "| Triangle Counting | Community | X | |\n", + "| WCC | Components | | X | Nx requires directed and returns a generator \n", + "| Core Number | Core | X | | \n", + "| PageRank | Link Analysis | | X |\n", + "| Jaccard | Similarity | X | |\n", + "| BFS | Traversal | X | | No depth limit \n", + "| SSSP | Traversal | X | | \n", + "\n", "\n", "### Test Data\n", "Users must run the _dataPrep.sh_ script before running this notebook so that the test files are downloaded\n", @@ -32,27 +74,25 @@ "| as-Skitter | 1,696,415 | 22,190,596 |\n", "\n", "\n", - "Notebook Credits\n", - "\n", - " Original Authors: Bradley Rees\n", - " Last Edit: 10/06/2020\n", - " \n", - "RAPIDS Versions: 0.16\n", "\n", - "Test Hardware\n", - " GV100 32G, CUDA 10.2\n", - " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", - " 32GB system memory\n", - " " + "### Notes\n", + "* Running Betweenness Centrality on the full graph is prohibited using NetworkX\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Timing \n", - "What is not timed: Reading the data

\n", - "What is timmed: (1) creating a Graph, (2) running the algorithm" + "Notebook Credits\n", + "\n", + " \n", + "| Author | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|------------------|-----------------|------------------------|\n", + "| Brad Rees | 10/06/2020 | created | 0.16 | GV100, CUDA 10.2 |\n", + "| Brad Rees | 01/20/2022 | updated | 22.02 | Quadro A6000 CUDA 11.5 |\n", + "\n", + "\n", + "\n" ] }, { @@ -73,6 +113,7 @@ "import os\n", "import time\n", "import numpy as np\n", + "import math\n", "\n", "# rapids\n", "import cugraph\n", @@ -99,24 +140,36 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "try: \n", - " import matplotlib\n", - "except ModuleNotFoundError:\n", - " os.system('pip install matplotlib')\n", - "\n", - "import matplotlib.pyplot as plt; plt.rcdefaults()\n" + "### Define the test data" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ - "### Define the test data" + "# Test Files\n", + "# set the data argument for full test or quick test\n", + "\n", + "data_full = {\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " 'dblp' : './data/dblp-2010.mtx',\n", + " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", + " 'as-Skitter' : './data/as-Skitter.mtx'\n", + "}\n", + "\n", + "# for quick testing\n", + "data_quick = {\n", + " 'karate' : './data/karate.mtx',\n", + "}\n", + "\n", + "\n", + "\n", + "data = data_full\n" ] }, { @@ -125,18 +178,8 @@ "metadata": {}, "outputs": [], "source": [ - "# Test File\n", - "# data = {\n", - "# 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", - "# 'dblp' : './data/dblp-2010.mtx',\n", - "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n", - "# 'as-Skitter' : './data/as-Skitter.mtx'\n", - "#}\n", - "\n", - "# for quick testing\n", - "data = {\n", - " 'polbooks' : './data/polbooks.mtx', \n", - "}\n" + "# Get the data - will auto skip if files exists\n", + "!./dataPrep.sh" ] }, { @@ -171,8 +214,8 @@ "source": [ "## Create Graph functions\n", "There are two types of graphs created:\n", - "Directed Graphs - calls to create_xx_digraph\n", - "Undirected Graphs - calls to create_xx_ugraph <- fully syemmeterized " + "* Directed Graphs - calls to create_xx_digraph\n", + "* Undirected Graphs - calls to create_xx_ugraph <- fully syemmeterized " ] }, { @@ -193,12 +236,12 @@ "\n", "# cuGraph\n", "def create_cu_digraph(_df):\n", - " _g = cugraph.DiGraph()\n", + " _g = cugraph.Graph(directed=True)\n", " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", " return _g\n", "\n", "def create_cu_ugraph(_df):\n", - " _g = cugraph.Graph()\n", + " _g = cugraph.Graph(directed=False)\n", " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", " return _g" ] @@ -207,7 +250,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### BFS" + "## Algorithm Execution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Katz" ] }, { @@ -216,17 +266,17 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_bfs(_df):\n", + "def nx_katz(_df, alpha):\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", - " _ = nx.bfs_edges(_G, 1)\n", + " _ = nx.katz_centrality(_G, alpha)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_bfs(_df):\n", + "def cu_katz(_df, alpha):\n", " t1 = time.time()\n", " _G = create_cu_ugraph(_df)\n", - " _ = cugraph.bfs(_G, 1)\n", + " _ = cugraph.katz_centrality(_G, alpha)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -235,7 +285,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### SSSP" + "### Betweenness Centrality" ] }, { @@ -244,17 +294,17 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_sssp(_df):\n", + "def nx_bc(_df, _k):\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", - " _ = nx.shortest_path(_G, 1)\n", + " _ = nx.betweenness_centrality(_G, k=_k)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_sssp(_df):\n", + "def cu_bc(_df, _k):\n", " t1 = time.time()\n", - " _G = create_cu_ugraph(_df) \n", - " _ = cugraph.sssp(_G, 1)\n", + " _G = create_cu_ugraph(_df)\n", + " _ = cugraph.betweenness_centrality(_G, k=_k)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -263,7 +313,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### PageRank" + "### Louvain" ] }, { @@ -272,17 +322,55 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_pagerank(_df):\n", + "def nx_louvain(_df):\n", " t1 = time.time()\n", - " _G = create_nx_digraph(_df)\n", - " _ = nx.pagerank(_G)\n", + " _G = create_nx_ugraph(_df)\n", + " parts = community.best_partition(_G)\n", + " \n", + " # Calculating modularity scores for comparison \n", + " _ = community.modularity(parts, _G) \n", + " \n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_pagerank(_df):\n", + "def cu_louvain(_df):\n", " t1 = time.time()\n", - " _G = create_cu_digraph(_df)\n", - " _ = cugraph.pagerank(_G)\n", + " _G = create_cu_ugraph(_df)\n", + " _,_ = cugraph.louvain(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Triangle Counting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_tc(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " nx_count = nx.triangles(_G)\n", + " \n", + " # To get the number of triangles, we would need to loop through the array and add up each count\n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value \n", + " \n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_tc(_df):\n", + " t1 = time.time()\n", + " _G = create_cu_ugraph(_df)\n", + " _ = cugraph.triangles(_G)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -303,7 +391,13 @@ "def nx_wcc(_df):\n", " t1 = time.time()\n", " _G = create_nx_digraph(_df)\n", - " _ = nx.weakly_connected_components(_G)\n", + " gen = nx.weakly_connected_components(_G)\n", + "\n", + " list_of_digraphs = []\n", + "\n", + " for subgraph in gen:\n", + " list_of_digraphs.append(nx.subgraph(_G, subgraph))\n", + " \n", " t2 = time.time() - t1\n", " return t2\n", "\n", @@ -319,7 +413,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Betweenness Centrality (vertex)" + "### Core Number" ] }, { @@ -328,17 +422,22 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_bc(_df):\n", + "def nx_core_num(_df):\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", - " _ = nx.betweenness_centrality(_G, k=100)\n", + " nx_count = nx.core_number(_G)\n", + " \n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value \n", + " \n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_bc(_df):\n", + "def cu_core_num(_df):\n", " t1 = time.time()\n", - " _G = create_cu_ugraph(_df)\n", - " _ = cugraph.betweenness_centrality(_G, k=100)\n", + " _G = create_cu_ugraph(_df) \n", + " _ = cugraph.core_number(_G)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -347,7 +446,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Louvain" + "### PageRank" ] }, { @@ -356,21 +455,45 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_louvain(_df):\n", + "def nx_pagerank(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_digraph(_df)\n", + " _ = nx.pagerank(_G)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_pagerank(_df):\n", + " t1 = time.time()\n", + " _G = create_cu_digraph(_df)\n", + " _ = cugraph.pagerank(_G)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Jaccard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_jaccard(_df):\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", - " parts = community.best_partition(_G)\n", - " \n", - " # Calculating modularity scores for comparison \n", - " _ = community.modularity(parts, _G) \n", - " \n", + " _ = nx.jaccard_coefficient(_G)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_louvain(_df):\n", + "def cu_jaccard(_df):\n", " t1 = time.time()\n", " _G = create_cu_ugraph(_df)\n", - " _,_ = cugraph.louvain(_G)\n", + " _ = cugraph.jaccard_coefficient(_G)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -379,7 +502,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Triangle Counting" + "### BFS" ] }, { @@ -388,23 +511,17 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_tc(_df):\n", + "def nx_bfs(_df):\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", - " nx_count = nx.triangles(_G)\n", - " \n", - " # To get the number of triangles, we would need to loop through the array and add up each count\n", - " count = 0\n", - " for key, value in nx_count.items():\n", - " count = count + value \n", - " \n", + " _ = nx.bfs_edges(_G, 1)\n", " t2 = time.time() - t1\n", " return t2\n", "\n", - "def cu_tc(_df):\n", + "def cu_bfs(_df):\n", " t1 = time.time()\n", " _G = create_cu_ugraph(_df)\n", - " _ = cugraph.triangles(_G)\n", + " _ = cugraph.bfs(_G, 1)\n", " t2 = time.time() - t1\n", " return t2" ] @@ -413,7 +530,44 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Benchmark Functions" + "### SSSP" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_sssp(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = nx.shortest_path(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_sssp(_df):\n", + " t1 = time.time()\n", + " _G = create_cu_ugraph(_df) \n", + " _ = cugraph.sssp(_G, 1)\n", + " t2 = time.time() - t1\n", + " return t2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "# Benchmark" ] }, { @@ -436,6 +590,7 @@ "# This cell might not be needed\n", "v = './data/preferentialAttachment.mtx'\n", "gdf = read_data(v)\n", + "pdf = gdf.to_pandas()\n", "print(f\"\\tGDF Size {len(gdf)}\")\n", "\n", "g = create_cu_ugraph(gdf)\n", @@ -443,12 +598,30 @@ "print(f\"\\tcugraph Size {g.number_of_edges()}\")\n", "print(f\"\\tcugraph Order {g.number_of_vertices()}\")\n", "\n", + "gnx = create_nx_ugraph(pdf)\n", + "\n", "# clean up what we just created\n", "del gdf\n", + "del pdf\n", "del g\n", + "del gnx\n", "gc.collect()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -457,13 +630,14 @@ "source": [ "# arrays to capture performance gains\n", "names = []\n", + "algos = []\n", "\n", "# Two dimension data\n", "time_algo_cu = [] # will be two dimensional\n", "time_algo_nx = [] # will be two dimensional\n", "perf = []\n", "\n", - "\n", + "algos.append(\" \")\n", "\n", "i = 0\n", "for k,v in data.items():\n", @@ -479,76 +653,188 @@ " pdf = gdf.to_pandas()\n", " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", "\n", - " # BFS\n", - " print(\"\\tBFS\")\n", - " tx = nx_bfs(pdf)\n", - " tc = cu_bfs(gdf)\n", + " # prep\n", + " tmp_g = create_cu_ugraph(gdf)\n", + " deg = tmp_g.degree()\n", + " deg_max = deg['degree'].max()\n", "\n", + " alpha = 1 / deg_max\n", + " num_nodes = tmp_g.number_of_vertices()\n", + " \n", + " del tmp_g\n", + " del deg\n", + " \n", + " \n", + " #----- Algorithm order is same as defined at top ----\n", + " \n", + " # Katz \n", + " print(\"\\tKatz \", end = '')\n", + " if i == 0: \n", + " algos.append(\"Katz\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_katz(pdf, alpha)\n", + " print(\"c.\", end='')\n", + " tc = cu_katz(gdf, alpha)\n", + " print(\"\")\n", + " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", " \n", - " # SSSP\n", - " print(\"\\tSSSP\")\n", - " tx = nx_sssp(pdf)\n", - " tc = cu_sssp(gdf)\n", - "\n", + " \n", + " # BC\n", + " print(\"\\tBC k=100 \", end='')\n", + " if i == 0:\n", + " algos.append(\"BC Estimate fixed\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_bc(pdf, 100)\n", + " print(\"c.\", end='')\n", + " tc = cu_bc(gdf, 100)\n", + " print(\" \")\n", + " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", + " \n", "\n", - " # PageRank\n", - " print(\"\\tPageRank\") \n", - " tx = nx_pagerank(pdf)\n", - " tc = cu_pagerank(gdf)\n", + " # Louvain\n", + " print(\"\\tLouvain \", end='')\n", + " if i == 0:\n", + " algos.append(\"Louvain\")\n", "\n", + " print(\"n.\", end='')\n", + " tx = nx_louvain(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_louvain(gdf)\n", + " print(\" \")\n", + " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", + " \n", + " # TC\n", + " print(\"\\tTC \", end='')\n", + " if i == 0:\n", + " algos.append(\"TC\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_tc(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_tc(gdf)\n", + " print(\" \")\n", + " \n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + " gc.collect()\n", + "\n", "\n", " # WCC\n", - " print(\"\\tWCC\")\n", + " print(\"\\tWCC \", end='')\n", + " if i == 0:\n", + " algos.append(\"WCC\")\n", + "\n", + " print(\"n.\", end='')\n", " tx = nx_wcc(pdf)\n", + " print(\"c.\", end='')\n", " tc = cu_wcc(gdf)\n", + " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", + " \n", + " # Core Number\n", + " print(\"\\tCore Number \", end='')\n", + " if i == 0:\n", + " algos.append(\"Core Number\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_core_num(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_core_num(gdf)\n", + " print(\" \")\n", + " \n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + " gc.collect() \n", "\n", - " # BC\n", - " print(\"\\tBC\")\n", - " tx = nx_bc(pdf)\n", - " tc = cu_bc(gdf)\n", + " \n", + " # PageRank\n", + " print(\"\\tPageRank \", end='')\n", + " if i == 0:\n", + " algos.append(\"PageRank\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_pagerank(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_pagerank(gdf)\n", + " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", + " \n", + " \n", + " # Jaccard\n", + " print(\"\\tJaccard \", end='')\n", + " if i == 0:\n", + " algos.append(\"Jaccard\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_jaccard(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_jaccard(gdf)\n", + " print(\" \")\n", + " \n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + " gc.collect()\n", + " \n", "\n", - " # Louvain\n", - " print(\"\\tLouvain\")\n", - " tx = nx_louvain(pdf)\n", - " tc = cu_louvain(gdf)\n", + " # BFS\n", + " print(\"\\tBFS \", end='')\n", + " if i == 0:\n", + " algos.append(\"BFS\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_bfs(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_bfs(gdf)\n", + " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", + " \n", + " \n", + " # SSSP\n", + " print(\"\\tSSSP \", end='')\n", + " if i == 0:\n", + " algos.append(\"SSP\")\n", "\n", - " # TC\n", - " print(\"\\tTC\")\n", - " tx = nx_tc(pdf)\n", - " tc = cu_tc(gdf)\n", + " print(\"n.\", end='')\n", + " tx = nx_sssp(pdf)\n", + " print(\"c.\", end='')\n", + " tc = cu_sssp(gdf)\n", + " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", " perf[i].append(tx/tc)\n", " gc.collect()\n", "\n", + " # increament count\n", " i = i + 1\n", "\n" ] @@ -560,6 +846,93 @@ "outputs": [], "source": [ "#Print results\n", + "print(algos)\n", + "\n", + "for i in range(num_datasets):\n", + " print(f\"{names[i]}\")\n", + " print(f\"{perf[i]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The following section is to rerun portions of the benchamrks if needed" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# arrays to capture performance gains\n", + "names = []\n", + "algos = []\n", + "\n", + "# Two dimension data\n", + "time_algo_cu = [] # will be two dimensional\n", + "time_algo_nx = [] # will be two dimensional\n", + "perf = []\n", + "\n", + "algos.append(\" \")\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " time_algo_cu.append([])\n", + " time_algo_nx.append([])\n", + " perf.append([])\n", + " \n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # read data\n", + " gdf = read_data(v)\n", + " pdf = gdf.to_pandas()\n", + " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", + "\n", + " # prep\n", + " tmp_g = create_cu_ugraph(gdf)\n", + " deg = tmp_g.degree()\n", + " deg_max = deg['degree'].max()\n", + "\n", + " alpha = 1 / deg_max\n", + " num_nodes = tmp_g.number_of_vertices()\n", + " \n", + " del tmp_g\n", + " del deg\n", + " \n", + " \n", + " #----- Algorithm order is same as defined at top ----\n", + " \n", + " # testing BC with large k values\n", + " # BC - Estimate\n", + " print(\"\\tBC k = 0.1% (x 0.001) \", end='')\n", + " if i == 0:\n", + " algos.append(\"BC Estimate percent\")\n", + " \n", + " k = math.ceil(num_nodes * 0.001)\n", + " \n", + " print(\"n.\", end='')\n", + " tx = nx_bc(pdf, k)\n", + " print(\"c.\", end='')\n", + " tc = cu_bc(gdf, k)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf[i].append(tx/tc)\n", + " gc.collect() \n", + " \n", + " # increament count\n", + " i = i + 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#Print results\n", + "print(algos)\n", + "\n", "for i in range(num_datasets):\n", " print(f\"{names[i]}\")\n", " print(f\"{perf[i]}\")" @@ -595,7 +968,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.8.12" } }, "nbformat": 4, From 3762c755a42b4dfbb8251a7f13a6c3f1f446c95d Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Wed, 26 Jan 2022 18:48:54 -0800 Subject: [PATCH 167/384] Initial automated doctest, all current examples now pass, other documentation edits (#2014) Closes #2012 and #2022 Authors: - https://github.com/betochimas Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2014 --- docs/cugraph/source/api_docs/centrality.rst | 2 +- docs/cugraph/source/api_docs/community.rst | 2 +- docs/cugraph/source/api_docs/cores.rst | 2 +- docs/cugraph/source/api_docs/link_analysis.rst | 2 +- docs/cugraph/source/api_docs/link_prediction.rst | 8 -------- docs/cugraph/source/api_docs/structure.rst | 11 +++++++++-- docs/cugraph/source/api_docs/traversal.rst | 1 - docs/cugraph/source/conf.py | 7 ++++--- 8 files changed, 17 insertions(+), 18 deletions(-) diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index 2f43354ea..81c4577fa 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -25,5 +25,5 @@ Katz Centrality (MG) .. autosummary:: :toctree: api/ - cugraph.dask.centrality.katz_centrality.call_katz_centrality cugraph.dask.centrality.katz_centrality.katz_centrality + cugraph.dask.centrality.katz_centrality.call_katz_centrality diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/community.rst index 7f7752ae4..98292e6fb 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/community.rst @@ -51,7 +51,7 @@ Louvain (MG) :toctree: api/ cugraph.dask.community.louvain.call_louvain - cugraph.community.ktruss_subgraph.ktruss_subgraph + cugraph.dask.community.louvain.louvain Spectral Clustering ------------------- diff --git a/docs/cugraph/source/api_docs/cores.rst b/docs/cugraph/source/api_docs/cores.rst index 344725914..2f0761597 100644 --- a/docs/cugraph/source/api_docs/cores.rst +++ b/docs/cugraph/source/api_docs/cores.rst @@ -18,4 +18,4 @@ K-Core .. autosummary:: :toctree: api/ - cugraph.centrality.katz_centrality.katz_centrality + cugraph.cores.k_core.k_core diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/link_analysis.rst index 809fd3647..162163afd 100644 --- a/docs/cugraph/source/api_docs/link_analysis.rst +++ b/docs/cugraph/source/api_docs/link_analysis.rst @@ -18,7 +18,7 @@ Pagerank .. autosummary:: :toctree: api/ - cugraph.centrality.katz_centrality.katz_centrality + cugraph.link_analysis.pagerank.pagerank Pagerank (MG) ------------- diff --git a/docs/cugraph/source/api_docs/link_prediction.rst b/docs/cugraph/source/api_docs/link_prediction.rst index 0ecfde58d..f1c713f68 100644 --- a/docs/cugraph/source/api_docs/link_prediction.rst +++ b/docs/cugraph/source/api_docs/link_prediction.rst @@ -24,11 +24,3 @@ Overlap Coefficient cugraph.link_prediction.overlap.overlap_coefficient cugraph.link_prediction.woverlap.overlap_w - -Pagerank (MG) -------------- -.. autosummary:: - :toctree: api/ - - cugraph.dask.link_analysis.pagerank.pagerank - diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index 9f43079b7..7b4e58aec 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -45,7 +45,6 @@ Checks Graph.lookup_internal_vertex_id Graph.to_directed Graph.to_undirected - Graph.unrenumber Symmetrize @@ -73,4 +72,12 @@ Conversion from Other Formats cugraph.structure.convert_matrix.to_numpy_array cugraph.structure.convert_matrix.to_numpy_matrix cugraph.structure.convert_matrix.to_pandas_adjacency - cugraph.structure.convert_matrix.to_pandas_edgelist \ No newline at end of file + cugraph.structure.convert_matrix.to_pandas_edgelist + +Other +----------------------------- +.. autosummary:: + :toctree: api/ + + Graph.unrenumber + cugraph.structure.hypergraph.hypergraph \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/traversal.rst index 2a6d6873f..3eb32e2cf 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/traversal.rst @@ -21,7 +21,6 @@ Breadth-first-search (MG) cugraph.dask.traversal.bfs.bfs cugraph.dask.traversal.bfs.call_bfs - Single-source-shortest-path --------------------------- .. autosummary:: diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index f0c0dc441..c4963bdde 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2018-2021, NVIDIA CORPORATION. +# Copyright (c) 2018-2022, NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by # sphinx-quickstart on Wed May 3 10:59:22 2017. @@ -73,7 +73,7 @@ # General information about the project. project = 'cugraph' -copyright = '2019-2021, NVIDIA' +copyright = '2019-2022, NVIDIA' author = 'NVIDIA' # The version info for the project you're documenting, acts as replacement for @@ -120,8 +120,9 @@ # otherwise, readthedocs.org uses their theme by default, # so no need to specify it import pydata_sphinx_theme + import sphinx_rtd_theme html_theme = 'pydata_sphinx_theme' - html_theme_path = pydata_sphinx_theme.get_html_theme_path() + html_theme_path = sphinx_rtd_theme.get_html_theme_path() # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False From 4219fe2ceda9d8e3cfe49dcf1fc3deda5c3c9d61 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 2 Feb 2022 20:27:05 +0000 Subject: [PATCH 168/384] REL v22.02.00 release From 5187df494aaa902b7fcedfd8fa966830d465d3e8 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Fri, 18 Feb 2022 18:40:37 -0800 Subject: [PATCH 169/384] API Doc Namespace Edits + SimpleGraphImpl methods (#2086) Increases consistency between the API docs and the namespace in which the method can be called from, reducing potential confusion. Ex: cugraph.centrality.betweenness_centrality.betweenness_centrality can now be found as cugraph.betweenness_centrality. Note: both are valid ways of calling the same method. Includes methods and attributes of a graph object once data is loaded (from SimpleGraphImpl), such as number_of_vertices, has_edge, get_two_hops_neighbors, etc. Ready for review. Authors: - https://github.com/betochimas Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2086 --- docs/cugraph/source/api_docs/centrality.rst | 6 +-- docs/cugraph/source/api_docs/community.rst | 28 +++++++------- docs/cugraph/source/api_docs/components.rst | 6 +-- docs/cugraph/source/api_docs/cores.rst | 4 +- .../source/api_docs/graph_implementation.rst | 38 +++++++++++++++++++ docs/cugraph/source/api_docs/index.rst | 1 + docs/cugraph/source/api_docs/layout.rst | 2 +- .../source/api_docs/linear_assignment.rst | 3 +- .../cugraph/source/api_docs/link_analysis.rst | 4 +- .../source/api_docs/link_prediction.rst | 21 +++++++--- docs/cugraph/source/api_docs/pylibcugraph.rst | 4 +- docs/cugraph/source/api_docs/sampling.rst | 2 +- docs/cugraph/source/api_docs/structure.rst | 34 +++++++++-------- docs/cugraph/source/api_docs/traversal.rst | 12 +++--- 14 files changed, 108 insertions(+), 57 deletions(-) create mode 100644 docs/cugraph/source/api_docs/graph_implementation.rst diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index 81c4577fa..4001328ee 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -10,15 +10,15 @@ Betweenness Centrality .. autosummary:: :toctree: api/ - cugraph.centrality.betweenness_centrality.betweenness_centrality - cugraph.centrality.betweenness_centrality.edge_betweenness_centrality + cugraph.betweenness_centrality + cugraph.edge_betweenness_centrality Katz Centrality --------------- .. autosummary:: :toctree: api/ - cugraph.centrality.katz_centrality.katz_centrality + cugraph.katz_centrality Katz Centrality (MG) -------------------- diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/community.rst index 98292e6fb..23db12c44 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/community.rst @@ -10,15 +10,15 @@ EgoNet .. autosummary:: :toctree: api/ - cugraph.community.egonet.batched_ego_graphs - cugraph.community.egonet.ego_graph + cugraph.batched_ego_graphs + cugraph.ego_graph Ensemble clustering for graphs (ECG) ------------------------------------ .. autosummary:: :toctree: api/ - cugraph.community.ecg.ecg + cugraph.ecg K-Truss @@ -26,15 +26,15 @@ K-Truss .. autosummary:: :toctree: api/ - cugraph.community.ktruss_subgraph.k_truss - cugraph.community.ktruss_subgraph.ktruss_subgraph + cugraph.k_truss + cugraph.ktruss_subgraph Leiden ------ .. autosummary:: :toctree: api/ - cugraph.community.leiden.leiden + cugraph.leiden Louvain @@ -42,7 +42,7 @@ Louvain .. autosummary:: :toctree: api/ - cugraph.community.louvain.louvain + cugraph.louvain Louvain (MG) @@ -58,11 +58,11 @@ Spectral Clustering .. autosummary:: :toctree: api/ - cugraph.community.spectral_clustering.analyzeClustering_edge_cut - cugraph.community.spectral_clustering.analyzeClustering_modularity - cugraph.community.spectral_clustering.analyzeClustering_ratio_cut - cugraph.community.spectral_clustering.spectralBalancedCutClustering - cugraph.community.spectral_clustering.spectralModularityMaximizationClustering + cugraph.analyzeClustering_edge_cut + cugraph.analyzeClustering_modularity + cugraph.analyzeClustering_ratio_cut + cugraph.spectralBalancedCutClustering + cugraph.spectralModularityMaximizationClustering Subgraph Extraction @@ -70,7 +70,7 @@ Subgraph Extraction .. autosummary:: :toctree: api/ - cugraph.community.subgraph_extraction.subgraph + cugraph.subgraph Triangle Counting @@ -78,4 +78,4 @@ Triangle Counting .. autosummary:: :toctree: api/ - cugraph.community.triangle_count.triangles + cugraph.triangles diff --git a/docs/cugraph/source/api_docs/components.rst b/docs/cugraph/source/api_docs/components.rst index 0f7d3a9c2..cf2f09efa 100644 --- a/docs/cugraph/source/api_docs/components.rst +++ b/docs/cugraph/source/api_docs/components.rst @@ -10,9 +10,9 @@ Connected Components .. autosummary:: :toctree: api/ - cugraph.components.connectivity.connected_components - cugraph.components.connectivity.strongly_connected_components - cugraph.components.connectivity.weakly_connected_components + cugraph.connected_components + cugraph.strongly_connected_components + cugraph.weakly_connected_components Connected Components (MG) diff --git a/docs/cugraph/source/api_docs/cores.rst b/docs/cugraph/source/api_docs/cores.rst index 2f0761597..0e48c584b 100644 --- a/docs/cugraph/source/api_docs/cores.rst +++ b/docs/cugraph/source/api_docs/cores.rst @@ -10,7 +10,7 @@ Core Number .. autosummary:: :toctree: api/ - cugraph.cores.core_number.core_number + cugraph.core_number K-Core @@ -18,4 +18,4 @@ K-Core .. autosummary:: :toctree: api/ - cugraph.cores.k_core.k_core + cugraph.k_core diff --git a/docs/cugraph/source/api_docs/graph_implementation.rst b/docs/cugraph/source/api_docs/graph_implementation.rst new file mode 100644 index 000000000..e96c49c91 --- /dev/null +++ b/docs/cugraph/source/api_docs/graph_implementation.rst @@ -0,0 +1,38 @@ +==================== +Graph Implementation +==================== +.. currentmodule:: cugraph.structure.graph_implementation.simpleGraphImpl + + +Graph Implementation +------------------------- +.. autosummary:: + :toctree: api/ + + view_edge_list + delete_edge_list + view_adj_list + view_transposed_adj_list + delete_adj_list + + enable_batch + batch_adjlists + batch_edgelists + batch_enabled + batch_transposed_adjlists + + get_two_hop_neighbors + number_of_vertices + number_of_nodes + number_of_edges + in_degree + out_degree + degree + degrees + has_edge + has_node + has_self_loop + edges + nodes + neighbors + vertex_column_size \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 9da23c396..e7f94d7e1 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -10,6 +10,7 @@ This page provides a list of all publicly accessible modules, methods and classe :caption: API Documentation structure + graph_implementation centrality community components diff --git a/docs/cugraph/source/api_docs/layout.rst b/docs/cugraph/source/api_docs/layout.rst index fc81df722..b3943e4d3 100644 --- a/docs/cugraph/source/api_docs/layout.rst +++ b/docs/cugraph/source/api_docs/layout.rst @@ -10,5 +10,5 @@ Force Atlas 2 .. autosummary:: :toctree: api/ - cugraph.layout.force_atlas2.force_atlas2 + cugraph.force_atlas2 diff --git a/docs/cugraph/source/api_docs/linear_assignment.rst b/docs/cugraph/source/api_docs/linear_assignment.rst index 147597879..383bb4d43 100644 --- a/docs/cugraph/source/api_docs/linear_assignment.rst +++ b/docs/cugraph/source/api_docs/linear_assignment.rst @@ -10,4 +10,5 @@ Hungarian .. autosummary:: :toctree: api/ - cugraph.linear_assignment.hungarian + cugraph.hungarian + cugraph.dense_hungarian diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/link_analysis.rst index 162163afd..c19a36aed 100644 --- a/docs/cugraph/source/api_docs/link_analysis.rst +++ b/docs/cugraph/source/api_docs/link_analysis.rst @@ -10,7 +10,7 @@ HITS .. autosummary:: :toctree: api/ - cugraph.link_analysis.hits.hits + cugraph.hits Pagerank @@ -18,7 +18,7 @@ Pagerank .. autosummary:: :toctree: api/ - cugraph.link_analysis.pagerank.pagerank + cugraph.pagerank Pagerank (MG) ------------- diff --git a/docs/cugraph/source/api_docs/link_prediction.rst b/docs/cugraph/source/api_docs/link_prediction.rst index f1c713f68..7c7b34f2f 100644 --- a/docs/cugraph/source/api_docs/link_prediction.rst +++ b/docs/cugraph/source/api_docs/link_prediction.rst @@ -10,9 +10,9 @@ Jaccard Coefficient .. autosummary:: :toctree: api/ - cugraph.link_prediction.jaccard.jaccard - cugraph.link_prediction.jaccard.jaccard_coefficient - cugraph.link_prediction.wjaccard.jaccard_w + cugraph.jaccard + cugraph.jaccard_coefficient + cugraph.jaccard_w Overlap Coefficient @@ -20,7 +20,16 @@ Overlap Coefficient .. autosummary:: :toctree: api/ - cugraph.link_prediction.overlap.overlap - cugraph.link_prediction.overlap.overlap_coefficient - cugraph.link_prediction.woverlap.overlap_w + cugraph.overlap + cugraph.overlap_coefficient + cugraph.overlap_w + +Sorensen Coefficient +-------------------- +.. autosummary:: + :toctree: api/ + + cugraph.sorensen + cugraph.sorensen_coefficient + cugraph.sorensen_w diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/pylibcugraph.rst index ffc2e84e3..9317274cf 100644 --- a/docs/cugraph/source/api_docs/pylibcugraph.rst +++ b/docs/cugraph/source/api_docs/pylibcugraph.rst @@ -11,5 +11,5 @@ Methods .. autosummary:: :toctree: api/ - pylibcugraph.components.strongly_connected_components - pylibcugraph.components.weakly_connected_components + pylibcugraph.strongly_connected_components + pylibcugraph.weakly_connected_components diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/sampling.rst index de7f707fb..6255c981a 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/sampling.rst @@ -10,4 +10,4 @@ Random Walks .. autosummary:: :toctree: api/ - cugraph.sampling.random_walks.random_walks + cugraph.random_walks diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index 7b4e58aec..f2d497814 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -29,6 +29,7 @@ Adding Data Graph.add_internal_vertex_id Graph.add_nodes_from Graph.clear + Graph.unrenumber Checks ------ @@ -52,9 +53,9 @@ Symmetrize .. autosummary:: :toctree: api/ - cugraph.structure.symmetrize.symmetrize - cugraph.structure.symmetrize.symmetrize_ddf - cugraph.structure.symmetrize.symmetrize_df + cugraph.symmetrize + cugraph.symmetrize_ddf + cugraph.symmetrize_df Conversion from Other Formats @@ -62,22 +63,23 @@ Conversion from Other Formats .. autosummary:: :toctree: api/ - cugraph.structure.convert_matrix.from_adjlist - cugraph.structure.convert_matrix.from_cudf_edgelist - cugraph.structure.convert_matrix.from_edgelist - cugraph.structure.convert_matrix.from_numpy_array - cugraph.structure.convert_matrix.from_numpy_matrix - cugraph.structure.convert_matrix.from_pandas_adjacency - cugraph.structure.convert_matrix.from_pandas_edgelist - cugraph.structure.convert_matrix.to_numpy_array - cugraph.structure.convert_matrix.to_numpy_matrix - cugraph.structure.convert_matrix.to_pandas_adjacency - cugraph.structure.convert_matrix.to_pandas_edgelist + cugraph.from_adjlist + cugraph.from_cudf_edgelist + cugraph.from_edgelist + cugraph.from_numpy_array + cugraph.from_numpy_matrix + cugraph.from_pandas_adjacency + cugraph.from_pandas_edgelist + cugraph.to_numpy_array + cugraph.to_numpy_matrix + cugraph.to_pandas_adjacency + cugraph.to_pandas_edgelist Other ----------------------------- .. autosummary:: :toctree: api/ - Graph.unrenumber - cugraph.structure.hypergraph.hypergraph \ No newline at end of file + cugraph.hypergraph + cugraph.structure.shuffle + cugraph.structure.NumberMap diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/traversal.rst index 3eb32e2cf..d1736799e 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/traversal.rst @@ -10,8 +10,8 @@ Breadth-first-search .. autosummary:: :toctree: api/ - cugraph.traversal.bfs.bfs - cugraph.traversal.bfs.bfs_edges + cugraph.bfs + cugraph.bfs_edges Breadth-first-search (MG) ------------------------- @@ -26,10 +26,10 @@ Single-source-shortest-path .. autosummary:: :toctree: api/ - cugraph.traversal.sssp.filter_unreachable - cugraph.traversal.sssp.shortest_path - cugraph.traversal.sssp.shortest_path_length - cugraph.traversal.sssp.sssp + cugraph.filter_unreachable + cugraph.shortest_path + cugraph.shortest_path_length + cugraph.sssp Single-source-shortest-path (MG) -------------------------------- From 146e1e7e05ed847d0687d0f9f9a26e0299be3dc3 Mon Sep 17 00:00:00 2001 From: "Corey J. Nolet" Date: Thu, 24 Feb 2022 16:36:34 -0500 Subject: [PATCH 170/384] Automatically clone raft when the raft pinned tag changes (#2087) Now that RAFT has official conda packages, it'll be much easier to work locally on cugraph features that rely on the RAFT nightly. Working on features that span raft and cugraph should be fairly straightforward to do locally as well, because CPM provides the `CPM_raft_SOURCE` variable that can passed into the `cmake` call to tell the build to use a local working copy of RAFT. The raft conda packages are now ready to add to the CI conda dependencies and once added, the updating the raft pinned tag in `get_raft.cmake` will no longer work. The option added in this PR will force clone a local version of the pinned tag (both locally in CI) and set the `CPM_raft_SOURCE` to that path. Authors: - Corey J. Nolet (https://github.com/cjnolet) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2087 --- .gitignore | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.gitignore b/.gitignore index fa7580040..485b71cac 100644 --- a/.gitignore +++ b/.gitignore @@ -79,11 +79,6 @@ datasets/* ## Doxygen cpp/doxygen/html -# Raft symlink -python/cugraph/cugraph/raft -python/pylibcugraph/pylibcugraph/raft -python/_external_repositories/ - # created by Dask tests python/dask-worker-space python/cugraph/dask-worker-space From 4efbd9927527987a56f0be28f658409e580e7a74 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 9 Mar 2022 13:38:52 -0500 Subject: [PATCH 171/384] updated release performance notebook to also measure using Nx as imput (#2083) Update the release notebook to produce speedup metrics of using a NetworkX object as the input Graph. Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2083 --- notebooks/cugraph_benchmarks/release.ipynb | 342 ++++++++++++++++++--- 1 file changed, 294 insertions(+), 48 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index 7d1c82468..e9d887a04 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -5,7 +5,7 @@ "metadata": {}, "source": [ "# Skip notebook test\n", - "(this notebook is not executed as part of the RAPIDS cuGraph CI process. Execution could take a few hours)\n", + "(this notebook is not executed as part of the RAPIDS cuGraph CI process. Execution will take a few hours)\n", "\n", "---\n", "\n", @@ -52,7 +52,6 @@ "| ------------------------|---------------|------ | ------- |-------------\n", "| Katz | Centrality | X | | \n", "| Betweenness Centrality | Centrality | X | | Estimated, k = 100\n", - "| Betweenness Centrality | Centrality | X | | Estimated, k = 0.1% \n", "| Louvain | Community | X | | Uses python-louvain for comparison\n", "| Triangle Counting | Community | X | |\n", "| WCC | Components | | X | Nx requires directed and returns a generator \n", @@ -76,7 +75,7 @@ "\n", "\n", "### Notes\n", - "* Running Betweenness Centrality on the full graph is prohibited using NetworkX\n" + "* Running Betweenness Centrality on the full graph is prohibited using NetworkX. Anything over k=100 can explode runtime to days\n" ] }, { @@ -86,10 +85,11 @@ "Notebook Credits\n", "\n", " \n", - "| Author | Date | Update | cuGraph Version | Test Hardware |\n", - "| --------------|------------|------------------|-----------------|------------------------|\n", - "| Brad Rees | 10/06/2020 | created | 0.16 | GV100, CUDA 10.2 |\n", - "| Brad Rees | 01/20/2022 | updated | 22.02 | Quadro A6000 CUDA 11.5 |\n", + "| Author | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|---------------------|-----------------|------------------------|\n", + "| Brad Rees | 10/06/2020 | created | 0.16 | GV100, CUDA 10.2 |\n", + "| Brad Rees | 01/20/2022 | updated | 22.02 | Quadro A6000 CUDA 11.5 |\n", + "| Brad Rees | 01/20/2022 | added perf w/Nx obj | 22.02 | Quadro A6000 CUDA 11.5 |\n", "\n", "\n", "\n" @@ -104,7 +104,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -128,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -148,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -164,7 +164,8 @@ "\n", "# for quick testing\n", "data_quick = {\n", - " 'karate' : './data/karate.mtx',\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx', \n", + " #'karate' : './data/karate.mtx',\n", "}\n", "\n", "\n", @@ -174,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -192,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -220,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -278,6 +279,13 @@ " _G = create_cu_ugraph(_df)\n", " _ = cugraph.katz_centrality(_G, alpha)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_katz_nx(_df, alpha):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = cugraph.katz_centrality(_G, alpha)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -290,11 +298,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def nx_bc(_df, _k):\n", + " print(f\" k = {_k}\", end=' ')\n", " t1 = time.time()\n", " _G = create_nx_ugraph(_df)\n", " _ = nx.betweenness_centrality(_G, k=_k)\n", @@ -306,6 +315,13 @@ " _G = create_cu_ugraph(_df)\n", " _ = cugraph.betweenness_centrality(_G, k=_k)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_bc_nx(_df, _k):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = cugraph.betweenness_centrality(_G, k=_k)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -318,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -338,6 +354,13 @@ " _G = create_cu_ugraph(_df)\n", " _,_ = cugraph.louvain(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_louvain_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _,_ = cugraph.louvain(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -350,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -372,6 +395,13 @@ " _G = create_cu_ugraph(_df)\n", " _ = cugraph.triangles(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_tc_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = cugraph.triangles(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -384,7 +414,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -406,6 +436,13 @@ " _G = create_cu_digraph(_df) \n", " _ = cugraph.weakly_connected_components(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_wcc_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_digraph(_df) \n", + " _ = cugraph.weakly_connected_components(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -418,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -439,6 +476,13 @@ " _G = create_cu_ugraph(_df) \n", " _ = cugraph.core_number(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_core_num_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df) \n", + " _ = cugraph.core_number(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -451,7 +495,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -467,6 +511,13 @@ " _G = create_cu_digraph(_df)\n", " _ = cugraph.pagerank(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_pagerank_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_digraph(_df)\n", + " _ = cugraph.pagerank(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -479,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -495,6 +546,13 @@ " _G = create_cu_ugraph(_df)\n", " _ = cugraph.jaccard_coefficient(_G)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_jaccard_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = cugraph.jaccard_coefficient(_G)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -507,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -523,6 +581,13 @@ " _G = create_cu_ugraph(_df)\n", " _ = cugraph.bfs(_G, 1)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_bfs_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df)\n", + " _ = cugraph.bfs(_G, 1)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -535,7 +600,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -551,6 +616,13 @@ " _G = create_cu_ugraph(_df) \n", " _ = cugraph.sssp(_G, 1)\n", " t2 = time.time() - t1\n", + " return t2\n", + "\n", + "def cu_sssp_nx(_df):\n", + " t1 = time.time()\n", + " _G = create_nx_ugraph(_df) \n", + " _ = cugraph.sssp(_G, 1)\n", + " t2 = time.time() - t1\n", " return t2" ] }, @@ -572,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -582,9 +654,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tGDF Size 999970\n", + "\tcugraph Size 499985\n", + "\tcugraph Order 100000\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# do a simple pass just to get all the libraries initiallized\n", "# This cell might not be needed\n", @@ -624,26 +717,85 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tdata in gdf 999970 and data in pandas 999970\n", + "\tKatz n.c.cx.\n", + "\tBC k=100 n. k = 100 c.cx. \n", + "\tLouvain n.c.cx. \n", + "\tTC n.c.cx. \n", + "\tWCC n.c.cx. \n", + "\tCore Number n.c.cx. \n", + "\tPageRank n.c.cx. \n", + "\tJaccard n.c.cx. \n", + "\tBFS n.c.cx. \n", + "\tSSSP n.c.cx. \n", + "Reading ./data/dblp-2010.mtx...\n", + "\tdata in gdf 1615400 and data in pandas 1615400\n", + "\tKatz n.c.cx.\n", + "\tBC k=100 n. k = 100 c.cx. \n", + "\tLouvain n.c.cx. \n", + "\tTC n.c.cx. \n", + "\tWCC n.c.cx. \n", + "\tCore Number n.c.cx. \n", + "\tPageRank n.c.cx. \n", + "\tJaccard n.c.cx. \n", + "\tBFS n.c.cx. \n", + "\tSSSP n.c.cx. \n", + "Reading ./data/coPapersCiteseer.mtx...\n", + "\tdata in gdf 32073440 and data in pandas 32073440\n", + "\tKatz n.c.cx.\n", + "\tBC k=100 n. k = 100 c.cx. \n", + "\tLouvain n.c.cx. \n", + "\tTC n.c.cx. \n", + "\tWCC n.c.cx. \n", + "\tCore Number n.c.cx. \n", + "\tPageRank n.c.cx. \n", + "\tJaccard n.c.cx. \n", + "\tBFS n.c.cx. \n", + "\tSSSP n.c.cx. \n", + "Reading ./data/as-Skitter.mtx...\n", + "\tdata in gdf 22190596 and data in pandas 22190596\n", + "\tKatz n.c.cx.\n", + "\tBC k=100 n. k = 100 c.cx. \n", + "\tLouvain n.c.cx. \n", + "\tTC n.c.cx. \n", + "\tWCC n.c.cx. \n", + "\tCore Number n.c.cx. \n", + "\tPageRank n.c.cx. \n", + "\tJaccard n.c.cx. \n", + "\tBFS n.c.cx. \n", + "\tSSSP n.c.cx. \n" + ] + } + ], "source": [ "# arrays to capture performance gains\n", "names = []\n", "algos = []\n", "\n", - "# Two dimension data\n", - "time_algo_cu = [] # will be two dimensional\n", - "time_algo_nx = [] # will be two dimensional\n", + "# Two dimension data [file, perf]\n", + "time_algo_nx = [] # NetworkX\n", + "time_algo_cu = [] # cuGraph\n", + "time_algo_cx = [] # cuGraph\n", "perf = []\n", + "perf_cu_nx = []\n", "\n", "algos.append(\" \")\n", "\n", "i = 0\n", "for k,v in data.items():\n", - " time_algo_cu.append([])\n", " time_algo_nx.append([])\n", + " time_algo_cu.append([])\n", + " time_algo_cx.append([])\n", " perf.append([])\n", + " perf_cu_nx.append([])\n", " \n", " # Saved the file Name\n", " names.append(k)\n", @@ -667,7 +819,7 @@ " \n", " #----- Algorithm order is same as defined at top ----\n", " \n", - " # Katz \n", + " #-- Katz \n", " print(\"\\tKatz \", end = '')\n", " if i == 0: \n", " algos.append(\"Katz\")\n", @@ -676,32 +828,44 @@ " tx = nx_katz(pdf, alpha)\n", " print(\"c.\", end='')\n", " tc = cu_katz(gdf, alpha)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_katz_nx(pdf, alpha)\n", " print(\"\")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", " \n", - " # BC\n", + " #-- BC\n", " print(\"\\tBC k=100 \", end='')\n", " if i == 0:\n", " algos.append(\"BC Estimate fixed\")\n", "\n", + " k = 100\n", + " if k > num_nodes:\n", + " k = num_nodes\n", + " \n", " print(\"n.\", end='')\n", - " tx = nx_bc(pdf, 100)\n", + " tx = nx_bc(pdf, k)\n", " print(\"c.\", end='')\n", - " tc = cu_bc(gdf, 100)\n", + " tc = cu_bc(gdf, k)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_bc_nx(pdf, k)\n", " print(\" \")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", "\n", - " # Louvain\n", + " #-- Louvain\n", " print(\"\\tLouvain \", end='')\n", " if i == 0:\n", " algos.append(\"Louvain\")\n", @@ -710,14 +874,18 @@ " tx = nx_louvain(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_louvain(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_louvain_nx(pdf)\n", " print(\" \")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", - " # TC\n", + " #-- TC\n", " print(\"\\tTC \", end='')\n", " if i == 0:\n", " algos.append(\"TC\")\n", @@ -726,15 +894,19 @@ " tx = nx_tc(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_tc(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_tc_nx(pdf)\n", " print(\" \")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", "\n", "\n", - " # WCC\n", + " #-- WCC\n", " print(\"\\tWCC \", end='')\n", " if i == 0:\n", " algos.append(\"WCC\")\n", @@ -743,14 +915,18 @@ " tx = nx_wcc(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_wcc(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_wcc_nx(pdf)\n", " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", - " # Core Number\n", + " #-- Core Number\n", " print(\"\\tCore Number \", end='')\n", " if i == 0:\n", " algos.append(\"Core Number\")\n", @@ -759,15 +935,19 @@ " tx = nx_core_num(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_core_num(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_core_num_nx(pdf)\n", " print(\" \")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", - " gc.collect() \n", + " perf_cu_nx[i].append(tx/tcx)\n", + " gc.collect()\n", "\n", " \n", - " # PageRank\n", + " #-- PageRank\n", " print(\"\\tPageRank \", end='')\n", " if i == 0:\n", " algos.append(\"PageRank\")\n", @@ -776,15 +956,19 @@ " tx = nx_pagerank(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_pagerank(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_pagerank_nx(pdf)\n", " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", " \n", - " # Jaccard\n", + " #-- Jaccard\n", " print(\"\\tJaccard \", end='')\n", " if i == 0:\n", " algos.append(\"Jaccard\")\n", @@ -793,15 +977,19 @@ " tx = nx_jaccard(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_jaccard(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_jaccard_nx(pdf)\n", " print(\" \")\n", " \n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", "\n", - " # BFS\n", + " #-- BFS\n", " print(\"\\tBFS \", end='')\n", " if i == 0:\n", " algos.append(\"BFS\")\n", @@ -810,15 +998,19 @@ " tx = nx_bfs(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_bfs(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_bfs_nx(pdf)\n", " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", " \n", " \n", - " # SSSP\n", + " #-- SSSP\n", " print(\"\\tSSSP \", end='')\n", " if i == 0:\n", " algos.append(\"SSP\")\n", @@ -827,11 +1019,15 @@ " tx = nx_sssp(pdf)\n", " print(\"c.\", end='')\n", " tc = cu_sssp(gdf)\n", + " print(\"cx.\", end='')\n", + " tcx = cu_sssp(gdf)\n", " print(\" \")\n", "\n", " time_algo_nx[i].append(tx)\n", " time_algo_cu[i].append(tc)\n", + " time_algo_cx[i].append(tcx)\n", " perf[i].append(tx/tc)\n", + " perf_cu_nx[i].append(tx/tcx)\n", " gc.collect()\n", "\n", " # increament count\n", @@ -841,9 +1037,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", + "preferentialAttachment\n", + "[531.5083672005737, 713.2091362850375, 5404.871910284401, 378.8714209575697, 70.72927362986779, 76.7855488460584, 369.8407050216162, 100.5242813104882, 4.378275208783683, 162.25090274331285]\n", + "dblp\n", + "[263.7293255857766, 1558.1884974132756, 622.282663375948, 142.59215746942343, 88.19197528607465, 116.20873484788576, 460.3603070425029, 121.2753931555862, 38.357311342936576, 186.59598139534884]\n", + "coPapersCiteseer\n", + "[2270.9739290077137, 2436.608230097977, 1057.486186959562, 2300.0750485569533, 233.7511393615408, 246.97401172398136, 853.279646090366, 112.73241487709193, 233.03646005823012, 267.6295226503849]\n", + "as-Skitter\n", + "[1037.8761480097223, 7091.970778835749, 1475.2901788933452, 3950.5098941991014, 228.11245124984197, 245.35607830599636, 547.8739313855568, 98.81747467270701, 222.20389619850272, 326.73959437931654]\n" + ] + } + ], "source": [ "#Print results\n", "print(algos)\n", @@ -853,6 +1065,40 @@ " print(f\"{perf[i]}\")" ] }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "------------\n", + "\n", + "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", + "preferentialAttachment\n", + "[4.003601795825807, 93.08063351361315, 204.47865340368915, 2.7097492953036797, 0.8666907616338123, 1.2867491927399868, 1.9752328393020735, 0.1240993236960286, 0.7203119096547798, 179.41122927863145]\n", + "dblp\n", + "[4.885862057048338, 122.87364779256156, 31.02199520144101, 2.180625966164683, 1.4324289723528034, 1.3579940932619847, 2.348198022642711, 0.11145559203860335, 0.7265996313793216, 202.49957600312277]\n", + "coPapersCiteseer\n", + "[8.158465907417547, 49.369787236543914, 9.28701234947398, 12.067711445592089, 0.8232363804394461, 1.3752921888176353, 2.8151237928186994, 0.08727548257474192, 0.798480184263566, 322.0841686740297]\n", + "as-Skitter\n", + "[3.66123817526995, 631.2091494372795, 20.617572936160165, 34.49437773532841, 0.9264442180418646, 4.828647431829589, 2.2476285215684615, 0.12267649645919085, 0.8469181921567667, 431.6171964493335]\n" + ] + } + ], + "source": [ + "#Print results\n", + "print(\"\\n------------\\n\")\n", + "print(algos)\n", + "\n", + "for i in range(num_datasets):\n", + " print(f\"{names[i]}\")\n", + " print(f\"{perf_cu_nx[i]}\")" + ] + }, { "cell_type": "markdown", "metadata": {}, From 414a3c98534a9c214ccf49b32f171b77bf262459 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 17 Mar 2022 12:36:27 -0400 Subject: [PATCH 172/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 6595593a4..f060f10f6 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.04' +version = '22.06' # The full version, including alpha/beta/rc tags. -release = '22.04.00' +release = '22.06.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From afbc588d3602a620e763c2045f71f6a2b3861acd Mon Sep 17 00:00:00 2001 From: Mike McCarty Date: Tue, 29 Mar 2022 09:20:51 -0400 Subject: [PATCH 173/384] Updated random_walk_benchmark notebook for API change in cudf (#2164) Updated random_walk_benchmark notebook for API change in cudf; to_array -> to_numpy Authors: - Mike McCarty (https://github.com/mmccarty) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2164 --- .../random_walk_benchmark.ipynb | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb index 65cf9fb59..95b4e87dd 100644 --- a/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/random_walk_benchmark.ipynb @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -183,7 +183,7 @@ " G = read_and_create(v)\n", " \n", " num_nodes = G.number_of_nodes()\n", - " nodes = G.nodes().to_array().tolist()\n", + " nodes = G.nodes().to_numpy().tolist()\n", "\n", " seeds = random.sample(nodes, num_seeds)\n", "\n", @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -209,7 +209,7 @@ "list" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -220,12 +220,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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stnl1NXV0a9fP5YuXZq2TmFhw5PML730UiZPnsz8+fMZN24cCxcuZPjw4Tz33HNt2MJAXV0dixcvplevxq/MSbcOd+eyyy7jvPPOa1T31ltvZcaMGVx77bVNll9QUKDrzES6IIUzkW6stRGubDnmmGM4+eSTueiii9h999357LPPOPzww3nkkUc4++yzefDBBznyyCObbV9eXs6uu+5K7969WblyJS+++GKirK6ujscff5xp06bx0EMPceSRR7LLLrswePBgHnvsMU4//XTcnWXLljFy5Mgmy37nnXcYMWIEI0aMYPHixaxcuZKvf/3rXHvttfzhD39g8uTJAPzpT39iwIABjdr26dOHTZs2JaYnTpzIbbfdxo9//GMAli5dSklJSdp1HHfccVxxxRVMnz6doqIiPvzwQ/Lz8znmmGOYOnUqF110EXvuuSefffYZFRUV7L///jt0DEQkunRDgIjsdMOHD+c//uM/OOqooxg5ciQ//OEPmTVrFvfddx/FxcX85je/4Re/+EWz7SdNmkRNTQ3FxcVcccUVjBs3LlFWWFjIG2+8wZgxY/jLX/7ClVdeCcCDDz7IPffcw8iRIxk+fDi/+93v0i77lltu4ZBDDmHkyJH06tWL448/nl69evHUU09x6623MmTIEIYNG8bs2bMTpxfrnXjiiTz55JOJGwJmzZpFWVkZxcXFDBs2jDvvvLPZdUycOJGvf/3rHHbYYYwYMYLTTjuNiooKhg0bxs9+9jMmTpxIcXExxx57LOvWrdvRQyAiEWbB9WhdQ2lpqZeVleW6GyKRtmLFCoYOHZrrbmRNUVERmzdvznU3urWu/jMm0lHMbIm7l6bO18iZiIiISIQonIlIl6JRMxHp7BTORERERCJE4UxEREQkQhTORERERCJE4UxEREQkQhTORKRT+fnPf87w4cMpLi6mpKSEv//97wAMGjSIDRs2NKl/+OGHA7B69WoeeuihxPylS5cyf/78ndNpEZE2UDgTkU5j8eLFPPXUU7zyyissW7aMhQsXsu+++7bY5oUXXgA6JpzV1NS0vdMiIm2kcCYiOfHVr36VMWPGMHz4cO666y5qa2uZOXMmhxxyCCNGjODmm29u0mbdunXsscce9OzZE4A99tiDffbZp1Gdbdu2MWnSJH71q18BwUNpIXif5aJFiygpKeH666/nyiuvZM6cOZSU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onAmIiIiEiEKZyIiIiIRonAmIiIiEiEKZyIiIiIRonAmIiIiEiEKZyIiIiIRonAmIiIiEiEKZyIiIiIRonAmIiIiEiEKZyIiIiIRonAmIiIiEiEKZyIiIiIRktVwZmaTzOxNM1tlZpemKTczmxWWLzOz0Ull95rZJ2b2ejb7KCIiIhIlWQtnZhYHbgeOB4YBZ5rZsJRqxwNDwq9zgTuSymYDk7LVPxEREZEoyubI2aHAKnd/192rgEeAqSl1pgL3e+BFoJ+Z7Q3g7n8FPsti/0REREQiJ5vhbACwJml6bTivrXVEREREuo1shjNLM8/bUafllZida2ZlZla2fv36tjQVERERiZxshrO1wL5J0wOBj9pRp0Xufpe7l7p7af/+/dvVUREREZGoyGY4exkYYmaDzawHMA2Yl1JnHnBOeNfmOKDc3ddlsU8iIiIikZa1cObuNcAFwNPACuBRd3/DzM43s/PDavOBd4FVwK+A79a3N7OHgcXAQWa21sz+LVt9FREREYkKc2/TJV6RVlpa6mVlZbnuhoiIiEirzGyJu5emztcbAkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJEIUzkREREQiROFMREREJELyct2BTuWR6bDhrZSZljJpWS5P7VQ217+zt62t5anVs73+GMTiwffkr8S8pLJYrPG8LtcuHuyvtO3qy1o5XiIikpbCWVvsdgDE8xum3VMqpEy3uTy1ekcvv6XybC47k/LU6mnaJ8/b6f1z8LqGr7r6z7XhdPjdPc28pLLUeXW1TdfdVVisfaEuEuEzte/tDZrtbNdp1peLdbZ3fe1cXaYy/s+4Df+9t/Z7MqvLbMNys7HMNi03C8uM58OEyzNfbgdTOGuLif+Z6x5IV+TevlCXHBbTtmspRHahdnW14FUdtL5mjkN7j2v7GraznUgutSH9timYZ1i3o5eZ30vhTKRbS5wC1CWgkgPtDpE70rad7XKxvs4QJNq6TF1yEHkKZyIi3dmO/KHWH3mRrFA4a4O5S9byr61V5MWMeMyIx2KJz3nx8Hvq/EblTefHE9OxhvnxpHaxGDED0y9BERGRbkHhrA1+tehdVv6zIifrbhr2Ys2EvLaFw+T6sdT58RaWFzPi8XTzY8RjtLEPsZRAmtoXBVQREek+FM7a4MnvHkF1XR21tU5NnVNb59TU1VEbfg6mk7/XUVPbzPz66dr085ttU9vCshqVN56/vbqOmrraNvUhuS9R0FpAbRwQgzAYs7YF1NSQGE8Km0Z45Yo7TsPlL44H15GH/Qw+BzMa5jXUSW1Hcp3k9onPyZfaeMP9A83USV63hzO9Ub2GeaQuxxv3q2G5qevylO1tWG7yPkgsJ81ySbuu1H3bsL9Tl5PaLt26G+3/hs1oZl2Nl0vKcuv/cVB/iaBh4fegzABSphvVS56X0p5G9Zu2b1hu8vIaPtOkTfJ0cj+btk/f59Rtan4ZNFMWS95fqXUyWXaT/dJ0Gc0tv2HdabYpk2Wn7JfmtPbPxZb+Pdnqk4FaWPqOnYluuXFLpdns846st6XW7V1vPGYcM3Sv1lacNQpnbdCrR5xexHPdjZ3OvWlYrKtrGlCbhr26NgXW2jrShsOgfpr59ctvsryGwJzcpjIRUBv6kHZ5TUJwHenyaeKXPGn+mEKTP6jJbRJ/WBrVa1rHktaV/EeQpOVaw+oaLSO1TmpfSWlnye1S/ug31Eu/PaTWSdcOa7zOGBixtH1t2Mep/Wo6r6X9krw9TfZzi8ej8fY1Cs3eNNw1CqwpAbL+c11YmFq/SWhupr0T3jxKXbPLoNF0wzLq0i27SZ+b/gOhUQhOV0ZDeE/Xpzpvbn8lhedm+rQj9ymI7KiC/Bgr//P4nK1f4UxaZRaMOuV1v1yakG4ERUSyr/Goc9OAB00DX13YpqXg1zhop6nXSjhstZzmK7TetqX1tty45bYtr7el1jvW59ba7sB6Wyhvabmttc31r3mFM5EMKJCJ5Eb9qchwKpddEdlp9GAlERERkQhROBMRERGJEIUzERERkQjJajgzs0lm9qaZrTKzS9OUm5nNCsuXmdnoTNuKiIiIdEVZC2dmFgduB44HhgFnmtmwlGrHA0PCr3OBO9rQVkRERKTLyebI2aHAKnd/192rgEeAqSl1pgL3e+BFoJ+Z7Z1hWxEREZEuJ5vhbACwJml6bTgvkzqZtBURERHpcrIZztI9kCb1kW/N1cmkbbAAs3PNrMzMytavX9/GLoqIiIhESzbD2Vpg36TpgcBHGdbJpC0A7n6Xu5e6e2n//v13uNMiIiIiuZTNcPYyMMTMBptZD2AaMC+lzjzgnPCuzXFAubuvy7CtiIiISJeTtdc3uXuNmV0APA3EgXvd/Q0zOz8svxOYD5wArAK2At9oqW1r61yyZMkGM3s/KxvUYA9gQ5bXEVXdeduhe29/d9526N7br23vvrrz9u+sbd8/3Uxr7SWq0piZlbl7aa77kQvdeduhe29/d9526N7br23vntsO3Xv7c73tekOAiIiISIQonImIiIhEiMJZ292V6w7kUHfeduje29+dtx269/Zr27uv7rz9Od12XXMmIiIiEiEaORMRERGJEIWzNMxsXzN7xsxWmNkbZvbvaeqYmc0ys1VmtszMRueirx0tw20fb2blZrY0/LoyF33taGZWYGYvmdlr4bb/NE2dLnncIePt75LHvp6Zxc3sVTN7Kk1Zlz320Oq2d/XjvtrM/hFuW1ma8q5+7Fvb/i57/M2sn5k9bmYrw797h6WU5+TYZ+05Z51cDfAjd3/FzPoAS8zsz+6+PKnO8cCQ8OuLwB3h984uk20HWOTuU3LQv2zaDhzt7pvNLB943sz+6O4vJtXpqscdMtt+6JrHvt6/AyuAXdKUdeVjDy1vO3Tt4w4wwd2be65VVz/20PL2Q9c9/r8A/uTup4UPve+dUp6TY6+RszTcfZ27vxJ+riD4hZX64vWpwP0eeBHoZ2Z77+SudrgMt71LCo/l5nAyP/xKvSizSx53yHj7uywzGwhMBu5upkqXPfYZbHt312WPfXdmZrsAXwbuAXD3KnffmFItJ8de4awVZjYIGAX8PaVoALAmaXotXSzEtLDtAIeFp7/+aGbDd27Psic8tbMU+AT4s7t3q+OewfZDFz32wC3AJUBdM+Vd+djfQsvbDl33uEPwj5AFZrbEzM5NU96Vjz20vv3QNY//AcB64L7wlP7dZlaYUicnx17hrAVmVgTMBX7g7ptSi9M06TKjDK1s+yvA/u4+ErgV+O1O7l7WuHutu5cAA4FDzeyQlCpd+rhnsP1d8tib2RTgE3df0lK1NPM6/bHPcNu75HFPcoS7jyY4hfU9M/tySnmXPPZJWtv+rnr884DRwB3uPgrYAlyaUicnx17hrBnhNTdzgQfd/Yk0VdYC+yZNDwQ+2hl9y7bWtt3dN9Wf/nL3+UC+me2xk7uZVeHQ9rPApJSiLnvckzW3/V342B8BnGRmq4FHgKPN7IGUOl312Le67V34uAPg7h+F3z8BngQOTanSVY890Pr2d+HjvxZYm3SG4HGCsJZaZ6cfe4WzNMzMCM5Br3D3m5qpNg84J7yTYxxQ7u7rdlonsySTbTezz4X1MLNDCX6OPt15vcwOM+tvZv3Cz72ArwArU6p1yeMOmW1/Vz327n6Zuw9090HANOAv7n5WSrUueewz2fauetwBzKwwvPmJ8JTWROD1lGpd8thDZtvfVY+/u/8TWGNmB4WzjgFSb37LybHX3ZrpHQGcDfwjvP4G4HJgPwB3vxOYD5wArAK2At/Y+d3Miky2/TTgO2ZWA2wDpnnXeJrx3sCvzSxO8MvnUXd/yszOhy5/3CGz7e+qxz6tbnTsm+hGx30v4Mkwe+QBD7n7n7rRsc9k+7vy8f8+8KAFd2q+C3wjCsdebwgQERERiRCd1hQRERGJEIUzERERkQhROBMRERGJEIUzERERkQhROBMRERGJEIUzEel0zKzWzJaa2etm9piZpb6sOLnueDM7PGl6tpmdlsE6NrdWp63MrMTMTkiavtrMLu7o9YhI56ZwJiKd0TZ3L3H3Q4Aq4PwW6o4HDm+hfGcqIXhmkohIsxTORKSzWwR8wcxONLO/hy8wXmhme5nZIILgdlE40valsM2XzewFM3s3w1G0H5vZy2a2zMx+Gs4bZGYrzOxXZvaGmS0I36yAmY0N6y42sxvCEb4ewDXAGWFfzggXP8zMng37cmFH7xwR6XwUzkSk0zKzPIKXNf8DeB4YF77A+BHgEndfDdwJ3ByOtC0Km+4NHAlMAa5rZR0TgSEE7xssAcZYw4uhhwC3u/twYCNwajj/PuB8dz8MqAVw9yrgSmBO2Jc5Yd2DgePC5V9lwbttRaQb0+ubRKQz6pX0erFFBO+DPQiYY2Z7Az2A91po/1t3rwOWm9leraxrYvj1ajhdRBDKPgDec/f6fiwBBoXvJ+3j7i+E8x8iCIHN+YO7bwe2m9knBK/TWdtKn0SkC1M4E5HOaJu7lyTPMLNbgZvcfZ6ZjQeubqH99uSmrazLgGvd/X9T1jcoZTm1QK8MltdSX2rR72WRbk+nNUWkq+gLfBh+npE0vwLoswPLfRr4ppkVAZjZADPbs7nK7v4voMLMxoWzpnVgX0SkG1A4E5Gu4mrgMTNbBGxImv974OSUGwIy5u4LCE5NLjazfwCP03rA+jfgLjNbTDCSVh7Of4bgBoDkGwJERBoxd891H0REuhQzK3L3zeHnS4G93f3fc9wtEekkdG2DiEjHm2xmlxH8jn0fmJnb7ohIZ6KRMxEREZEI0TVnIiIiIhGicCYiIiISIQpnIiIiIhGicCYiIiISIQpnIiIiIhGicCYiIiISIf8firE+2R0ndx4AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -255,16 +255,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "12979" + "4156" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -290,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -334,7 +334,7 @@ " G = read_and_create(v)\n", " \n", " num_nodes = G.number_of_nodes()\n", - " nodes = G.nodes().to_array().tolist()\n", + " nodes = G.nodes().to_numpy().tolist()\n", " \n", " print('\\t', end='')\n", " for j in range (10, max_seeds +1, 10) :\n", @@ -352,12 +352,12 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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OGeffTYxMftX2dq1azHG8P3335d027VrF5999lnJ93Xr1rFw4cJDjrNjx46kpqbWaBzxeBCPu6TkDMAEByNFhYgcWA2yrMONVymllKopfUKAH/B4PJX2+/TTT3nooYdYt24dISEhB52WiOD1emscw4HJ2Ycffki3bgc2S1e1zz//nNNPP53PP/+8pFttJ2eHQlwuAGylkjNbUBDi8YDbXeW4mpwppZQ60jQ5q2O7du3ipJNO4sYbbyQ6OporrriC/Px8OnbsyLPPPsvpp5/OF198weLFixk4cCB9+vRh5MiR5Obm8uGHHzJ79myeffZZrrvuOgDGjx9P//79iY6O5qmnniqZR9euXRk7dix9+vQhPj6+yuHGjBlD9+7dGTJkCAUFBcyZM4eYmBiuu+66khK60qVid955J/369aN79+4l0zqQiDBnzhymTp3K4sWLSyrKP/rooyxbtoxevXrxyiuvMG7cOGbNmkWvXr2YNWsWq1at4tRTT6V3796ceuqpxMbGAlbC+tBDD9GjRw+io6N56623Sub11ltv0adPH3r06MHmzZsBePrpp7nxxhsZMmQIHTt2ZO7cuTz88MP06NGD4SNG4HK5MAGBrF69mrPOOotTBg/mottvZ09cHGCVAj7yyCOcfPLJnHjiiSxbtgyn01kuXqWUUqqu1WVTGn7nma83sHFvdq1Os1vrBjx1Yfcqh4mNjeWjjz7itNNO4+abb2bSpEmA1U7Wb7/9RmpqKpdddhlLliwhLCyMV155hddee41x48bx22+/MWLECK644goWL17M1q1bWbVqFSLCRRddxK+//kr79u2JjY3l448/ZtKkSVUOt3XrVj7//HM++OADrrzySr788kuuv/563n77bSZMmEC/fv3Kxf/CCy/QpEkTPB4PgwYN4u+//yY6OrrMML///judOnXi+OOP5+yzz2bhwoVcdtllvPzyy0yYMIFvvrGewNWiRQtiYmJ4++23AcjOzubXX3/F4XCwZMkSHn/8cb788kvef/99du7cydq1a3E4HKSnp5fMq1mzZqxZs4ZJkyYxYcIEPvzQaqd4+/btLF26lI0bNzJw4EC+/PJL/ve//3HJBRfw3a+/culJJ3HPPfcwf/58mjZqxKdvvsl/n3qKqZ9+CoDb7WbVqlUsXLiQZ555hiVLlvDss8+WiVcppZSqa8dUclZf2rVrx2mnnQbA9ddfz8SJEwG46qqrAFixYgUbN24sGcbpdDJw4MBy01m8eDGLFy+md+/eAOTm5rJ161bat29Phw4dGDBgwEGH69SpE7169QKgb9++7Nq166Dxz549m/fffx+3201iYiIbN24sl5x9/vnnXH311QBcffXVfPLJJ1x22WUHnXZWVhY33ngjW7duxRiDy3cJcsmSJdxxxx04HNYm2qRJk5Jxiqfbt29f5s6dW9J9+PDhBAQE0KNHDzweD8OGDQOg+4knsjsxidht21i/fj2DBw8GwJ2fT8tWrSqcbnWWi1JKKVUXjqnk7GAlXHXlwCYXir+H+RpAFREGDx5cpq5WRUSExx57jNtvv71M9127dpVM62DDBfna+AKw2+0Hvclg586dTJgwgT///JPGjRszevTocm17eTwevvzySxYsWMALL7xQ0kBrTk5OldMGePLJJznnnHOYN28eu3bt4uyzzy75DZU1VVH8G+x2O+5SdcaKu9tsNgICAkrGNyJ4fO0fd+/eneXLlwNQtGNHtaarlFJKHUla56yaRARXYiLulJQaj7t79+6ShKC40nxpAwYM4Pfff2fbNut5j/n5+WzZsqXcdIYOHcqUKVPIzc0FYM+ePSQnJx/ycKVFRERUmExlZ2cTFhZGw4YN2bdvH9999125YZYsWULPnj2Jj49n165dxMXFcfnll/PVV1+Vm+6B37OysmjTpg1g3ZRQbMiQIUyePLkkSSp9WbPGPB6w2+nSpQspKSkl68Jts7Nh/foq79isbLkopZRSdUWTs2oyxiAuF67kFLxOZ43G7dq1K9OmTSM6Opr09HTuvPPOMv0jIyOZOnUq11xzDdHR0QwYMKCkontpQ4YM4dprr2XgwIH06NGDK664osLEobrDlTZ69GjuuOOOck129OzZk969e9O9e3duvvnmkkuvpX3++edceumlZbpdfvnlfPbZZ0RHR+NwOOjZsyevv/4655xzDhs3biypYP/www/z2GOPcdppp5W5a/XWW2+lffv2REdH07NnzzJ3fNaEiCAeD8bhIDAwkDlz5vDII4/Qs2dPTh42lOVr1iBVlJIdGK9SSilV18zB2nkqM7AxYSKSV4fxHJZ+/fpJ6Xa3ADZt2kTXrl1rZfpep5OirduwR4QTWMFzPCuya9cuRowYwfr162slBlUzXpeLothYAlq3xlGq3hqA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\n", "text/plain": [ "
" ] @@ -387,16 +387,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "4094" + "3711" ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -416,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -430,12 +430,12 @@ ], "source": [ "G = read_and_create('./data/coPapersCiteseer.mtx')\n", - "nodes = G.nodes().to_array().tolist()\n" + "nodes = G.nodes().to_numpy().tolist()\n" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -447,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -475,12 +475,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEWCAYAAAAHC8LZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAA3DklEQVR4nO3dd5xU1f3/8ddnZndZOgpYEBFUUASkq4gFC2DBkhiNDaMmMc0Yf4nELho1aiyJvcSer72bxIKoKBa6CCgGUVFAVEA6bJv5/P44d5dhZWGBnb07u+/n47EPdsq99zN3h/uee+6Zc8zdERERyTWJuAsQERHZHAowERHJSQowERHJSQowERHJSQowERHJSQowERHJSQowyQlm1sHMVppZMu5a6iIz62hmbmZ5MW1/oJl9Gv2Njo2jhqiO083snbi2L7VLASabzczmmNma6KD1jZk9aGbNanDdh5bfdvev3L2Zu6dqYv3ZFh1I3cz+XOn+eWY2KJ6qsuovwG3R3+j5yg+a2X5m9p6ZLTOz783sXTPrX/tlSn2iAJMtdZS7NwN6Ab2BC+Mtp075HvizmTWPu5BNsZlncTsBH1WxvhbAf4Bbga2BHYArgOLNrVEEFGBSQ9z9G+BVQpBhZoPMbF7mczLPqszscjN70sweNrMVZvaRmfWLHvsX0AH4d3R29+fKTWRmNsbMroo+1a80s3+bWWsze8TMlpvZRDPrmLHt3c3stejT///M7IT1vQ4z+6mZTap03/8zsxej348ws4+jmueb2Xkb2C0zgfeBP1axrQfN7KqM2+vss2h/jTCzaWa2yszuM7NtzezlaPujzWyrSqs908y+NrMFmbWZWcLMLjCzz8xscbTvt44eK9+3Pzezr4A3qqj3l2Y2O9qHL5pZu+j+z4CdWfv3alRp0S4A7v6Yu6fcfY27j3L3aRnrPtPMZprZEjN71cx2ynisyr9d9Dd/MfqbTwB2yXjMzOzvZvZd9Ph0M+u+vtcmuUkBJjXCzNoDhwOzN2Gxo4HHgVbAi8BtAO4+HPiK6OzO3f9WxfInAsMJn+h3IYTFA4RP+TOBkVFtTYHXgEeBbaLl7jCzPdazzn8Du5lZ54z7To6WBbgP+JW7Nwe6U8XBPsOlwLnlYbEZjgMGE0LgKOBl4CKgLeH/7zmVnn8Q0BkYApyf0Qz7e+BY4ECgHbAEuL3SsgcCXYGhlYsws4OBa4ATgO2BLwl/O9x9F9b9e1U+s5oFpMzsITM7vHLomtkx0Wv6cfS6xgKPRY9t7G93O1AU1XRm9FNuCHBAtO9aRrUvrvzaJHcpwGRLPW9mK4C5wHdEoVFN77j7S9F1rX8BPTdx2w+4+2fuvoxwYP/M3Ue7exnwFKFJE2AYMMfdH3D3Mnf/AHgGOL7yCt19NfACcBJAFGS7EwIWoBTYw8xauPsSd5+yoQLdfSrhAHz+Jr62cre6+7fuPp9wYB/v7h+4exHwXMZrLHeFu69y9+mEMD8puv/XwMXuPi8KmMuBn1RqLrw8WnbNeuo4Bbjf3adEy18IDMg8y62Kuy8H9gMc+CewMDpr2jajtmvcfWb0t/sr0Cs6C6vyb2ehQ89xwGVR3TOAhzI2XQo0J/z9LFr/go3VK7lDASZb6tjobGQQ4UDRZhOW/Sbj99VA4SZef/k24/c167ld3qFkJ2BvM1ta/kM4IG9XxXofZe2B/2Tg+SjYIBwwjwC+NLO3zGxANeq8DPhNxgF7U1T3NZabm/H7l4SzLQj74LmM1z8TSAHbVrFsZe2i9QHg7isJZzM7bPwlQBQep7t7e8KZazvgHxm13ZxR2/eAReve0N+uLZC3ntdcvs03CGf1twPfmdk9Fq7HST2hAJMa4e5vAQ8CN0R3rQKalD8efVpuuymrrLHiwgHuLXdvlfHTzN1/U8XzXwPamlkvQpCVNx/i7hPd/RhCc9bzwJMb27i7fwI8C1xc6aF19hFVB+qm2DHj9w7A19Hvc4HDK+2DwujMrqLUDaz3a0KYABVNe62B+VUuUYVofzxICLLy2n5VqbbG7v4eG/7bLQTK1vOaM7d1i7v3BfYgNCWO2NR6pe5SgElN+gcw2Mx6Eq57FJrZkWaWD1wCVL64vyHfEjoG1IT/AF3MbLiZ5Uc//c2s6/qe7O6lhCbI6wnX014DMLMCMzvFzFpGz1kOpKtZwxXAGYTrfeWmAkeY2dZmth1w7qa/tB+41MyamFm3aHtPRPffBVxd3jnCzNpG156q6zHgDDPrFXXS+CuhOXPOxhaMOmH8KbpOipntSPhgMC6jtgujmjGzlmZW3rxb5d8uanp+Frg8es17AD/L2G5/M9s7ev+tIlwrq+7fS3KAAkxqjLsvBB4mXJNYBvwWuJfwKX0VMG8Di1d2DXBJ1Gy0oZ5+1alrBeGC/omEM4lvgOvYcKA+ChwKPBVdlyk3HJhjZssJ125OqWYNXxCu8zXNuPtfwIfAHGAUa8NmS7xF6EjzOnCDu4+K7r+ZcB1vVHTNchywd3VX6u6jCR1SngEWEDrNnFjNxVdE2xpvZquibc8A/hSt+znC3+PxaL/OIHQIqs7f7mxCM+o3hLO6BzK224JwzW0JoWlxMeFDidQTpgktRUQkF+kMTEREcpICTEREcpICTEREcpICTEREclIsUy9UpU2bNt6xY8e4yxARkTpi8uTJi9x9vd8hrVMB1rFjRyZNmrTxJ4qISINgZl9W9ZiaEEVEJCcpwEREJCcpwEREJCfVqWtg61NaWsq8efMoKiqKuxSphsLCQtq3b09+fn7cpYhIPVfnA2zevHk0b96cjh07YmZxlyMb4O4sXryYefPm0alTp7jLEZF6rs43IRYVFdG6dWuFVw4wM1q3bq2zZRGpFVk9AzOzOYSRqFNAmbv328z11GRZkkX6W4lIbamNM7CD3L3X5oaXiIjkmO8/h5cvgFRpVjdT55sQ64NmzcKs73PmzOHRRysm92XSpEmcc845G1x2zpw5dO/efYPPqQ3lr0FEpEorF8JLI+C2/jDlIVgwLauby3aAOWECvclmdtb6nmBmZ5nZJDObtHDhwiyXE6/KAdavXz9uueWWGCsSEakBJavhrevhll4w8T7oPRzO+QDa983qZrMdYPu5ex/C7Kq/M7MDKj/B3e9x937u3q9t2/UOdxWrOXPmsPvuu3P66afTpUsXTjnlFEaPHs3AgQPp3LkzEyZMAODyyy/nhhtuqFiue/fuzJkzZ511XXDBBYwdO5ZevXrx97//nTFjxjBs2LCK5YcPH86AAQPo3Lkz//znP39QSyqVYsSIEfTv358999yTu++++wfPWbVqFUceeSQ9e/ake/fuPPFEmOR38uTJHHjggfTt25ehQ4eyYMECAD777DMOO+ww+vbty/77788nn3wCwBdffMGAAQPo0aMHl1xyScX6FyxYwAEHHECvXr3o3r07Y8eO3YK9KyI5LZ2GD5+A2/rBm1fBzoPgt+PgqH9A8+2yvvmsduJw9/nRv9+Z2XPAXsDbm7u+K/79ER9/vbymygNgj3YtGHlUtw0+Z/bs2Tz11FPcf//99O/fn0cffZR33nmHF198kb/+9a88//zz1drWtddeyw033MB//vMfAMaMGbPO49OmTWPcuHGsWrWK3r17c+SRR67z+H333UfLli2ZOHEixcXFDBw4kCFDhqzTZf2VV16hXbt2/Pe//wVg2bJllJaW8vvf/54XXniBtm3b8sQTT3DxxRdz//33c9ZZZ3HXXXfRuXNnxo8fz29/+1veeOMN/vCHP/Cb3/yG0047jdtvv71i/Y8++ihDhw7l4osvJpVKsXr16mq9dhGpZ74aD69eCPMnw/Y94cf/hI4Da7WErAWYmTUFEu6+Ivp9CPCXbG0vmzp16kSPHj0A6NatG4cccghmRo8ePX5wlrUljjnmGBo3bkzjxo056KCDmDBhAr169ap4fNSoUUybNo2nn34aCOH06aefrhNgPXr04E9/+hPnn38+w4YNY//992fGjBnMmDGDwYMHA+FMbvvtt2flypW89957HH/88RXLFxcXA/Duu+/yzDPPADB8+HDOP/98APr378+ZZ55JaWkpxx577Dr1iUgDsPgzGH05zHwRmm8Px94Je54IidrvUpHNM7BtgeeibtV5wKPu/sqWrHBjZ0rZ0qhRo4rfE4lExe1EIkFZWRkAeXl5pNPpiudtznehKndBr3zb3bn11lsZOnRolevo0qULU6ZM4aWXXuKSSy7hkEMO4Uc/+hHdunXj/fffX+e5y5cvp1WrVkydOrVa9QAccMABvP322/z3v//l9NNP549//COnnXZaNV+hiOSs1d/DW3+DifdCsgAGXQT7ng0FTWMrKWuR6e6fu3vP6Kebu1+drW3VBR07dmTKlCkATJkyhS+++OIHz2nevDkrVqyoch0vvPACRUVFLF68mDFjxtC/f/91Hh86dCh33nknpaWha+qsWbNYtWrVOs/5+uuvadKkCaeeeiojRoxgypQp7LbbbixcuLAiwEpLS/noo49o0aIFnTp14qmnngJCQH744YcADBw4kMcffxyARx55pGL9X375Jdtuuy2//OUv+cUvflHxmkWknipdA+/8A27uBRPuhl4nwTlTYND5sYYX5MBQUrniuOOO4+GHH6Zbt27svffedOnS5QfP2XPPPUkmk/Ts2ZPTTz+d3r17/+Dxgw46iEWLFnHppZfSrl27dZoof/GLXzBnzhz69OmDu9O2bdsfXH+bPn06I0aMIJFIkJ+fz5133klBQQFPP/0055xzDsuWLaOsrIxzzz2Xbt268cgjj/Cb3/yG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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -523,9 +523,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -537,7 +537,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.8.13" } }, "nbformat": 4, From 9cf462eb8c5e991a23b3493cfae1fa081a50b6fb Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 29 Mar 2022 11:24:12 -0400 Subject: [PATCH 174/384] 22.04 Update docs (#2171) Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2171 --- docs/cugraph/source/basics/cugraph_blogs.rst | 30 ++++++++++++++++---- docs/cugraph/source/basics/cugraph_intro.md | 5 ++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/basics/cugraph_blogs.rst index 35db20ff4..4d5447879 100644 --- a/docs/cugraph/source/basics/cugraph_blogs.rst +++ b/docs/cugraph/source/basics/cugraph_blogs.rst @@ -7,8 +7,12 @@ 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 -============== +BLOGS & Conferences +==================== +2018 +------- + * `GTC18 Fall - RAPIDS: Benchmarking Graph Analytics on the DGX-2 `_ + 2019 ------- @@ -16,7 +20,8 @@ BLOGS * `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 `_ 2020 ------ @@ -24,10 +29,19 @@ BLOGS * `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 `_ 2021 ------ - * + * `GTC 21 - State of RAPIDS cuGraph and what's comming next `_ + + +2022 +------ + * `GTC: State of cuGraph (video & slides) `_ + * `GTC: Scaling and Validating Louvain in cuGraph against Massive Graphs (video & slides) `_ + + @@ -38,7 +52,13 @@ Media Academic Papers =============== -* S. Kang, A. Fender, J. Eaton, B. Rees: Computing PageRank Scores of Web Crawl Data Using DGX A100 Clusters. In IEEE HPEC, Sep. 2020 + + * 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). + Other BLOGS diff --git a/docs/cugraph/source/basics/cugraph_intro.md b/docs/cugraph/source/basics/cugraph_intro.md index 142395fb7..068412950 100644 --- a/docs/cugraph/source/basics/cugraph_intro.md +++ b/docs/cugraph/source/basics/cugraph_intro.md @@ -67,3 +67,8 @@ 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__. +# Roadmap +GitHub does not provide a robust project management interface, and so a roadmap turns into simply a projection of when work will be completed and not a complete picture of everything that needs to be done. To capture the work that requires multiple steps, issues are labels as “EPIC” and include multiple subtasks that could span multiple releases. The EPIC will be in the release where work in expected to be completed. A better roadmap is being worked an image of the roadmap will be posted when ready. + + * GitHub Project Board: https://github.com/rapidsai/cugraph/projects/28 + \ No newline at end of file From 9e7f9b49960725631da2df0663648da78319ffc9 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 6 Apr 2022 17:09:05 +0000 Subject: [PATCH 175/384] REL v22.04.00 release From a8ea2392d88241ee5644b9f76ba60abd108ba8bd Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Fri, 15 Apr 2022 09:32:20 -0400 Subject: [PATCH 176/384] Updating issue template and missing docs (#2211) Templates * added acceptance criterias * dropped enhancement as an issue type Doc * adding missing references * adding sampling Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/2211 --- docs/cugraph/source/api_docs/sampling.rst | 2 ++ docs/cugraph/source/basics/cugraph_ref.rst | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/sampling.rst index 6255c981a..d633e94b7 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/sampling.rst @@ -11,3 +11,5 @@ Random Walks :toctree: api/ cugraph.random_walks + cugraph.ego_graph + cugraph.experimental.dask.uniform_neighborhood_sampling \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_ref.rst b/docs/cugraph/source/basics/cugraph_ref.rst index e0f113eab..f099752c5 100644 --- a/docs/cugraph/source/basics/cugraph_ref.rst +++ b/docs/cugraph/source/basics/cugraph_ref.rst @@ -28,6 +28,13 @@ Betweenness Centrality 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 @@ -36,6 +43,18 @@ 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) + + + + | | From 40910784c2dca73002cdb1059953259a1a8b45da Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Fri, 29 Apr 2022 20:19:37 -0700 Subject: [PATCH 177/384] Python code cleanup across docs, wrappers, testing (#2194) This PR incorporates suggested changes from issue #2037, opened back in 22.02, as well as cleaning up documentation and testing code from 22.04 work. Specifically, this PR does the following: - Removes worker helpers from MNMG algos in the online documentation (e.g. `call_katz_centrality`, `call_louvain`, `call_wcc`) - Adds helpers from comms such as `get_comms`, `get_session_id`, `get_2D_partition`, is_initialized that were previously missing - Adds helpers from NumberMap such as `from_internal_vertex_id`, `to_internal_vertex_id`, `renumber`, `set_renumbered_col_names` - Add MNMG Hits and Node2vec to docs - Added docstring descriptions and examples to methods that were missing them - Fixed docstring examples in `egonet.py`, `node2vec.py` - Adds `pylibcugraph` docstring examples to the list of examples tested in `cugraph/tests/test_doctests.py` - Adds support for MG Dask docstring example testing, tested in newly created `cugraph/tests/dask/test_mg_doctests.py` This PR addresses the items from and closes https://github.com/rapidsai/cugraph/issues/2227. This PR also closes #2193. Authors: - https://github.com/betochimas Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2194 --- docs/cugraph/source/api_docs/centrality.rst | 1 - docs/cugraph/source/api_docs/community.rst | 1 - docs/cugraph/source/api_docs/components.rst | 1 - .../source/api_docs/helper_functions.rst | 8 +++++++ .../cugraph/source/api_docs/link_analysis.rst | 7 +++++++ docs/cugraph/source/api_docs/sampling.rst | 9 +++++++- docs/cugraph/source/api_docs/structure.rst | 21 ++++++++++++++++++- docs/cugraph/source/api_docs/traversal.rst | 2 -- 8 files changed, 43 insertions(+), 7 deletions(-) diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index 4001328ee..c9c1e24b5 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -26,4 +26,3 @@ Katz Centrality (MG) :toctree: api/ cugraph.dask.centrality.katz_centrality.katz_centrality - cugraph.dask.centrality.katz_centrality.call_katz_centrality diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/community.rst index 23db12c44..d35ac657f 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/community.rst @@ -50,7 +50,6 @@ Louvain (MG) .. autosummary:: :toctree: api/ - cugraph.dask.community.louvain.call_louvain cugraph.dask.community.louvain.louvain Spectral Clustering diff --git a/docs/cugraph/source/api_docs/components.rst b/docs/cugraph/source/api_docs/components.rst index cf2f09efa..8616c8742 100644 --- a/docs/cugraph/source/api_docs/components.rst +++ b/docs/cugraph/source/api_docs/components.rst @@ -20,6 +20,5 @@ Connected Components (MG) .. autosummary:: :toctree: api/ - cugraph.dask.components.connectivity.call_wcc cugraph.dask.components.connectivity.weakly_connected_components diff --git a/docs/cugraph/source/api_docs/helper_functions.rst b/docs/cugraph/source/api_docs/helper_functions.rst index f8a3f0495..249ea9c14 100644 --- a/docs/cugraph/source/api_docs/helper_functions.rst +++ b/docs/cugraph/source/api_docs/helper_functions.rst @@ -12,5 +12,13 @@ Methods cugraph.comms.comms.initialize cugraph.comms.comms.destroy + cugraph.comms.comms.is_initialized + cugraph.comms.comms.get_comms + cugraph.comms.comms.get_workers + cugraph.comms.comms.get_session_id + cugraph.comms.comms.get_2D_partition + cugraph.comms.comms.get_default_handle + cugraph.comms.comms.get_handle + cugraph.comms.comms.get_worker_id cugraph.dask.common.read_utils.get_chunksize diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/link_analysis.rst index c19a36aed..b84dd2ccb 100644 --- a/docs/cugraph/source/api_docs/link_analysis.rst +++ b/docs/cugraph/source/api_docs/link_analysis.rst @@ -12,6 +12,13 @@ HITS cugraph.hits +HITS (MG) +--------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.link_analysis.hits.hits + Pagerank -------- diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/sampling.rst index d633e94b7..8a6cc5f22 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/sampling.rst @@ -12,4 +12,11 @@ Random Walks cugraph.random_walks cugraph.ego_graph - cugraph.experimental.dask.uniform_neighborhood_sampling \ No newline at end of file + cugraph.experimental.dask.uniform_neighborhood_sampling + +Node2Vec +--------- +.. autosummary:: + :toctree: api/ + + cugraph.node2vec diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index f2d497814..04e836ff3 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -75,6 +75,26 @@ Conversion from Other Formats cugraph.to_pandas_adjacency cugraph.to_pandas_edgelist +NumberMap +----------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.structure.NumberMap + cugraph.structure.NumberMap.MultiGPU + cugraph.structure.NumberMap.SingleGPU + cugraph.structure.NumberMap.from_internal_vertex_id + cugraph.structure.NumberMap.to_internal_vertex_id + cugraph.structure.NumberMap.add_internal_vertex_id + cugraph.structure.NumberMap.compute_vals + cugraph.structure.NumberMap.compute_vals_types + cugraph.structure.NumberMap.generate_unused_column_name + cugraph.structure.NumberMap.renumber + cugraph.structure.NumberMap.renumber_and_segment + cugraph.structure.NumberMap.set_renumbered_col_names + cugraph.structure.NumberMap.unrenumber + cugraph.structure.NumberMap.vertex_column_size + Other ----------------------------- .. autosummary:: @@ -82,4 +102,3 @@ Other cugraph.hypergraph cugraph.structure.shuffle - cugraph.structure.NumberMap diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/traversal.rst index d1736799e..675bf89f3 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/traversal.rst @@ -19,7 +19,6 @@ Breadth-first-search (MG) :toctree: api/ cugraph.dask.traversal.bfs.bfs - cugraph.dask.traversal.bfs.call_bfs Single-source-shortest-path --------------------------- @@ -36,5 +35,4 @@ Single-source-shortest-path (MG) .. autosummary:: :toctree: api/ - cugraph.dask.traversal.sssp.call_sssp cugraph.dask.traversal.sssp.sssp From 9b4f4db8da32c300280d8ad7baae2891b89a6ac9 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Tue, 3 May 2022 17:14:16 -0700 Subject: [PATCH 178/384] Allow `cugraph` to be imported in an SG env for SG algorithms (#2241) This PR aims to directly resolve #2113, and allows for cugraph to be imported without errors in environments with only a single GPU What this PR does: - Moves `comms` module into the `dask` module, renaming imports across `cugraph` accordingly - Adds mock class in case ucp is not available or usable in SG-only environments (note ucp requires libnuma.so) - Renames `tests/dask` to `tests/mg` to better reflect the fact that those tests are for mg algs and utils - Separates symmetrize testing into `tests/mg` and `tests` for separation of SG and MG testing Authors: - https://github.com/betochimas Approvers: - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/2241 --- docs/cugraph/source/api_docs/dask-cugraph.rst | 2 +- .../source/api_docs/helper_functions.rst | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst index 51487bfbf..9ccc429a7 100644 --- a/docs/cugraph/source/api_docs/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/dask-cugraph.rst @@ -20,7 +20,7 @@ Example from dask.distributed import Client, wait from dask_cuda import LocalCUDACluster - import cugraph.comms as Comms + import cugraph.dask.comms as Comms import cugraph.dask as dask_cugraph cluster = LocalCUDACluster() diff --git a/docs/cugraph/source/api_docs/helper_functions.rst b/docs/cugraph/source/api_docs/helper_functions.rst index 249ea9c14..08585d264 100644 --- a/docs/cugraph/source/api_docs/helper_functions.rst +++ b/docs/cugraph/source/api_docs/helper_functions.rst @@ -10,15 +10,15 @@ Methods .. autosummary:: :toctree: api/ - cugraph.comms.comms.initialize - cugraph.comms.comms.destroy - cugraph.comms.comms.is_initialized - cugraph.comms.comms.get_comms - cugraph.comms.comms.get_workers - cugraph.comms.comms.get_session_id - cugraph.comms.comms.get_2D_partition - cugraph.comms.comms.get_default_handle - cugraph.comms.comms.get_handle - cugraph.comms.comms.get_worker_id + cugraph.dask.comms.comms.initialize + cugraph.dask.comms.comms.destroy + cugraph.dask.comms.comms.is_initialized + cugraph.dask.comms.comms.get_comms + cugraph.dask.comms.comms.get_workers + cugraph.dask.comms.comms.get_session_id + cugraph.dask.comms.comms.get_2D_partition + cugraph.dask.comms.comms.get_default_handle + cugraph.dask.comms.comms.get_handle + cugraph.dask.comms.comms.get_worker_id cugraph.dask.common.read_utils.get_chunksize From 075011011339173438ebe0c861bfd9d3ff6f5391 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Tue, 10 May 2022 10:50:41 -0700 Subject: [PATCH 179/384] Add Degree Centrality to cugraph (#2259) This PR adds Degree Centrality to the cugraph software stack, and closes #2145 when merged. Authors: - https://github.com/betochimas Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2259 --- docs/cugraph/source/api_docs/centrality.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index c9c1e24b5..aad5e355f 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -26,3 +26,10 @@ Katz Centrality (MG) :toctree: api/ cugraph.dask.centrality.katz_centrality.katz_centrality + +Degree Centrality +--------------- +.. autosummary:: + :toctree: api/ + + cugraph.degree_centrality From 8f3bf0955f5c3306ddfc361b36984e629ed1256a Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 19 May 2022 11:04:06 -0400 Subject: [PATCH 180/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index f060f10f6..02c69f0a5 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.06' +version = '22.08' # The full version, including alpha/beta/rc tags. -release = '22.06.00' +release = '22.08.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1b3ca0b1b1f2806c154f564560560b0ac4a73261 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Fri, 20 May 2022 08:40:42 -0700 Subject: [PATCH 181/384] Branch 22.06 bug fixes + update imports (#2261) This PR: 1. Updates reference code in the html documentation to reflect recent changes from 22.02 and 22.04 (closes #2248 ) 2. Updates the default value of max_depth within node2vec, so that a call without a default max_depth value still yields a result (closes #2228) 3. Casts a list of start_vertices to int32 type. (closes #2229) 4. Remove experimental from list of imports from within pylibcugraph Authors: - https://github.com/betochimas Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) - Joseph Nke (https://github.com/jnke2016) URL: https://github.com/rapidsai/cugraph/pull/2261 --- docs/cugraph/source/api_docs/dask-cugraph.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst index 9ccc429a7..e015b5996 100644 --- a/docs/cugraph/source/api_docs/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/dask-cugraph.rst @@ -37,7 +37,7 @@ Example names=['src', 'dst'], dtype=['int32', 'int32']) - G = cugraph.DiGraph() + G = cugraph.Graph(directed=True) G.from_dask_cudf_edgelist(e_list, source='src', destination='dst') # now run PageRank From 0b66fa6cbb2e719cc39a0ddc40abae6d5ceed319 Mon Sep 17 00:00:00 2001 From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com> Date: Fri, 20 May 2022 15:22:41 -0400 Subject: [PATCH 182/384] Implement eigenvector centrality (#2287) This PR implements Eigenvector Centrality in C++ using the graph primitives. It also provides the C API implementation. There are unit tests for C++ and C both SG and MG. Partially addresses #2146 Authors: - Chuck Hastings (https://github.com/ChuckHastings) Approvers: - Seunghwa Kang (https://github.com/seunghwak) URL: https://github.com/rapidsai/cugraph/pull/2287 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 485b71cac..8ae12d147 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ __pycache__ .lock *.swp *.pytest_cache +*~ DartConfiguration.tcl .DS_Store From 5bba2b3f4a3da16fbec450e906475986bf83a02a Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Mon, 23 May 2022 12:41:17 -0400 Subject: [PATCH 183/384] Migrate SG and MG BFS to pylibcugraph (#2284) Closes #2270 Authors: - Alex Barghi (https://github.com/alexbarghi-nv) - Chuck Hastings (https://github.com/ChuckHastings) Approvers: - Rick Ratzel (https://github.com/rlratzel) - https://github.com/betochimas URL: https://github.com/rapidsai/cugraph/pull/2284 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8ae12d147..44a1471fe 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ python/cugraph/cugraph/tests/dask-worker-space # Sphinx docs & build artifacts docs/cugraph/source/api_docs/api/* + From 985634e468a983e9ac867b77ec000d0b178d6177 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Fri, 27 May 2022 07:18:31 -0700 Subject: [PATCH 184/384] Add Eigenvector Centrality to pylibcugraph, cugraph APIs (#2255) This PR: 1. Adds Eigenvector Centrality to the pylibcugraph and cugraph software stacks, which started from https://github.com/rapidsai/cugraph/pull/2180 and is followed up by future PRs in order to close https://github.com/rapidsai/cugraph/issues/2146 2. Minor improvements to pylibcugraph Katz Centrality 3. Added functionality to `test_doctests.py` so that certain docstrings can be skipped on different architecture configs (such as ktruss in CUDA 11.4) 4. Added undirected/directed versions of graph example used in C tests in `datasets` 5. Removed cugraph copy of warning wrapper from pylibcugraph and have it call the pylibcugraph version 6. Testing for both Python eigenvector centrality wrappers This PR is identical to #2243, just that the name of the branch is different Authors: - https://github.com/betochimas - Chuck Hastings (https://github.com/ChuckHastings) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2255 --- docs/cugraph/source/api_docs/centrality.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index aad5e355f..92f712523 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -33,3 +33,17 @@ Degree Centrality :toctree: api/ cugraph.degree_centrality + +Eigenvector Centrality +---------------------- +.. autosummary:: + :toctree: api/ + + cugraph.centrality.eigenvector_centrality + +Eigenvector Centrality (MG) +--------------------------- +.. autosummary:: + :toctree: api/ + + cugraph.dask.centrality.eigenvector_centrality.eigenvector_centrality From 3985a5aee0fc7be00fbd94873954e92601c3b871 Mon Sep 17 00:00:00 2001 From: betochimas <97180625+betochimas@users.noreply.github.com> Date: Wed, 1 Jun 2022 06:52:19 -0700 Subject: [PATCH 185/384] Refactored SG `hits` and MG `katz_centrality` (#2276) This PR: 1. Refactors SG `hits` with the updated pylibcugraph implementation 2. Refactors MG `katz_centrality` with the updated pylibcugraph implementation, adding support for multiple arguments 3. Improves support within `test_doctests.py` to ignore certain docstring examples based on the build architecture (such as ktruss in CUDA 11.4) 4. Passing MG `katz_centrality` testing This PR also closes #2025. Authors: - https://github.com/betochimas Approvers: - Alex Barghi (https://github.com/alexbarghi-nv) - Joseph Nke (https://github.com/jnke2016) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2276 --- docs/cugraph/source/api_docs/pylibcugraph.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/pylibcugraph.rst index 9317274cf..93efec37f 100644 --- a/docs/cugraph/source/api_docs/pylibcugraph.rst +++ b/docs/cugraph/source/api_docs/pylibcugraph.rst @@ -11,5 +11,12 @@ Methods .. autosummary:: :toctree: api/ + pylibcugraph.eigenvector_centrality + pylibcugraph.katz_centrality pylibcugraph.strongly_connected_components pylibcugraph.weakly_connected_components + pylibcugraph.pagerank + pylibcugraph.hits + pylibcugraph.node2vec + pylibcugraph.bfs + pylibcugraph.sssp From f1170aa8dce9b8121b8a513b714efa33238e716a Mon Sep 17 00:00:00 2001 From: Joseph Nke <76006812+jnke2016@users.noreply.github.com> Date: Fri, 3 Jun 2022 08:10:20 -0500 Subject: [PATCH 186/384] fix 'comms' import in the api_docs (#2327) This PR fixes the `comms` import in the API docs. Authors: Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Brad Rees (https://github.com/BradReesWork) --- docs/cugraph/source/api_docs/dask-cugraph.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst index e015b5996..4eee5b36a 100644 --- a/docs/cugraph/source/api_docs/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/dask-cugraph.rst @@ -20,7 +20,7 @@ Example from dask.distributed import Client, wait from dask_cuda import LocalCUDACluster - import cugraph.dask.comms as Comms + import cugraph.dask.comms.comms as Comms import cugraph.dask as dask_cugraph cluster = LocalCUDACluster() From 7c4d22e31fca9af6ee2162cc5bd9dfb115109651 Mon Sep 17 00:00:00 2001 From: Ralph Liu <106174412+oorliu@users.noreply.github.com> Date: Mon, 6 Jun 2022 12:04:06 -0400 Subject: [PATCH 187/384] DOC Fix for Renumber-2.ipynb (#2335) Fixed issue #2178. Updated to the correct number of unique IPs. Added code to confirm cuGraph results using CuPy. Authors: - Ralph Liu (https://github.com/oorliu) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2335 --- notebooks/demo/batch_betweenness.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb index 885d26c95..854621eb3 100644 --- a/notebooks/demo/batch_betweenness.ipynb +++ b/notebooks/demo/batch_betweenness.ipynb @@ -16,7 +16,7 @@ "metadata": {}, "source": [ "## Introduction\n", - "Betweennes Centrality can be slow to compute on large graphs, in order to speed up the process we can leverage multiple GPUs.\n", + "Betweenness Centrality can be slow to compute on large graphs, in order to speed up the process we can leverage multiple GPUs.\n", "In this notebook we will showcase how it would have been done with a Single GPU approach, then we will show how it can be done using multiple GPUs." ] }, From ae37de37d7711790d3da168c8eb31058f2e0a4e7 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Tue, 7 Jun 2022 20:28:28 +0000 Subject: [PATCH 188/384] REL v22.06.00 release From 1831dbbd3637f8db2160ce36cf5d5959443fa50f Mon Sep 17 00:00:00 2001 From: Ralph Liu <106174412+oorliu@users.noreply.github.com> Date: Wed, 8 Jun 2022 12:03:59 -0400 Subject: [PATCH 189/384] Release notebook: Nx Generators & Adding Perf_counter (#2341) There was an issue where some Nx methods return a generator and not a full answer. These functions (WCC, Jaccard, and BFS) were identified and fixed for the purpose of getting more accurate ("apples-to-apples") comparisons against cuGraph methods. Next, `time.time()` was replaced with `time.perf_counter()` to get appropriate interval timings. Authors: - Ralph Liu (https://github.com/oorliu) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2341 --- notebooks/cugraph_benchmarks/release.ipynb | 322 +++++++-------------- 1 file changed, 98 insertions(+), 224 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index e9d887a04..4693265d0 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -90,6 +90,7 @@ "| Brad Rees | 10/06/2020 | created | 0.16 | GV100, CUDA 10.2 |\n", "| Brad Rees | 01/20/2022 | updated | 22.02 | Quadro A6000 CUDA 11.5 |\n", "| Brad Rees | 01/20/2022 | added perf w/Nx obj | 22.02 | Quadro A6000 CUDA 11.5 |\n", + "| Ralph Liu | 06/01/2022 | Fix: Generators | 22.06 | Tesla V100, CUDA 11.5 |\n", "\n", "\n", "\n" @@ -104,14 +105,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# system and other\n", "import gc\n", "import os\n", - "import time\n", + "from time import perf_counter\n", "import numpy as np\n", "import math\n", "\n", @@ -128,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -148,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -169,13 +170,13 @@ "}\n", "\n", "\n", - "\n", - "data = data_full\n" + "# TODO: Was set to quick for test\n", + "data = data_quick\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -193,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -221,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -263,29 +264,29 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_katz(_df, alpha):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = nx.katz_centrality(_G, alpha)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_katz(_df, alpha):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _ = cugraph.katz_centrality(_G, alpha)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_katz_nx(_df, alpha):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = cugraph.katz_centrality(_G, alpha)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -298,30 +299,30 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_bc(_df, _k):\n", " print(f\" k = {_k}\", end=' ')\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = nx.betweenness_centrality(_G, k=_k)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_bc(_df, _k):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _ = cugraph.betweenness_centrality(_G, k=_k)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_bc_nx(_df, _k):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = cugraph.betweenness_centrality(_G, k=_k)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -334,33 +335,33 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_louvain(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " parts = community.best_partition(_G)\n", " \n", " # Calculating modularity scores for comparison \n", " _ = community.modularity(parts, _G) \n", " \n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_louvain(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _,_ = cugraph.louvain(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_louvain_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _,_ = cugraph.louvain(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -373,12 +374,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_tc(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " nx_count = nx.triangles(_G)\n", " \n", @@ -387,21 +388,21 @@ " for key, value in nx_count.items():\n", " count = count + value \n", " \n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_tc(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _ = cugraph.triangles(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_tc_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = cugraph.triangles(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -414,12 +415,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_wcc(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_digraph(_df)\n", " gen = nx.weakly_connected_components(_G)\n", "\n", @@ -428,21 +429,21 @@ " for subgraph in gen:\n", " list_of_digraphs.append(nx.subgraph(_G, subgraph))\n", " \n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_wcc(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_digraph(_df) \n", " _ = cugraph.weakly_connected_components(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_wcc_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_digraph(_df) \n", " _ = cugraph.weakly_connected_components(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -455,12 +456,12 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_core_num(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " nx_count = nx.core_number(_G)\n", " \n", @@ -468,21 +469,21 @@ " for key, value in nx_count.items():\n", " count = count + value \n", " \n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_core_num(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df) \n", " _ = cugraph.core_number(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_core_num_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df) \n", " _ = cugraph.core_number(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -495,29 +496,29 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_pagerank(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_digraph(_df)\n", " _ = nx.pagerank(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_pagerank(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_digraph(_df)\n", " _ = cugraph.pagerank(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_pagerank_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_digraph(_df)\n", " _ = cugraph.pagerank(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -530,29 +531,30 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_jaccard(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", - " _ = nx.jaccard_coefficient(_G)\n", - " t2 = time.time() - t1\n", + " nj = nx.jaccard_coefficient(_G)\n", + " nj_list = list(nj) # gen -> list\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_jaccard(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _ = cugraph.jaccard_coefficient(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_jaccard_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = cugraph.jaccard_coefficient(_G)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -565,29 +567,30 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_bfs(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", - " _ = nx.bfs_edges(_G, 1)\n", - " t2 = time.time() - t1\n", + " nb = nx.bfs_edges(_G, 1) \n", + " nb_list = list(nb) # gen -> list\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_bfs(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", " _ = cugraph.bfs(_G, 1)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_bfs_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = cugraph.bfs(_G, 1)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, @@ -600,39 +603,32 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_sssp(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = nx.shortest_path(_G, 1)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_sssp(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df) \n", " _ = cugraph.sssp(_G, 1)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_sssp_nx(_df):\n", - " t1 = time.time()\n", + " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df) \n", " _ = cugraph.sssp(_G, 1)\n", - " t2 = time.time() - t1\n", + " t2 = perf_counter() - t1\n", " return t2" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -644,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -654,32 +650,11 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tGDF Size 999970\n", - "\tcugraph Size 499985\n", - "\tcugraph Order 100000\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "# do a simple pass just to get all the libraries initiallized\n", + "# do a simple pass just to get all the libraries initialized\n", "# This cell might not be needed\n", "v = './data/preferentialAttachment.mtx'\n", "gdf = read_data(v)\n", @@ -706,75 +681,6 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tdata in gdf 999970 and data in pandas 999970\n", - "\tKatz n.c.cx.\n", - "\tBC k=100 n. k = 100 c.cx. \n", - "\tLouvain n.c.cx. \n", - "\tTC n.c.cx. \n", - "\tWCC n.c.cx. \n", - "\tCore Number n.c.cx. \n", - "\tPageRank n.c.cx. \n", - "\tJaccard n.c.cx. \n", - "\tBFS n.c.cx. \n", - "\tSSSP n.c.cx. \n", - "Reading ./data/dblp-2010.mtx...\n", - "\tdata in gdf 1615400 and data in pandas 1615400\n", - "\tKatz n.c.cx.\n", - "\tBC k=100 n. k = 100 c.cx. \n", - "\tLouvain n.c.cx. \n", - "\tTC n.c.cx. \n", - "\tWCC n.c.cx. \n", - "\tCore Number n.c.cx. \n", - "\tPageRank n.c.cx. \n", - "\tJaccard n.c.cx. \n", - "\tBFS n.c.cx. \n", - "\tSSSP n.c.cx. \n", - "Reading ./data/coPapersCiteseer.mtx...\n", - "\tdata in gdf 32073440 and data in pandas 32073440\n", - "\tKatz n.c.cx.\n", - "\tBC k=100 n. k = 100 c.cx. \n", - "\tLouvain n.c.cx. \n", - "\tTC n.c.cx. \n", - "\tWCC n.c.cx. \n", - "\tCore Number n.c.cx. \n", - "\tPageRank n.c.cx. \n", - "\tJaccard n.c.cx. \n", - "\tBFS n.c.cx. \n", - "\tSSSP n.c.cx. \n", - "Reading ./data/as-Skitter.mtx...\n", - "\tdata in gdf 22190596 and data in pandas 22190596\n", - "\tKatz n.c.cx.\n", - "\tBC k=100 n. k = 100 c.cx. \n", - "\tLouvain n.c.cx. \n", - "\tTC n.c.cx. \n", - "\tWCC n.c.cx. \n", - "\tCore Number n.c.cx. \n", - "\tPageRank n.c.cx. \n", - "\tJaccard n.c.cx. \n", - "\tBFS n.c.cx. \n", - "\tSSSP n.c.cx. \n" - ] - } - ], "source": [ "# arrays to capture performance gains\n", "names = []\n", @@ -1037,25 +943,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", - "preferentialAttachment\n", - "[531.5083672005737, 713.2091362850375, 5404.871910284401, 378.8714209575697, 70.72927362986779, 76.7855488460584, 369.8407050216162, 100.5242813104882, 4.378275208783683, 162.25090274331285]\n", - "dblp\n", - "[263.7293255857766, 1558.1884974132756, 622.282663375948, 142.59215746942343, 88.19197528607465, 116.20873484788576, 460.3603070425029, 121.2753931555862, 38.357311342936576, 186.59598139534884]\n", - "coPapersCiteseer\n", - "[2270.9739290077137, 2436.608230097977, 1057.486186959562, 2300.0750485569533, 233.7511393615408, 246.97401172398136, 853.279646090366, 112.73241487709193, 233.03646005823012, 267.6295226503849]\n", - "as-Skitter\n", - "[1037.8761480097223, 7091.970778835749, 1475.2901788933452, 3950.5098941991014, 228.11245124984197, 245.35607830599636, 547.8739313855568, 98.81747467270701, 222.20389619850272, 326.73959437931654]\n" - ] - } - ], + "outputs": [], "source": [ "#Print results\n", "print(algos)\n", @@ -1067,28 +957,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "------------\n", - "\n", - "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", - "preferentialAttachment\n", - "[4.003601795825807, 93.08063351361315, 204.47865340368915, 2.7097492953036797, 0.8666907616338123, 1.2867491927399868, 1.9752328393020735, 0.1240993236960286, 0.7203119096547798, 179.41122927863145]\n", - "dblp\n", - "[4.885862057048338, 122.87364779256156, 31.02199520144101, 2.180625966164683, 1.4324289723528034, 1.3579940932619847, 2.348198022642711, 0.11145559203860335, 0.7265996313793216, 202.49957600312277]\n", - "coPapersCiteseer\n", - "[8.158465907417547, 49.369787236543914, 9.28701234947398, 12.067711445592089, 0.8232363804394461, 1.3752921888176353, 2.8151237928186994, 0.08727548257474192, 0.798480184263566, 322.0841686740297]\n", - "as-Skitter\n", - "[3.66123817526995, 631.2091494372795, 20.617572936160165, 34.49437773532841, 0.9264442180418646, 4.828647431829589, 2.2476285215684615, 0.12267649645919085, 0.8469181921567667, 431.6171964493335]\n" - ] - } - ], + "outputs": [], "source": [ "#Print results\n", "print(\"\\n------------\\n\")\n", @@ -1199,10 +1070,13 @@ } ], "metadata": { + "interpreter": { + "hash": "f708a36acfaef0acf74ccd43dfb58100269bf08fb79032a1e0a6f35bd9856f51" + }, "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "Python 3.8.10 ('base')", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1214,7 +1088,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.8.10" } }, "nbformat": 4, From b0dfaea1dd6d7b15d060f42ddd31eb43825d2a74 Mon Sep 17 00:00:00 2001 From: GALI PREM SAGAR Date: Wed, 22 Jun 2022 12:47:46 -0500 Subject: [PATCH 190/384] Switch `language` from `None` to `"en"` in docs build (#2368) Needed for Sphinx 5 compatibility. Should fix the following warning occurring in doc builds. ``` Invalid configuration value found: 'language = None'. Update your configuration to a valid langauge code. Falling back to 'en' (English). ``` xref: https://github.com/sphinx-doc/sphinx/pull/10481 Authors: - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) - Ray Douglass (https://github.com/raydouglass) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2368 --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 02c69f0a5..9833c1bd8 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -90,7 +90,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From 111834110619acb675d14aa7a40638b432b07f83 Mon Sep 17 00:00:00 2001 From: Charles Blackmon-Luca <20627856+charlesbluca@users.noreply.github.com> Date: Wed, 29 Jun 2022 14:28:30 -0400 Subject: [PATCH 191/384] Update multi-GPU example to include data generation (#2345) This PR updates the multi-GPU example in the docs to include input data generation using `rmat`, as well as resolving the missing / unnecessary imports. Authors: - Charles Blackmon-Luca (https://github.com/charlesbluca) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2345 --- docs/cugraph/source/api_docs/dask-cugraph.rst | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst index 4eee5b36a..e671d4666 100644 --- a/docs/cugraph/source/api_docs/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/dask-cugraph.rst @@ -18,36 +18,58 @@ Example .. code-block:: python - from dask.distributed import Client, wait + import dask_cudf + from dask.distributed import Client from dask_cuda import LocalCUDACluster - import cugraph.dask.comms.comms as Comms + + import cugraph import cugraph.dask as dask_cugraph + import cugraph.dask.comms.comms as Comms + from cugraph.generators.rmat import rmat + input_data_path = "input_data.csv" + + # cluster initialization cluster = LocalCUDACluster() client = Client(cluster) Comms.initialize(p2p=True) - # Helper function to set the reader chunk size to automatically get one partition per GPU + # helper function to generate random input data + input_data = rmat( + scale=5, + num_edges=400, + a=0.30, + b=0.65, + c=0.05, + seed=456, + clip_and_flip=False, + scramble_vertex_ids=False, + create_using=None, + ) + input_data.to_csv(input_data_path, index=False) + + # helper function to set the reader chunk size to automatically get one partition per GPU chunksize = dask_cugraph.get_chunksize(input_data_path) - # Multi-GPU CSV reader - e_list = dask_cudf.read_csv(input_data_path, - chunksize = chunksize, - delimiter=' ', - names=['src', 'dst'], - dtype=['int32', 'int32']) + # multi-GPU CSV reader + e_list = dask_cudf.read_csv( + input_data_path, + chunksize=chunksize, + names=['src', 'dst'], + dtype=['int32', 'int32'], + ) - G = cugraph.Graph(directed=True) + # create graph from input data + G = cugraph.DiGraph() G.from_dask_cudf_edgelist(e_list, source='src', destination='dst') - # now run PageRank + # run PageRank pr_df = dask_cugraph.pagerank(G, tol=1e-4) - # All done, clean up + # cluster clean up Comms.destroy() client.close() cluster.close() | - From 76a79f776185dd4557f7be8cf971e1a7d8d0efd0 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Tue, 12 Jul 2022 16:29:14 +0000 Subject: [PATCH 192/384] REL v22.06.01 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index f060f10f6..faf77e1d9 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -83,7 +83,7 @@ # The short X.Y version. version = '22.06' # The full version, including alpha/beta/rc tags. -release = '22.06.00' +release = '22.06.01' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1d572a02bf0fd7b38a06605fd24d3b9bc841ef46 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 22 Jul 2022 10:51:14 -0400 Subject: [PATCH 193/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 9833c1bd8..45bd4d4da 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.08' +version = '22.10' # The full version, including alpha/beta/rc tags. -release = '22.08.00' +release = '22.10.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 39973448f41d06f9d41bead49b86776bb0074ad7 Mon Sep 17 00:00:00 2001 From: Joseph Nke <76006812+jnke2016@users.noreply.github.com> Date: Fri, 29 Jul 2022 08:18:22 -0500 Subject: [PATCH 194/384] Update cugraph python build (#2378) This PR updates cugraph python build to use scikit-build instead of setuptools. Scikit-build leverages cmake to build the python extension closes #2333 Authors: - Joseph Nke (https://github.com/jnke2016) - Chuck Hastings (https://github.com/ChuckHastings) - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - Brad Rees (https://github.com/BradReesWork) - Sevag H (https://github.com/sevagh) - Rick Ratzel (https://github.com/rlratzel) - Vyas Ramasubramani (https://github.com/vyasr) URL: https://github.com/rapidsai/cugraph/pull/2378 --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 44a1471fe..7bd759bbc 100644 --- a/.gitignore +++ b/.gitignore @@ -29,11 +29,15 @@ junit-cugraph.xml test-results ## Python build directories & artifacts +dask-worker-space/ htmlcov dist/ cugraph.egg-info/ python/build python/cugraph/bindings/*.cpp +wheels/ +_skbuild/ +cufile.log ## pylibcugraph build directories & artifacts python/pylibcugraph/pylibcugraph.egg-info From 1d9582d56261efdce55ae673dd2399502a0e703e Mon Sep 17 00:00:00 2001 From: GALI PREM SAGAR Date: Fri, 29 Jul 2022 12:19:23 -0500 Subject: [PATCH 195/384] Fix issues with day & night modes in python docs (#2471) Fixes similar issue found in: https://github.com/rapidsai/cudf/pull/11400/ Authors: - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2471 --- docs/cugraph/source/_static/custom.js | 22 +++++ docs/cugraph/source/_static/custom_styles.css | 89 +++++++++++++++++++ docs/cugraph/source/_static/params.css | 30 ------- docs/cugraph/source/conf.py | 3 +- 4 files changed, 113 insertions(+), 31 deletions(-) create mode 100644 docs/cugraph/source/_static/custom.js create mode 100644 docs/cugraph/source/_static/custom_styles.css delete mode 100644 docs/cugraph/source/_static/params.css diff --git a/docs/cugraph/source/_static/custom.js b/docs/cugraph/source/_static/custom.js new file mode 100644 index 000000000..567a07a7c --- /dev/null +++ b/docs/cugraph/source/_static/custom.js @@ -0,0 +1,22 @@ +// Copyright (c) 2022, NVIDIA CORPORATION. + +function update_switch_theme_button() { + current_theme = document.documentElement.dataset.mode; + if (current_theme == "light") { + document.getElementById("theme-switch").title = "Switch to auto theme"; + } else if (current_theme == "auto") { + document.getElementById("theme-switch").title = "Switch to dark theme"; + } else { + document.getElementById("theme-switch").title = "Switch to light theme"; + } +} + +$(document).ready(function() { + var observer = new MutationObserver(function(mutations) { + update_switch_theme_button(); + }) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme'] + }); +}); diff --git a/docs/cugraph/source/_static/custom_styles.css b/docs/cugraph/source/_static/custom_styles.css new file mode 100644 index 000000000..31db0633f --- /dev/null +++ b/docs/cugraph/source/_static/custom_styles.css @@ -0,0 +1,89 @@ +/* Mirrors the change in: + * https://github.com/sphinx-doc/sphinx/pull/5976 + * which is not showing up in our theme. + */ + .classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +/* Fix for text wrap in sphinx tables: +* https://rackerlabs.github.io/docs-rackspace/tools/rtd-tables.html +*/ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} + + +table.io-supported-types-table { + text-align: center +} + +table.io-supported-types-table thead{ + text-align: center !important; +} + +:root { + +--pst-color-active-navigation: 114, 83, 237; +--pst-color-navbar-link: 77, 77, 77; +--pst-color-navbar-link-hover: var(--pst-color-active-navigation); +--pst-color-navbar-link-active: var(--pst-color-active-navigation); +--pst-color-sidebar-link: 77, 77, 77; +--pst-color-sidebar-link-hover: var(--pst-color-active-navigation); +--pst-color-sidebar-link-active: var(--pst-color-active-navigation); +--pst-color-sidebar-expander-background-hover: 244, 244, 244; +--pst-color-sidebar-caption: 77, 77, 77; +--pst-color-toc-link: 119, 117, 122; +--pst-color-toc-link-hover: var(--pst-color-active-navigation); +--pst-color-toc-link-active: var(--pst-color-active-navigation); + +} + +/* Used to make special-table scrollable when it overflows */ +.special-table-wrapper { + width: 100%; + overflow: auto !important; +} + +.special-table td, .special-table th { + border: 1px solid #dee2e6; +} + +/* Needed to resolve https://github.com/executablebooks/jupyter-book/issues/1611 */ +.output.text_html { + overflow: auto; +} + +html[data-theme="light"] { + --pst-color-primary: rgb(19, 6, 84); + --pst-color-text-base: rgb(51, 51, 51); + + --pst-color-primary: rgb(19, 6, 84); + + --pst-color-link: rgb(0, 91, 129); + --pst-color-secondary: rgb(227, 46, 0); + --pst-table-background-color: transparent; +} + + +html[data-theme="dark"] { + --pst-color-primary: rgb(221, 221, 221); + --pst-color-inline-code: rgb(248, 6, 204); + --pst-table-background-color: var(--pst-color-text-muted); + +} + +div.cell_output table{ + background: var(--pst-table-background-color); +} diff --git a/docs/cugraph/source/_static/params.css b/docs/cugraph/source/_static/params.css deleted file mode 100644 index b57bcdb7c..000000000 --- a/docs/cugraph/source/_static/params.css +++ /dev/null @@ -1,30 +0,0 @@ -/* Mirrors the change in: - * https://github.com/sphinx-doc/sphinx/pull/5976 - * which is not showing up in our theme. - */ -.classifier:before { - font-style: normal; - margin: 0.5em; - content: ":"; -} - -:root { - - --pst-color-active-navigation: 114, 83, 237; - --pst-color-navbar-link: 77, 77, 77; - --pst-color-navbar-link-hover: var(--pst-color-active-navigation); - --pst-color-navbar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-link: 77, 77, 77; - --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); - --pst-color-sidebar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-expander-background-hover: 244, 244, 244; - --pst-color-sidebar-caption: 77, 77, 77; - --pst-color-toc-link: 119, 117, 122; - --pst-color-toc-link-hover: var(--pst-color-active-navigation); - --pst-color-toc-link-active: var(--pst-color-active-navigation); - -} - -.special-table td, .special-table th { - border: 1px solid #dee2e6; -} \ No newline at end of file diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 9833c1bd8..1f6dc19a3 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -212,7 +212,8 @@ def setup(app): - app.add_css_file('params.css') + app.add_css_file('custom_styles.css') + app.add_js_file('custom.js') app.add_css_file('references.css') From 9d287d8d1b60a95b0bb6c9f4d431e74fc6e38653 Mon Sep 17 00:00:00 2001 From: GALI PREM SAGAR Date: Tue, 2 Aug 2022 14:10:00 -0500 Subject: [PATCH 196/384] Centralize common `css` & `js` code in docs (#2472) This PR will utilize the common `css` & `js` code being merged here: https://github.com/rapidsai/docs/pull/286 Authors: - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/2472 --- docs/cugraph/source/_static/custom.js | 22 ----- docs/cugraph/source/_static/custom_styles.css | 89 ------------------- docs/cugraph/source/conf.py | 6 +- 3 files changed, 3 insertions(+), 114 deletions(-) delete mode 100644 docs/cugraph/source/_static/custom.js delete mode 100644 docs/cugraph/source/_static/custom_styles.css diff --git a/docs/cugraph/source/_static/custom.js b/docs/cugraph/source/_static/custom.js deleted file mode 100644 index 567a07a7c..000000000 --- a/docs/cugraph/source/_static/custom.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2022, NVIDIA CORPORATION. - -function update_switch_theme_button() { - current_theme = document.documentElement.dataset.mode; - if (current_theme == "light") { - document.getElementById("theme-switch").title = "Switch to auto theme"; - } else if (current_theme == "auto") { - document.getElementById("theme-switch").title = "Switch to dark theme"; - } else { - document.getElementById("theme-switch").title = "Switch to light theme"; - } -} - -$(document).ready(function() { - var observer = new MutationObserver(function(mutations) { - update_switch_theme_button(); - }) - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ['data-theme'] - }); -}); diff --git a/docs/cugraph/source/_static/custom_styles.css b/docs/cugraph/source/_static/custom_styles.css deleted file mode 100644 index 31db0633f..000000000 --- a/docs/cugraph/source/_static/custom_styles.css +++ /dev/null @@ -1,89 +0,0 @@ -/* Mirrors the change in: - * https://github.com/sphinx-doc/sphinx/pull/5976 - * which is not showing up in our theme. - */ - .classifier:before { - font-style: normal; - margin: 0.5em; - content: ":"; -} - -/* Fix for text wrap in sphinx tables: -* https://rackerlabs.github.io/docs-rackspace/tools/rtd-tables.html -*/ -@media screen and (min-width: 767px) { - - .wy-table-responsive table td { - /* !important prevents the common CSS stylesheets from overriding - this as on RTD they are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - overflow: visible !important; - } -} - - -table.io-supported-types-table { - text-align: center -} - -table.io-supported-types-table thead{ - text-align: center !important; -} - -:root { - ---pst-color-active-navigation: 114, 83, 237; ---pst-color-navbar-link: 77, 77, 77; ---pst-color-navbar-link-hover: var(--pst-color-active-navigation); ---pst-color-navbar-link-active: var(--pst-color-active-navigation); ---pst-color-sidebar-link: 77, 77, 77; ---pst-color-sidebar-link-hover: var(--pst-color-active-navigation); ---pst-color-sidebar-link-active: var(--pst-color-active-navigation); ---pst-color-sidebar-expander-background-hover: 244, 244, 244; ---pst-color-sidebar-caption: 77, 77, 77; ---pst-color-toc-link: 119, 117, 122; ---pst-color-toc-link-hover: var(--pst-color-active-navigation); ---pst-color-toc-link-active: var(--pst-color-active-navigation); - -} - -/* Used to make special-table scrollable when it overflows */ -.special-table-wrapper { - width: 100%; - overflow: auto !important; -} - -.special-table td, .special-table th { - border: 1px solid #dee2e6; -} - -/* Needed to resolve https://github.com/executablebooks/jupyter-book/issues/1611 */ -.output.text_html { - overflow: auto; -} - -html[data-theme="light"] { - --pst-color-primary: rgb(19, 6, 84); - --pst-color-text-base: rgb(51, 51, 51); - - --pst-color-primary: rgb(19, 6, 84); - - --pst-color-link: rgb(0, 91, 129); - --pst-color-secondary: rgb(227, 46, 0); - --pst-table-background-color: transparent; -} - - -html[data-theme="dark"] { - --pst-color-primary: rgb(221, 221, 221); - --pst-color-inline-code: rgb(248, 6, 204); - --pst-table-background-color: var(--pst-color-text-muted); - -} - -div.cell_output table{ - background: var(--pst-table-background-color); -} diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 1f6dc19a3..99f789c94 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -212,9 +212,9 @@ def setup(app): - app.add_css_file('custom_styles.css') - app.add_js_file('custom.js') - app.add_css_file('references.css') + app.add_css_file("https://docs.rapids.ai/assets/css/custom.css") + app.add_js_file("https://docs.rapids.ai/assets/js/custom.js") + app.add_css_file("references.css") source_suffix = ['.rst', '.md'] From 48c9678e197796994a5f8ced15b9efa29b07d4b9 Mon Sep 17 00:00:00 2001 From: GALI PREM SAGAR Date: Thu, 4 Aug 2022 14:39:43 -0500 Subject: [PATCH 197/384] Defer loading of `custom.js` (#2506) This PR switches the loading of `custom.js` to defer because we will need the entire page to be loading until the methods in this script can even execute correctly. xref: https://github.com/rapidsai/cudf/pull/11465 Authors: - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2506 --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 99f789c94..ac4ab5e5d 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -213,7 +213,7 @@ 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") + app.add_js_file("https://docs.rapids.ai/assets/js/custom.js", loading_method="defer") app.add_css_file("references.css") From c30237fe93bf037d5d30a2583883eb29dafc3b4b Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Wed, 7 Sep 2022 09:33:16 -0400 Subject: [PATCH 198/384] Refactor Sampling, Structure and Traversal Notebooks (#2628) - Moves notebooks under algorithms - Adds README's - Tests functionality - Updates format to match other notebooks Fixed doc error in edge_betweenness_centrality call reported in issue #2519 closes #2610 closes #2611 closes #2612 closes #2519 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) - Alex Barghi (https://github.com/alexbarghi-nv) URL: https://github.com/rapidsai/cugraph/pull/2628 --- notebooks/cugraph_benchmarks/release.ipynb | 130 +++++++++++++++------ 1 file changed, 97 insertions(+), 33 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index 4693265d0..8ba3c82eb 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -171,12 +171,12 @@ "\n", "\n", "# TODO: Was set to quick for test\n", - "data = data_quick\n" + "data = data_full\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -194,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -222,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -264,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -299,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -335,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -374,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -415,7 +415,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -456,7 +456,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -496,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -531,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -539,14 +539,13 @@ " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " nj = nx.jaccard_coefficient(_G)\n", - " nj_list = list(nj) # gen -> list\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_jaccard(_df):\n", " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", - " _ = cugraph.jaccard_coefficient(_G)\n", + " _ = list(cugraph.jaccard_coefficient(_G))\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", @@ -567,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -603,7 +602,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -640,7 +639,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -650,9 +649,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tGDF Size 999970\n", + "\tcugraph Size 499985\n", + "\tcugraph Order 100000\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# do a simple pass just to get all the libraries initialized\n", "# This cell might not be needed\n", @@ -678,9 +698,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading ./data/preferentialAttachment.mtx...\n", + "\tdata in gdf 999970 and data in pandas 999970\n", + "\tKatz n.c.cx.\n", + "\tBC k=100 n. k = 100 c.cx. \n", + "\tLouvain n.c.cx. \n", + "\tTC n.c.cx. \n", + "\tWCC n.c.cx. \n", + "\tCore Number n.c.cx. \n", + "\tPageRank n.c.cx. \n", + "\tJaccard n.c.cx. \n", + "\tBFS n.c.cx. \n", + "\tSSSP n.c.cx. \n" + ] + } + ], "source": [ "# arrays to capture performance gains\n", "names = []\n", @@ -943,9 +982,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", + "preferentialAttachment\n", + "[145.30643917185208, 236.64781352415596, 4385.897320647833, 135.74325850737782, 34.89773706999491, 35.98962606492319, 148.4826107413348, 34.04823126698779, 41.64064391168044, 39.70684495453922]\n" + ] + } + ], "source": [ "#Print results\n", "print(algos)\n", @@ -957,9 +1006,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "------------\n", + "\n", + "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", + "preferentialAttachment\n", + "[3.4762573984859073, 36.25720333229164, 134.55004466061635, 2.4608888173507344, 0.9039513041939133, 1.117330592113951, 2.4959144857253164, 0.09156219712459993, 1.006714469868979, 41.36659009325271]\n" + ] + } + ], "source": [ "#Print results\n", "print(\"\\n------------\\n\")\n", @@ -1070,11 +1132,8 @@ } ], "metadata": { - "interpreter": { - "hash": "f708a36acfaef0acf74ccd43dfb58100269bf08fb79032a1e0a6f35bd9856f51" - }, "kernelspec": { - "display_name": "Python 3.8.10 ('base')", + "display_name": "Python 3.9.13 ('cugraph_dev')", "language": "python", "name": "python3" }, @@ -1088,7 +1147,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.9.13" + }, + "vscode": { + "interpreter": { + "hash": "cee8a395f2f0c5a5bcf513ae8b620111f4346eff6dc64e1ea99c951b2ec68604" + } } }, "nbformat": 4, From dbc29df69e11d57fefb42b591b1d66b0cf8719a4 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Mon, 12 Sep 2022 08:56:33 -0400 Subject: [PATCH 199/384] Removed reference to hard limit of 2 billion vertices for dask cugraph (#2680) Closes #2476 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2680 --- docs/cugraph/source/api_docs/dask-cugraph.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/dask-cugraph.rst index e671d4666..772d3abc4 100644 --- a/docs/cugraph/source/api_docs/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/dask-cugraph.rst @@ -2,7 +2,7 @@ Multi-GPU with cuGraph ~~~~~~~~~~~~~~~~~~~~~~ -cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. The maximum graph size is currently limited to 2 Billion vertices (to be waived in the next versions). +cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. Distributed graph analytics =========================== From b1b11e7ef52048ea5a32d1b9e36b6f9389a86a33 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Mon, 12 Sep 2022 09:35:49 -0400 Subject: [PATCH 200/384] updated list of conferences (#2672) closes #2664 Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2672 --- docs/cugraph/source/basics/cugraph_blogs.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/basics/cugraph_blogs.rst index 4d5447879..2d3e751a4 100644 --- a/docs/cugraph/source/basics/cugraph_blogs.rst +++ b/docs/cugraph/source/basics/cugraph_blogs.rst @@ -39,10 +39,8 @@ BLOGS & Conferences 2022 ------ * `GTC: State of cuGraph (video & slides) `_ - * `GTC: Scaling and Validating Louvain in cuGraph against Massive Graphs (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 `_ Media @@ -59,12 +57,16 @@ Academic Papers * 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). + * Alex Fender, Brad Rees, Joe Eaton (2022) `Massive Graph Analytics `_ Bader, D. (Editor) CRC Press Other BLOGS ======================== -* `4 graph algorithms on steroids for data scientists with cugraph - `_ +* `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 `_ + + From 2259787660fa427baed8892200df29b60b0f984f Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Thu, 22 Sep 2022 11:16:17 -0400 Subject: [PATCH 201/384] adds mechanism to skip notebook directories for different run types (#2693) closes #2622 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/2693 --- notebooks/cugraph_benchmarks/SKIP_CI_TESTING | 0 notebooks/demo/SKIP_CI_TESTING | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 notebooks/cugraph_benchmarks/SKIP_CI_TESTING create mode 100644 notebooks/demo/SKIP_CI_TESTING diff --git a/notebooks/cugraph_benchmarks/SKIP_CI_TESTING b/notebooks/cugraph_benchmarks/SKIP_CI_TESTING new file mode 100644 index 000000000..e69de29bb diff --git a/notebooks/demo/SKIP_CI_TESTING b/notebooks/demo/SKIP_CI_TESTING new file mode 100644 index 000000000..e69de29bb From 694ec7df3b25de1c4409295a072bd5cb59532353 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 23 Sep 2022 11:37:24 -0400 Subject: [PATCH 202/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 05def8649..e0552e3d7 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.10' +version = '22.12' # The full version, including alpha/beta/rc tags. -release = '22.10.00' +release = '22.12.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From ff19c461013294b2a154c818d36df02e1128a4de Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Fri, 23 Sep 2022 13:45:52 -0400 Subject: [PATCH 203/384] fix Comms import (#2717) closes #2563 Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2717 --- notebooks/demo/mg_pagerank.ipynb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index db1f69ccb..7c32c0520 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -43,7 +43,7 @@ "# Import needed libraries. We recommend using cugraph_dev env through conda\n", "from dask.distributed import Client, wait\n", "from dask_cuda import LocalCUDACluster\n", - "import cugraph.comms as Comms\n", + "from cugraph.dask.comms import comms as Comms\n", "import cugraph.dask as dask_cugraph\n", "import cugraph\n", "import dask_cudf\n", @@ -162,7 +162,7 @@ "outputs": [], "source": [ "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", - "G = cugraph.DiGraph()\n", + "G = cugraph.Graph(directed=True)\n", "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst')\n", "\n", "# Print time\n", @@ -295,9 +295,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "cugraph_dev", "language": "python", - "name": "python3" + "name": "cugraph_dev" }, "language_info": { "codemirror_mode": { @@ -309,7 +309,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.9.13" } }, "nbformat": 4, From 726e459623136577df6dbe551bf9594fc939f873 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:55:46 -0400 Subject: [PATCH 204/384] Adding new classes to api docs (#2754) updating api docs for new classes Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2754 --- docs/cugraph/source/api_docs/community.rst | 2 +- docs/cugraph/source/api_docs/graph_implementation.rst | 4 ---- docs/cugraph/source/api_docs/sampling.rst | 2 +- docs/cugraph/source/api_docs/structure.rst | 1 + 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/community.rst index d35ac657f..94eb1a49c 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/community.rst @@ -77,4 +77,4 @@ Triangle Counting .. autosummary:: :toctree: api/ - cugraph.triangles + cugraph.triangle_count diff --git a/docs/cugraph/source/api_docs/graph_implementation.rst b/docs/cugraph/source/api_docs/graph_implementation.rst index e96c49c91..9d67c21c6 100644 --- a/docs/cugraph/source/api_docs/graph_implementation.rst +++ b/docs/cugraph/source/api_docs/graph_implementation.rst @@ -16,10 +16,6 @@ Graph Implementation delete_adj_list enable_batch - batch_adjlists - batch_edgelists - batch_enabled - batch_transposed_adjlists get_two_hop_neighbors number_of_vertices diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/sampling.rst index 8a6cc5f22..bab8aee6b 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/sampling.rst @@ -12,7 +12,7 @@ Random Walks cugraph.random_walks cugraph.ego_graph - cugraph.experimental.dask.uniform_neighborhood_sampling + cugraph.uniform_neighbor_sample Node2Vec --------- diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index 04e836ff3..ab097156c 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -13,6 +13,7 @@ Constructors BiPartiteGraph + Adding Data ----------- .. autosummary:: From e42938554f1cf2f355b0f5c0f9212876ed59ba0c Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Wed, 12 Oct 2022 17:56:42 +0000 Subject: [PATCH 205/384] REL v22.10.00 release From 8411283c2bd770c914f9fbebb63df5f7378a36c0 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 12 Oct 2022 14:56:01 -0500 Subject: [PATCH 206/384] Format Python code with black (#2778) closes https://github.com/rapidsai/cugraph/issues/2527 I also added `.pre-commit-config.yaml` to make this easier to use and match versions (for example, I kept using a newer flake8 locally). This uses the versions of black and flake8 that are in the `rapids` environment in the docker container. There's a lot more we can do with pre-commit, but I didn't want to be overzealous in this PR. _After_ this PR is merged, we should add a `.git-blame-ignore-revs` file so that I won't get blamed for everything :) . See: - https://black.readthedocs.io/en/stable/guides/introducing_black_to_your_project.html#avoiding-ruining-git-blame - https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#ignore-commits-in-the-blame-view Once this is merged, existing PRs should probably run `black` (version 22.3.0) on their branch before merging 22.12 branch into their branch. **This changes the maximum line length to 88, which is the default for black** Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/2778 --- .pre-commit-config.yaml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..61d21fcba --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,31 @@ +## https://pre-commit.com/ +# +# Before first use: `pre-commit install` +# To run: `pre-commit run --all-files` +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-added-large-files + - id: debug-statements + - id: mixed-line-ending + - repo: https://github.com/psf/black + rev: 22.3.0 + hooks: + - id: black + language_version: python3 + exclude: versioneer.py + args: [--target-version=py38] + files: ^python/ + - repo: https://github.com/PyCQA/flake8 + rev: 3.8.4 + hooks: + - id: flake8 + args: [--config=python/.flake8] + files: ^python/ + - repo: https://github.com/asottile/yesqa + rev: v1.3.0 + hooks: + - id: yesqa + additional_dependencies: + - flake8==3.8.4 From d025a53e591986487388b3e7ed34ded980eb0229 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:52:43 -0400 Subject: [PATCH 207/384] Updated Release Notebook for changes in latest cuGraph release (#2800) - [X] Changed call to triangle count algorithm - [x] Added transpose parameter to graph building - [x] Fixed handling of small graphs (only used for testing) closes #2790 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2800 --- notebooks/cugraph_benchmarks/release.ipynb | 167 ++++++++------------- 1 file changed, 60 insertions(+), 107 deletions(-) diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb index 8ba3c82eb..32265684a 100644 --- a/notebooks/cugraph_benchmarks/release.ipynb +++ b/notebooks/cugraph_benchmarks/release.ipynb @@ -91,6 +91,7 @@ "| Brad Rees | 01/20/2022 | updated | 22.02 | Quadro A6000 CUDA 11.5 |\n", "| Brad Rees | 01/20/2022 | added perf w/Nx obj | 22.02 | Quadro A6000 CUDA 11.5 |\n", "| Ralph Liu | 06/01/2022 | Fix: Generators | 22.06 | Tesla V100, CUDA 11.5 |\n", + "| Don Acosta | 10/12/2022 | Fix triangles and transposed graphs | 22.12 nightly | Tesla A6000, CUDA 11.5 |\n", "\n", "\n", "\n" @@ -105,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -165,8 +166,8 @@ "\n", "# for quick testing\n", "data_quick = {\n", - " 'preferentialAttachment' : './data/preferentialAttachment.mtx', \n", - " #'karate' : './data/karate.mtx',\n", + " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n", + " #'karate' : './data/karate.mtx',\n", "}\n", "\n", "\n", @@ -176,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -194,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -222,29 +223,45 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# NetworkX\n", "def create_nx_digraph(_df):\n", - " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n", + " _gnx = nx.from_pandas_edgelist(_df,\n", + " source='src',\n", + " target='dst',\n", + " edge_attr=None,\n", + " create_using=nx.DiGraph)\n", " return _gnx\n", "\n", "def create_nx_ugraph(_df):\n", - " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.Graph)\n", + " _gnx = nx.from_pandas_edgelist(_df,\n", + " source='src',\n", + " target='dst',\n", + " edge_attr=None,\n", + " create_using=nx.Graph)\n", " return _gnx\n", "\n", "\n", "# cuGraph\n", - "def create_cu_digraph(_df):\n", + "def create_cu_digraph(_df, transpose=False):\n", " _g = cugraph.Graph(directed=True)\n", - " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", + " _g.from_cudf_edgelist(_df,\n", + " source='src',\n", + " destination='dst',\n", + " renumber=False,\n", + " store_transposed=transpose)\n", " return _g\n", "\n", - "def create_cu_ugraph(_df):\n", + "def create_cu_ugraph(_df,transpose=False):\n", " _g = cugraph.Graph(directed=False)\n", - " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n", + " _g.from_cudf_edgelist(_df,\n", + " source='src',\n", + " destination='dst',\n", + " renumber=False,\n", + " store_transposed=transpose)\n", " return _g" ] }, @@ -264,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -277,7 +294,7 @@ "\n", "def cu_katz(_df, alpha):\n", " t1 = perf_counter()\n", - " _G = create_cu_ugraph(_df)\n", + " _G = create_cu_ugraph(_df, transpose=True)\n", " _ = cugraph.katz_centrality(_G, alpha)\n", " t2 = perf_counter() - t1\n", " return t2\n", @@ -299,12 +316,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def nx_bc(_df, _k):\n", - " print(f\" k = {_k}\", end=' ')\n", " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", " _ = nx.betweenness_centrality(_G, k=_k)\n", @@ -335,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -374,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -394,14 +410,14 @@ "def cu_tc(_df):\n", " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", - " _ = cugraph.triangles(_G)\n", + " _ = cugraph.triangle_count(_G)\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", "def cu_tc_nx(_df):\n", " t1 = perf_counter()\n", " _G = create_nx_ugraph(_df)\n", - " _ = cugraph.triangles(_G)\n", + " _ = cugraph.triangle_count(_G)\n", " t2 = perf_counter() - t1\n", " return t2" ] @@ -415,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -456,7 +472,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -496,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -509,7 +525,7 @@ "\n", "def cu_pagerank(_df):\n", " t1 = perf_counter()\n", - " _G = create_cu_digraph(_df)\n", + " _G = create_cu_digraph(_df, transpose=True)\n", " _ = cugraph.pagerank(_G)\n", " t2 = perf_counter() - t1\n", " return t2\n", @@ -531,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -545,7 +561,7 @@ "def cu_jaccard(_df):\n", " t1 = perf_counter()\n", " _G = create_cu_ugraph(_df)\n", - " _ = list(cugraph.jaccard_coefficient(_G))\n", + " _ = cugraph.jaccard_coefficient(_G)\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", @@ -566,7 +582,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -602,7 +618,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -639,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -649,30 +665,9 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tGDF Size 999970\n", - "\tcugraph Size 499985\n", - "\tcugraph Order 100000\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# do a simple pass just to get all the libraries initialized\n", "# This cell might not be needed\n", @@ -698,28 +693,9 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading ./data/preferentialAttachment.mtx...\n", - "\tdata in gdf 999970 and data in pandas 999970\n", - "\tKatz n.c.cx.\n", - "\tBC k=100 n. k = 100 c.cx. \n", - "\tLouvain n.c.cx. \n", - "\tTC n.c.cx. \n", - "\tWCC n.c.cx. \n", - "\tCore Number n.c.cx. \n", - "\tPageRank n.c.cx. \n", - "\tJaccard n.c.cx. \n", - "\tBFS n.c.cx. \n", - "\tSSSP n.c.cx. \n" - ] - } - ], + "outputs": [], "source": [ "# arrays to capture performance gains\n", "names = []\n", @@ -792,8 +768,7 @@ "\n", " k = 100\n", " if k > num_nodes:\n", - " k = num_nodes\n", - " \n", + " k = int(num_nodes)\n", " print(\"n.\", end='')\n", " tx = nx_bc(pdf, k)\n", " print(\"c.\", end='')\n", @@ -976,25 +951,16 @@ " gc.collect()\n", "\n", " # increament count\n", + " \n", " i = i + 1\n", "\n" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", - "preferentialAttachment\n", - "[145.30643917185208, 236.64781352415596, 4385.897320647833, 135.74325850737782, 34.89773706999491, 35.98962606492319, 148.4826107413348, 34.04823126698779, 41.64064391168044, 39.70684495453922]\n" - ] - } - ], + "outputs": [], "source": [ "#Print results\n", "print(algos)\n", @@ -1006,22 +972,9 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "------------\n", - "\n", - "[' ', 'Katz', 'BC Estimate fixed', 'Louvain', 'TC', 'WCC', 'Core Number', 'PageRank', 'Jaccard', 'BFS', 'SSP']\n", - "preferentialAttachment\n", - "[3.4762573984859073, 36.25720333229164, 134.55004466061635, 2.4608888173507344, 0.9039513041939133, 1.117330592113951, 2.4959144857253164, 0.09156219712459993, 1.006714469868979, 41.36659009325271]\n" - ] - } - ], + "outputs": [], "source": [ "#Print results\n", "print(\"\\n------------\\n\")\n", @@ -1036,7 +989,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## The following section is to rerun portions of the benchamrks if needed" + "## The following section is to rerun portions of the benchmarks if needed" ] }, { @@ -1122,7 +1075,7 @@ "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2022, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -1151,7 +1104,7 @@ }, "vscode": { "interpreter": { - "hash": "cee8a395f2f0c5a5bcf513ae8b620111f4346eff6dc64e1ea99c951b2ec68604" + "hash": "5ad9d2119cd61fde5a45f3586cbfbdeb97f4ed8f77c9b94c9482dc6d8640b46a" } } }, From e23e2c4e12a431ace2a3a42af3588963c931e2f5 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 25 Oct 2022 09:05:23 -0400 Subject: [PATCH 208/384] removed docs from cugraph build defaults and updated docs clean (#2831) removed docs from default cugraph build behavior added additional generated directory to docs clean target closes #2789 closes #2812 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2831 --- docs/cugraph/Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/cugraph/Makefile b/docs/cugraph/Makefile index 330c06bed..32237aa2c 100644 --- a/docs/cugraph/Makefile +++ b/docs/cugraph/Makefile @@ -9,11 +9,16 @@ SOURCEDIR = source BUILDDIR = build IMGDIR = images +gen_doc_dirs = build source/api_docs/api # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -.PHONY: help Makefile +.PHONY: help Makefile clean + +# clean to remove all the generated documentation files in build and source +clean: + rm -rf $(gen_doc_dirs) # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). From f7a874ff07debcf691802f0dfe695a4c9dcf022d Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:41:47 -0400 Subject: [PATCH 209/384] Create a page on why we do not support cascading (#2842) Created a markdown file that explains the cuGraph stance on method cascading. This is in response to both issues, direct messages, and stack overflow questions. It might be easier to review the page by looking at: https://github.com/BradReesWork/cugraph/blob/22.12-cascade-doc/docs/cugraph/source/basics/cugraph_cascading.md Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Don Acosta (https://github.com/acostadon) URL: https://github.com/rapidsai/cugraph/pull/2842 --- .../source/basics/cugraph_cascading.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/cugraph/source/basics/cugraph_cascading.md diff --git a/docs/cugraph/source/basics/cugraph_cascading.md b/docs/cugraph/source/basics/cugraph_cascading.md new file mode 100644 index 000000000..7795e9e00 --- /dev/null +++ b/docs/cugraph/source/basics/cugraph_cascading.md @@ -0,0 +1,53 @@ + +# 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() +``` From 2a40977fb0ee6a297f2a25c8ac290b614d5f9399 Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 4 Nov 2022 19:51:53 +0000 Subject: [PATCH 210/384] REL v22.10.01 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 05def8649..8edee0af7 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -83,7 +83,7 @@ # The short X.Y version. version = '22.10' # The full version, including alpha/beta/rc tags. -release = '22.10.00' +release = '22.10.01' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 9d0ec692e7cf394414bb796e27d06812fb61221a Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 10 Nov 2022 12:57:22 -0500 Subject: [PATCH 211/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index e0552e3d7..a9e3e2d6c 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '22.12' +version = '23.02' # The full version, including alpha/beta/rc tags. -release = '22.12.00' +release = '23.02.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 4052151347fd6e32223a5f7e6bd369b50464a470 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:56:07 -0500 Subject: [PATCH 212/384] Add ProperyGraph to doc generation and update docstrings (#2826) closes #2683 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/2826 --- .../source/api_docs/graph_implementation.rst | 2 +- docs/cugraph/source/api_docs/index.rst | 1 + .../source/api_docs/property_graph.rst | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 docs/cugraph/source/api_docs/property_graph.rst diff --git a/docs/cugraph/source/api_docs/graph_implementation.rst b/docs/cugraph/source/api_docs/graph_implementation.rst index 9d67c21c6..f6dc38a27 100644 --- a/docs/cugraph/source/api_docs/graph_implementation.rst +++ b/docs/cugraph/source/api_docs/graph_implementation.rst @@ -5,7 +5,7 @@ Graph Implementation Graph Implementation -------------------------- +-------------------- .. autosummary:: :toctree: api/ diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index e7f94d7e1..aca8e0eff 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -11,6 +11,7 @@ This page provides a list of all publicly accessible modules, methods and classe structure graph_implementation + property_graph centrality community components diff --git a/docs/cugraph/source/api_docs/property_graph.rst b/docs/cugraph/source/api_docs/property_graph.rst new file mode 100644 index 000000000..ce1901d42 --- /dev/null +++ b/docs/cugraph/source/api_docs/property_graph.rst @@ -0,0 +1,29 @@ +==================== +Property Graph +==================== +.. currentmodule:: cugraph.structure.property_graph + + +Property Graph +------------------------- +.. autosummary:: + :toctree: api/ + + EXPERIMENTAL__PropertySelection + EXPERIMENTAL__PropertyGraph + EXPERIMENTAL__PropertyGraph.add_edge_data + EXPERIMENTAL__PropertyGraph.add_vertex_data + EXPERIMENTAL__PropertyGraph.annotate_dataframe + EXPERIMENTAL__PropertyGraph.edge_props_to_graph + EXPERIMENTAL__PropertyGraph.extract_subgraph + EXPERIMENTAL__PropertyGraph.get_edge_data + EXPERIMENTAL__PropertyGraph.get_num_edges + EXPERIMENTAL__PropertyGraph.get_num_vertices + EXPERIMENTAL__PropertyGraph.get_vertex_data + EXPERIMENTAL__PropertyGraph.get_vertices + EXPERIMENTAL__PropertyGraph.has_duplicate_edges + EXPERIMENTAL__PropertyGraph.is_multigraph + EXPERIMENTAL__PropertyGraph.renumber_edges_by_type + EXPERIMENTAL__PropertyGraph.renumber_vertices_by_type + EXPERIMENTAL__PropertyGraph.select_edges + EXPERIMENTAL__PropertyGraph.select_vertices \ No newline at end of file From d4670b1fc9d2fb16b0e58b9960f6eebfe74f6ca2 Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:23:49 -0500 Subject: [PATCH 213/384] Update gitignore to Exclude Egg Files (#2948) Resolves #2947 Excludes egg files from git. Previously, only egg files in a certain directory were excluded. This broadens the exclusion to the whole repository. Authors: - Alex Barghi (https://github.com/alexbarghi-nv) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/2948 --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7bd759bbc..a5a375667 100644 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,7 @@ test-results dask-worker-space/ htmlcov dist/ -cugraph.egg-info/ +*.egg-info/ python/build python/cugraph/bindings/*.cpp wheels/ From c508c65b9486336a9950f51699fe4a394ca6f690 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Mon, 28 Nov 2022 19:58:36 -0500 Subject: [PATCH 214/384] cuGraph Readme pages and Documentation API structure refactoring (#2894) Refactoring the API and adding new landing pages for each cuGraph component Please just go to: https://github.com/acostadon/cugraph/tree/README_issue_2663 to visualize the changes closes #2663 Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) - Vibhu Jawa (https://github.com/VibhuJawa) - Alex Barghi (https://github.com/alexbarghi-nv) Approvers: - Brad Rees (https://github.com/BradReesWork) - Taurean Dyer (https://github.com/taureandyernv) URL: https://github.com/rapidsai/cugraph/pull/2894 --- docs/cugraph/source/basics/cugraph_blogs.rst | 55 +++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/basics/cugraph_blogs.rst index 2d3e751a4..368dbcce4 100644 --- a/docs/cugraph/source/basics/cugraph_blogs.rst +++ b/docs/cugraph/source/basics/cugraph_blogs.rst @@ -1,5 +1,5 @@ -cuGraph BLOGS and Presentations +cuGraph Blogs and Presentations ************************************************ The RAPIDS team blogs at https://medium.com/rapids-ai, and many of @@ -7,21 +7,17 @@ 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 +Blogs & Conferences ==================== -2018 -------- - * `GTC18 Fall - RAPIDS: Benchmarking Graph Analytics on the DGX-2 `_ - +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 `_ -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 `_ +2021 +------ + * `GTC 21 - State of RAPIDS cuGraph and what's comming next `_ 2020 ------ @@ -31,16 +27,19 @@ BLOGS & Conferences * `Large Graph Visualization with RAPIDS cuGraph `_ * `GTC 20 Fall - cuGraph Goes Big `_ -2021 ------- - * `GTC 21 - State of RAPIDS cuGraph and what's comming next `_ +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 `_ -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 `_ Media @@ -51,16 +50,16 @@ Media Academic Papers =============== + * 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). - * Alex Fender, Brad Rees, Joe Eaton (2022) `Massive Graph Analytics `_ Bader, D. (Editor) CRC Press - -Other BLOGS +Other Blogs ======================== * `4 graph algorithms on steroids for data scientists with cugraph `_ * `Where should I walk `_ @@ -69,4 +68,8 @@ Other BLOGS * `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 `_ From 55f40abd2ea0cf36d6cc2bff11b686e281f64f0e Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 30 Nov 2022 13:06:53 -0600 Subject: [PATCH 215/384] Updates experimental warning wrapper and PropertyGraph docs for correct experimental namespace name (#3007) closes #3006 * Updated experimental warning wrapper to also pass-through __doc__ attr * Updated PropertyGraph doc .rst file to use the proper experimental namespace. Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3007 --- .../source/api_docs/property_graph.rst | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/cugraph/source/api_docs/property_graph.rst b/docs/cugraph/source/api_docs/property_graph.rst index ce1901d42..f3653c085 100644 --- a/docs/cugraph/source/api_docs/property_graph.rst +++ b/docs/cugraph/source/api_docs/property_graph.rst @@ -1,7 +1,7 @@ ==================== Property Graph ==================== -.. currentmodule:: cugraph.structure.property_graph +.. currentmodule:: cugraph.experimental Property Graph @@ -9,21 +9,21 @@ Property Graph .. autosummary:: :toctree: api/ - EXPERIMENTAL__PropertySelection - EXPERIMENTAL__PropertyGraph - EXPERIMENTAL__PropertyGraph.add_edge_data - EXPERIMENTAL__PropertyGraph.add_vertex_data - EXPERIMENTAL__PropertyGraph.annotate_dataframe - EXPERIMENTAL__PropertyGraph.edge_props_to_graph - EXPERIMENTAL__PropertyGraph.extract_subgraph - EXPERIMENTAL__PropertyGraph.get_edge_data - EXPERIMENTAL__PropertyGraph.get_num_edges - EXPERIMENTAL__PropertyGraph.get_num_vertices - EXPERIMENTAL__PropertyGraph.get_vertex_data - EXPERIMENTAL__PropertyGraph.get_vertices - EXPERIMENTAL__PropertyGraph.has_duplicate_edges - EXPERIMENTAL__PropertyGraph.is_multigraph - EXPERIMENTAL__PropertyGraph.renumber_edges_by_type - EXPERIMENTAL__PropertyGraph.renumber_vertices_by_type - EXPERIMENTAL__PropertyGraph.select_edges - EXPERIMENTAL__PropertyGraph.select_vertices \ No newline at end of file + PropertySelection + PropertyGraph + PropertyGraph.add_edge_data + PropertyGraph.add_vertex_data + PropertyGraph.annotate_dataframe + PropertyGraph.edge_props_to_graph + PropertyGraph.extract_subgraph + PropertyGraph.get_edge_data + PropertyGraph.get_num_edges + PropertyGraph.get_num_vertices + PropertyGraph.get_vertex_data + PropertyGraph.get_vertices + PropertyGraph.has_duplicate_edges + PropertyGraph.is_multigraph + PropertyGraph.renumber_edges_by_type + PropertyGraph.renumber_vertices_by_type + PropertyGraph.select_edges + PropertyGraph.select_vertices From 7827cb2cf0dabfb623509d4647a8c8127eb4c86d Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Wed, 30 Nov 2022 11:49:06 -0800 Subject: [PATCH 216/384] Add wheel builds (#2964) This PR adds wheel building to cugraph. Also resolves #3004. Authors: - Vyas Ramasubramani (https://github.com/vyasr) - Sevag H (https://github.com/sevagh) - Paul Taylor (https://github.com/trxcllnt) Approvers: - Joseph (https://github.com/jolorunyomi) - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/2964 --- .gitignore | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a5a375667..530ccffca 100644 --- a/.gitignore +++ b/.gitignore @@ -36,17 +36,18 @@ dist/ python/build python/cugraph/bindings/*.cpp wheels/ +wheelhouse/ _skbuild/ cufile.log ## pylibcugraph build directories & artifacts python/pylibcugraph/pylibcugraph.egg-info - + ## Patching *.diff *.orig *.rej - + ## C++ build directories & artifacts CMakeFiles/ Debug @@ -54,7 +55,7 @@ build/ cpp/build/ cpp/include/cugraph/ipc_generated/*.h cpp/thirdparty/googletest/ - + ## Eclipse IDE .project .cproject @@ -92,4 +93,3 @@ python/cugraph/cugraph/tests/dask-worker-space # Sphinx docs & build artifacts docs/cugraph/source/api_docs/api/* - From 07911e0bbaaeba9ae1fe1d58b0f705f8ab2a750d Mon Sep 17 00:00:00 2001 From: gpuCI <38199262+GPUtester@users.noreply.github.com> Date: Fri, 9 Dec 2022 18:15:23 +0000 Subject: [PATCH 217/384] REL v22.12.00 release From a611453b8283b92e4c962b2cabfaf90bc78a1a0d Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Mon, 12 Dec 2022 19:23:52 -0500 Subject: [PATCH 218/384] redo cuGraph main docs (#3060) closes #2877 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3060 --- docs/cugraph/source/api_docs/c_and_cpp.rst | 4 ++ docs/cugraph/source/api_docs/cugraph_dgl.rst | 14 +++++++ docs/cugraph/source/api_docs/cugraph_pyg.rst | 13 ++++++ .../api_docs/cugraph_service_client.rst | 21 ++++++++++ .../api_docs/cugraph_service_server.rst | 13 ++++++ docs/cugraph/source/api_docs/cugraph_top.rst | 25 ++++++++++++ docs/cugraph/source/api_docs/index.rst | 27 ++++--------- docs/cugraph/source/api_docs/pylibcugraph.rst | 6 +-- docs/cugraph/source/basics/coming_soon.md | 6 +++ docs/cugraph/source/basics/cugraph_toc.md | 13 ++++++ docs/cugraph/source/images/Stack2.png | Bin 0 -> 457436 bytes docs/cugraph/source/index.rst | 38 ++++++++++++++++-- 12 files changed, 154 insertions(+), 26 deletions(-) create mode 100644 docs/cugraph/source/api_docs/c_and_cpp.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_dgl.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_pyg.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_service_client.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_service_server.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_top.rst create mode 100644 docs/cugraph/source/basics/coming_soon.md create mode 100644 docs/cugraph/source/basics/cugraph_toc.md create mode 100644 docs/cugraph/source/images/Stack2.png diff --git a/docs/cugraph/source/api_docs/c_and_cpp.rst b/docs/cugraph/source/api_docs/c_and_cpp.rst new file mode 100644 index 000000000..a3a88e8f6 --- /dev/null +++ b/docs/cugraph/source/api_docs/c_and_cpp.rst @@ -0,0 +1,4 @@ +CuGraph C and C++ API Links +=========================== + +`CuGraph C and C++ API <../basics/coming_soon.md>`_ \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph_dgl.rst new file mode 100644 index 000000000..f1f508754 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_dgl.rst @@ -0,0 +1,14 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-dgl API Refrerence +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +cugraph-dgl + +.. currentmodule:: cugraph_dgl + +Methods +------- +.. autosummary:: + :toctree: api/ + + cugraph_dgl.cugraph_storage_from_heterograph diff --git a/docs/cugraph/source/api_docs/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph_pyg.rst new file mode 100644 index 000000000..0184a4a07 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_pyg.rst @@ -0,0 +1,13 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-pyg API Reference +~~~~~~~~~~~~~~~~~~~~~~~~~ + +cugraph-pyg + +.. currentmodule:: cugraph_pyg + +.. autosummary:: + :toctree: api/ + + cugraph_pyg.loader.dispatch.call_cugraph_algorithm + cugraph_pyg.sampler.EXPERIMENTAL__CuGraphSampler diff --git a/docs/cugraph/source/api_docs/cugraph_service_client.rst b/docs/cugraph/source/api_docs/cugraph_service_client.rst new file mode 100644 index 000000000..8947bc83b --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_service_client.rst @@ -0,0 +1,21 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-service-client API Reference +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +cugraph-service + +.. currentmodule:: cugraph-service + +.. autosummary:: + :toctree: api/ + + cugraph_service_client.client.RunAsyncioThread + cugraph_service_client.cugraph_service_thrift + cugraph_service_client.defaults + cugraph_service_client.exceptions + cugraph_service_client.remote_graph_utils + cugraph_service_client.remote_graph + cugraph_service_client.types + + + diff --git a/docs/cugraph/source/api_docs/cugraph_service_server.rst b/docs/cugraph/source/api_docs/cugraph_service_server.rst new file mode 100644 index 000000000..7e90759ef --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_service_server.rst @@ -0,0 +1,13 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-service-server API Reference +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +cugraph-service + +.. currentmodule:: cugraph-service + +.. autosummary:: + :toctree: api/ + + cugraph_service_server.cugraph_handler + diff --git a/docs/cugraph/source/api_docs/cugraph_top.rst b/docs/cugraph/source/api_docs/cugraph_top.rst new file mode 100644 index 000000000..1b920a841 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_top.rst @@ -0,0 +1,25 @@ +~~~~~~~~~~~~~~~~~~~~~ +cugraph API Reference +~~~~~~~~~~~~~~~~~~~~~ + +.. toctree:: + :maxdepth: 2 + :caption: API Documentation + + structure + graph_implementation + property_graph + centrality + community + components + cores + layout + linear_assignment + link_analysis + link_prediction + sampling + traversal + tree + generator + helper_functions + dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index aca8e0eff..a8d025451 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -1,5 +1,4 @@ -============= -API reference +Python API reference ============= This page provides a list of all publicly accessible modules, methods and classes through @@ -7,23 +6,11 @@ This page provides a list of all publicly accessible modules, methods and classe .. toctree:: :maxdepth: 2 - :caption: API Documentation + :caption: Python API Documentation - structure - graph_implementation - property_graph - centrality - community - components - cores - layout - linear_assignment - link_analysis - link_prediction - sampling - traversal - tree - generator - helper_functions - dask-cugraph.rst + cugraph_top.rst pylibcugraph.rst + cugraph_dgl.rst + cugraph_pyg.rst + cugraph_service_client.rst + cugraph_service_server.rst diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/pylibcugraph.rst index 93efec37f..7b63cd7dc 100644 --- a/docs/cugraph/source/api_docs/pylibcugraph.rst +++ b/docs/cugraph/source/api_docs/pylibcugraph.rst @@ -1,6 +1,6 @@ -~~~~~~~~~~~~~~~~~~~~~~ -pylibcugraph -~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~ +pylibcugraph API reference +~~~~~~~~~~~~~~~~~~~~~~~~~~ pylibcugraph diff --git a/docs/cugraph/source/basics/coming_soon.md b/docs/cugraph/source/basics/coming_soon.md new file mode 100644 index 000000000..6cf15a954 --- /dev/null +++ b/docs/cugraph/source/basics/coming_soon.md @@ -0,0 +1,6 @@ + +
+ + +This part of the cuGraph documentation is currently under development. \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_toc.md b/docs/cugraph/source/basics/cugraph_toc.md new file mode 100644 index 000000000..8b71ad378 --- /dev/null +++ b/docs/cugraph/source/basics/cugraph_toc.md @@ -0,0 +1,13 @@ + +- General + - [Basic CuGraph Information]() + - [Latest News]() + - [Blogs and Presentation]() + - [How-to Guides]() + - [Performance]() +- CuGraph Development and Contributing + - [Getting cuGraph Packages]() + - [Contributing to cuGraph]() + - [CuGraph Development Guide]() +- Algorithms + - [Current list of algorithms]() diff --git a/docs/cugraph/source/images/Stack2.png b/docs/cugraph/source/images/Stack2.png new file mode 100644 index 0000000000000000000000000000000000000000..132e85c9d154edb02d319803182e79654fbd345e GIT binary patch literal 457436 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∋u5!=Z-6_%yXY+Rns*;qJ*b^!gc7M=GgIO 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 z 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\n", + "__What is timed__: (1) creating a Graph, (2) running the algorithm (3) run any generators\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Algorithms" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "| Algorithm | Type | Undirected Graph | Directed Graph | Notes\n", + "| ------------------------|---------------|------ | ------- |-------------\n", + "| Katz | Centrality | X | | \n", + "| Betweenness Centrality | Centrality | X | | Estimated, k = 100\n", + "| Louvain | Community | X | | Uses python-louvain for comparison\n", + "| Triangle Counting | Community | X | |\n", + "| Core Number | Core | X | |\n", + "| PageRank | Link Analysis | | X |\n", + "| Jaccard | Similarity | X | |\n", + "| BFS | Traversal | X | | No depth limit\n", + "| SSSP | Traversal | X | | \n", + "\n", + "\n", + "### Test Data\n", + "Data is generated using a Recursive MATrix (R-MAT) graph generation algorithm. \n", + "The generator specifics are documented [here](https://docs.rapids.ai/api/cugraph/stable/api_docs/generator.html)\n", + "\n", + "\n", + "\n", + "### Notes\n", + "* Running Betweenness Centrality on the full graph is prohibitive using NetworkX. Anything over k=100 can explode runtime to days\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Import Modules" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# system and other\n", + "import gc\n", + "import os\n", + "from time import perf_counter\n", + "import numpy as np\n", + "import math\n", + "\n", + "# rapids\n", + "import cugraph\n", + "import cudf\n", + "\n", + "# NetworkX libraries\n", + "import networkx as nx\n", + "\n", + "# RMAT data generator\n", + "from cugraph.generators import rmat\n", + "from cugraph.structure import NumberMap" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import community\n", + "except ModuleNotFoundError:\n", + " os.system('pip install python-louvain')\n", + " import community" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Determine the scale of the test data\n", + "RMAT generates graph where the number of vertices is a power of 2 and the number of edges is based on an edge factor times the number vertices.\n", + "\n", + "Since RMAT tends to generate about 50% isolated vertices, those vertices are dropped from the graph data. Hence the number of vertices is closer to (2 ** scale) / 2\n", + "\n", + "\n", + "| Scale | Vertices (est) | Edges |\n", + "| ------|----------------|--------|\n", + "| 10 | 512 | 16,384 | \n", + "| 11 | 1,024 | 32,768| \n", + "| 12 | 2,048 | 65,536| \n", + "| 13 | 4,096 | 131,072| \n", + "| 14 | 8,192 | 262,144| \n", + "| 15 | 16,384 | 524,288 | \n", + "| 16 | 32,768 | 1,048,576 | \n", + "| 17 | 65,536 | 2,097,152 | \n", + "| 18 | 131,072 | 4,194,304 | \n", + "| 19 | 262,144 | 8,388,608 | \n", + "| 20 | 524,288 | 16,777,216 | \n", + "| 21 | 1,048,576 | 33,554,432 | \n", + "| 22 | 2,097,152 | 67,108,864 | \n", + "| 23 | 4,194,304 | 134,217,728 | \n", + "| 24 | 8,388,608 | 268,435,456 | \n", + "| 25 | 16,777,216 | 536,870,912 | \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test Data Sizes\n", + "# Here you can create an array of test data sizes. Then set the \"data\" variable to the array you want\n", + "# the dictionary format is 'name' : scale\n", + "\n", + "\n", + "# These scales are used by R-MAT to determine the number of vertices/edges in the synthetic data graph.\n", + "data_full = {\n", + " 'data_scale_10' : 10,\n", + " 'data_scale_12' : 12,\n", + " 'data_scale_14' : 14,\n", + " 'data_scale_16' : 16,\n", + " 'data_scale_18' : 18,\n", + " 'data_scale_20' : 20,\n", + "}\n", + "\n", + "# for quick testing\n", + "data_quick = {\n", + " 'data_scale_9' : 9,\n", + " 'data_scale_10' : 10,\n", + " 'data_scale_11' : 11,\n", + "}\n", + "\n", + "\n", + "# Which dataset is to be used\n", + "data = data_full\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate data\n", + "The data is generated once for each size." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Data generator \n", + "# The result is an edgelist of the size determined by the scale and edge factor\n", + "def generate_data(scale, edgefactor=16):\n", + " _gdf = rmat(\n", + " scale,\n", + " (2 ** scale) * edgefactor,\n", + " 0.57,\n", + " 0.19,\n", + " 0.19,\n", + " 42,\n", + " clip_and_flip=False,\n", + " scramble_vertex_ids=True,\n", + " create_using=None, # return edgelist instead of Graph instance\n", + " mg=False # determines whether generated data will be used on one or multiple GPUs\n", + " )\n", + "\n", + " clean_coo = NumberMap.renumber(_gdf, src_col_names=\"src\", dst_col_names=\"dst\")[0]\n", + " clean_coo.rename(columns={\"renumbered_src\": \"src\", \"renumbered_dst\": \"dst\"}, inplace=True)\n", + " print(f'Generated a dataframe of {len(clean_coo)} edges')\n", + " return clean_coo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Graph functions\n", + "There are two types of graphs created:\n", + "* Directed Graphs - calls to create_nx_digraph, create_cu_directed_graph.\n", + "* Undirected Graphs - calls to create_xx_ugraph <- fully symmeterized" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX\n", + "def create_nx_graph(_df, directed=False):\n", + " t1 = perf_counter()\n", + " if directed:\n", + " g_type = nx.DiGraph\n", + " else:\n", + " g_type = nx.Graph\n", + " \n", + " _gnx = nx.from_pandas_edgelist(_df,\n", + " source='src',\n", + " target='dst',\n", + " edge_attr=None,\n", + " create_using=g_type)\n", + " t2 = perf_counter() - t1\n", + "\n", + " return _gnx, t2\n", + "\n", + "\n", + "# cuGraph\n", + "def create_cu_graph(_df,transpose=False, directed=False):\n", + " t1 = perf_counter()\n", + " _g = cugraph.Graph(directed=directed)\n", + " _g.from_cudf_edgelist(_df,\n", + " source='src',\n", + " destination='dst',\n", + " edge_attr=None,\n", + " renumber=False,\n", + " store_transposed=transpose)\n", + " t2 = perf_counter() - t1\n", + "\n", + " return _g, t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm Execution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Katz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_katz(_G, alpha):\n", + " t1 = perf_counter()\n", + " _ = nx.katz_centrality(_G, alpha)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_katz(_G, alpha):\n", + " t1 = perf_counter()\n", + " _ = cugraph.katz_centrality(_G, alpha)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Betweenness Centrality" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bc(_G, _k):\n", + " t1 = perf_counter()\n", + " _ = nx.betweenness_centrality(_G, k=_k)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_bc(_G, _k):\n", + " t1 = perf_counter()\n", + " _ = cugraph.betweenness_centrality(_G, k=_k)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Louvain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_louvain(_G):\n", + " t1 = perf_counter()\n", + " parts = community.best_partition(_G)\n", + " \n", + " # Calculating modularity scores for comparison\n", + " _ = community.modularity(parts, _G)\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_louvain(_G):\n", + " t1 = perf_counter()\n", + " _,_ = cugraph.louvain(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Triangle Counting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_tc(_G):\n", + " t1 = perf_counter()\n", + " nx_count = nx.triangles(_G)\n", + "\n", + " # To get the number of triangles, we would need to loop through the array and add up each count\n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_tc(_G):\n", + " t1 = perf_counter()\n", + " _ = cugraph.triangle_count(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Core Number" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_core_num(_G):\n", + " t1 = perf_counter()\n", + " _G.remove_edges_from(nx.selfloop_edges(_G))\n", + " nx_count = nx.core_number(_G)\n", + " \n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_core_num(_G):\n", + " t1 = perf_counter()\n", + " _ = cugraph.core_number(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PageRank" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_pagerank(_G):\n", + " t1 = perf_counter()\n", + " _ = nx.pagerank(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2 \n", + "\n", + "def cu_pagerank(_G):\n", + " t1 = perf_counter()\n", + " _ = cugraph.pagerank(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Jaccard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_jaccard(_G):\n", + " t1 = perf_counter()\n", + " nj = nx.jaccard_coefficient(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_jaccard(_G):\n", + " t1 = perf_counter()\n", + " _ = cugraph.jaccard_coefficient(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### BFS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bfs(_G):\n", + " seed = 0\n", + " t1 = perf_counter()\n", + " nb = nx.bfs_edges(_G, seed)\n", + " nb_list = list(nb) # gen -> list\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_bfs(_G):\n", + " seed = 0\n", + " t1 = perf_counter()\n", + " _ = cugraph.bfs(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SSSP" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_sssp(_G):\n", + " seed = 0\n", + " t1 = perf_counter()\n", + " _ = nx.shortest_path(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_sssp(_G):\n", + " seed = 0\n", + " t1 = perf_counter()\n", + " _ = cugraph.sssp(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "# Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# number of datasets\n", + "num_datasets = len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# arrays to capture performance gains\n", + "names = []\n", + "algos = []\n", + "graph_create_cu = []\n", + "graph_create_nx = []\n", + "\n", + "# Two dimension data [file, perf]\n", + "time_algo_nx = [] # NetworkX\n", + "time_algo_cu = [] # cuGraph\n", + "perf = []\n", + "perf_algo = []\n", + "\n", + "algos.append(\" \")\n", + "\n", + "i = 0\n", + "for k,v in data.items():\n", + " # init all the 2-d arrays\n", + " time_algo_nx.append([])\n", + " time_algo_cu.append([])\n", + " perf.append([])\n", + " perf_algo.append([])\n", + "\n", + " # Saved the file Name\n", + " names.append(k)\n", + "\n", + " # generate data\n", + " print(\"------------------------------\")\n", + " print(f'Creating Graph of Scale = {v}')\n", + "\n", + " gdf = generate_data(v)\n", + " pdf = gdf.to_pandas()\n", + " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", + "\n", + " # create the graphs\n", + " g_cu, tcu = create_cu_graph(gdf)\n", + " g_nx, tnx = create_nx_graph(pdf)\n", + " graph_create_cu.append(tcu)\n", + " graph_create_nx.append(tnx)\n", + " del gdf, pdf\n", + "\n", + " # prep\n", + " deg = g_cu.degree()\n", + " deg_max = deg['degree'].max()\n", + "\n", + " alpha = 1 / deg_max\n", + " num_nodes = g_cu.number_of_vertices()\n", + "\n", + " del deg\n", + " gc.collect()\n", + "\n", + " #----- Algorithm order is same as defined at top ----\n", + "\n", + " #-- Katz \n", + " print(\"\\tKatz \", end = '')\n", + " if i == 0: \n", + " algos.append(\"Katz\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_katz(g_nx, alpha)\n", + " print(\"c.\", end='')\n", + " tc = cu_katz(g_cu, alpha)\n", + " print(\"\")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- BC\n", + " print(\"\\tBC k=100 \", end='')\n", + " if i == 0:\n", + " algos.append(\"BC Estimate fixed\")\n", + "\n", + " k = 100\n", + " if k > num_nodes:\n", + " k = int(num_nodes)\n", + " print(\"n.\", end='')\n", + " tx = nx_bc(g_nx, k)\n", + " print(\"c.\", end='')\n", + " tc = cu_bc(g_cu, k)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- Louvain\n", + " print(\"\\tLouvain \", end='')\n", + " if i == 0:\n", + " algos.append(\"Louvain\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_louvain(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_louvain(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- TC\n", + " print(\"\\tTC \", end='')\n", + " if i == 0:\n", + " algos.append(\"TC\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_tc(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_tc(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- Core Number\n", + " print(\"\\tCore Number \", end='')\n", + " if i == 0:\n", + " algos.append(\"Core Number\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_core_num(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_core_num(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- PageRank\n", + " print(\"\\tPageRank \", end='')\n", + " if i == 0:\n", + " algos.append(\"PageRank\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_pagerank(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_pagerank(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- Jaccard\n", + " print(\"\\tJaccard \", end='')\n", + " if i == 0:\n", + " algos.append(\"Jaccard\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_jaccard(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_jaccard(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- BFS\n", + " print(\"\\tBFS \", end='')\n", + " if i == 0:\n", + " algos.append(\"BFS\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_bfs(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_bfs(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " #-- SSSP\n", + " print(\"\\tSSSP \", end='')\n", + " if i == 0:\n", + " algos.append(\"SSP\")\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_sssp(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_sssp(g_cu)\n", + " print(\" \")\n", + "\n", + " time_algo_nx[i].append(tx)\n", + " time_algo_cu[i].append(tc)\n", + " perf_algo[i].append ( (tx/tc) )\n", + " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + "\n", + " # increament count\n", + " i = i + 1\n", + " \n", + " del g_cu, g_nx\n", + " gc.collect()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Print results\n", + "print(algos)\n", + "\n", + "for i in range(num_datasets):\n", + " print(f\"{names[i]}\")\n", + " print(f\"{perf[i]}\")\n", + " print(f\"{perf_algo[i]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Print results\n", + "print(\"\\n------------------------------\")\n", + "print(\"\\tAlgorithm Run times (NX then cuGraph)\\n\")\n", + "\n", + "print(algos)\n", + "for i in range(num_datasets):\n", + " print(f\"{names[i]}\")\n", + " print(f\"{time_algo_nx[i]}\")\n", + " print(f\"{time_algo_cu[i]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cudfdev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15 | packaged by conda-forge | (main, Nov 22 2022, 15:55:03) \n[GCC 10.4.0]" + }, + "vscode": { + "interpreter": { + "hash": "587ff963ecd34554a9da41c94362e2baa062d9a57502e220f049e10816826984" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 302b4ed39c2e7322cdbb0b1443d29c8f3e645976 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:47:33 -0500 Subject: [PATCH 226/384] Created notebook for running louvain algorithm on a Multi-GPU Property Graph (#3130) resolves #2609 This notebook specifically creates a multi-GPU Property graph. Might need to create a single-GPU later but this shows use of the Property Graph interface. Also updated the mg_louvain notebook to function with change to Comms. Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Jim Scott (https://github.com/kingmesal) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3130 --- notebooks/demo/mg_louvain.ipynb | 190 +++----------------- notebooks/demo/mg_property_graph.ipynb | 229 +++++++++++++++++++++++++ 2 files changed, 257 insertions(+), 162 deletions(-) create mode 100644 notebooks/demo/mg_property_graph.ipynb diff --git a/notebooks/demo/mg_louvain.ipynb b/notebooks/demo/mg_louvain.ipynb index 1ce2150e6..b2b348fd2 100644 --- a/notebooks/demo/mg_louvain.ipynb +++ b/notebooks/demo/mg_louvain.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,7 +10,7 @@ "\n", "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the Louvain partitions and global modularity score for a dataset.\n", "\n", - "This notebook was tested using RAPIDS 21.12 and CUDA 11.4. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "This notebook was tested using RAPIDS 23.02 and CUDA 11.5. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", "\n", "\n", "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." @@ -25,14 +26,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Import needed libraries. We recommend using the [cugraph_dev](https://github.com/rapidsai/cugraph/tree/branch-21.12/conda/environments) env through conda\n", "from dask.distributed import Client, wait\n", "from dask_cuda import LocalCUDACluster\n", - "import cugraph.comms as Comms\n", + "from cugraph.dask.comms import comms as Comms\n", "import cugraph.dask as dask_cugraph\n", "import cugraph\n", "import dask_cudf\n", @@ -58,19 +59,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Your data file, ../data/hollywood.csv, already exists\n" - ] - } - ], + "outputs": [], "source": [ "import urllib.request\n", "import os\n", @@ -109,18 +102,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n", - "distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n" - ] - } - ], + "outputs": [], "source": [ "cluster = LocalCUDACluster()\n", "client = Client(cluster)\n", @@ -137,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "tags": [] }, @@ -150,7 +134,7 @@ "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", "\n", "# Multi-GPU CSV reader\n", - "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n" + "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" ] }, { @@ -162,22 +146,14 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Read, load and renumber: 121.63822555541992 s\n" - ] - } - ], + "outputs": [], "source": [ "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", - "G = cugraph.DiGraph()\n", + "G = cugraph.Graph()\n", "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst')\n", "\n", "# Print time\n", @@ -193,20 +169,12 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "scrolled": true, "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Louvain: 8.262660264968872 s\n" - ] - } - ], + "outputs": [], "source": [ "# Start Pagerank timer\n", "t_start = time.time()\n", @@ -236,127 +204,19 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "scrolled": true, "tags": [] }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
partitionvertex
01484873
122951410343
21486216
32297098213
422970100890
.........
56961015711077778
5696110629654
56961233963203
569613273081077821
5696140239788
\n", - "

1139905 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " partition vertex\n", - "0 1 484873\n", - "1 22951 410343\n", - "2 1 486216\n", - "3 22970 98213\n", - "4 22970 100890\n", - "... ... ...\n", - "569610 1571 1077778\n", - "569611 0 629654\n", - "569612 33 963203\n", - "569613 27308 1077821\n", - "569614 0 239788\n", - "\n", - "[1139905 rows x 2 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "louvain_df.compute()\n" + "louvain_df.compute()" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -366,11 +226,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2021, NVIDIA CORPORATION.\n", + "Copyright (c) 2021-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -381,7 +242,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "cudfdev", "language": "python", "name": "python3" }, @@ -395,7 +256,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.9.15 | packaged by conda-forge | (main, Nov 22 2022, 15:55:03) \n[GCC 10.4.0]" + }, + "vscode": { + "interpreter": { + "hash": "587ff963ecd34554a9da41c94362e2baa062d9a57502e220f049e10816826984" + } } }, "nbformat": 4, diff --git a/notebooks/demo/mg_property_graph.ipynb b/notebooks/demo/mg_property_graph.ipynb new file mode 100644 index 000000000..e8db6f727 --- /dev/null +++ b/notebooks/demo/mg_property_graph.ipynb @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-GPU Property Graph\n", + "\n", + "This notebook loads data into a cudf_dask dataframe, uses it to populate an MultiGPU Property Graph.\n", + "It then runs the Louvain algorithm on that graph and annotates the MG Property Graph with the results of the algorithm.\n", + "\n", + "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|---------------|------------|------------------|-----------------|-----------------------|\n", + "| Don Acosta | 01/30/2023 | created | 23.02 nightly | 2xA6000 CUDA 11.7 |\n", + "\n", + "\n", + "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-GPU Property Graph\n", + "### Basic setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries. We recommend using the [cugraph_dev](https://github.com/rapidsai/cugraph/tree/branch-23.02/conda/environments) env through conda\n", + "from dask.distributed import Client, wait\n", + "from dask_cuda import LocalCUDACluster\n", + "from cugraph.dask.comms import comms as Comms\n", + "import cugraph.dask as dask_cugraph\n", + "import cugraph\n", + "import dask_cudf\n", + "import time\n", + "import urllib.request\n", + "import os" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This code pulls the datafile from the rapids S3 bucket and decompresses it. This will not be necessary when the Datasets API supports decompression and direct loading into a dask edgelist." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_data_file():\n", + "\n", + " data_dir = '../data/'\n", + " if not os.path.exists(data_dir):\n", + " print('creating data directory')\n", + " os.system('mkdir ../data')\n", + "\n", + " # download the Hollywood dataset\n", + " base_url = 'https://rapidsai-data.s3.us-east-2.amazonaws.com/cugraph/benchmark/'\n", + " fn = 'hollywood.csv'\n", + " comp = '.gz'\n", + "\n", + " if not os.path.isfile(data_dir+fn):\n", + " if not os.path.isfile(data_dir+fn+comp):\n", + " print(f'Downloading {base_url+fn+comp} to {data_dir+fn+comp}')\n", + " urllib.request.urlretrieve(base_url+fn+comp, data_dir+fn+comp)\n", + " print(f'Decompressing {data_dir+fn+comp}...')\n", + " os.system('gunzip '+data_dir+fn+comp)\n", + " print(f'{data_dir+fn+comp} decompressed!')\n", + " else:\n", + " print(f'Your data file, {data_dir+fn}, already exists')\n", + "\n", + " # File path, assuming Notebook directory\n", + " return (data_dir+fn)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize multi-GPU environment\n", + "Before we get started, we need to setup a Dask local cluster of workers to execute our work and a client to coordinate and schedule work for that cluster. As we see below, we can initiate a cluster and client using only 3 lines of code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "Comms.initialize(p2p=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Read the data from disk\n", + "cuGraph depends on cudf for data loading and the initial DataFrame creation. The CSV data file contains an edge list, which represents the connection of a vertex to another. The source to destination pairs is what is known as Coordinate Format (COO). In this test case, the data is just two columns. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Start ETL timer\n", + "t_start = time.time()\n", + "\n", + "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", + "input_data_path = get_data_file()\n", + "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "\n", + "# Multi-GPU CSV reader\n", + "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a Multi-GPU Property Graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from cugraph.experimental import MGPropertyGraph\n", + "pG = MGPropertyGraph()\n", + "pG.add_edge_data(e_list,vertex_col_names=[\"src\", \"dst\"])\n", + "# removes the original edgelist to free up GPU memory\n", + "del e_list\n", + "pG.get_num_edges()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(louvain_df, modularity) = dask_cugraph.louvain(pG.extract_subgraph(create_using=cugraph.Graph))\n", + "pG.add_vertex_data(louvain_df, vertex_col_name=\"vertex\")\n", + "pG.get_vertex_data().compute().sort_index(axis=1)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Shut down the multi-GPU Environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2023, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cudfdev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "587ff963ecd34554a9da41c94362e2baa062d9a57502e220f049e10816826984" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From f4d2d7147f67232a799e0b465e17f42294748318 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 9 Feb 2023 16:21:07 -0500 Subject: [PATCH 227/384] REL v23.02.00 release From 9ff83a8d03fde6c5c7b9c0a6fcb282e8172ac887 Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Fri, 24 Feb 2023 15:30:11 -0800 Subject: [PATCH 228/384] Add dfg as a pre-commit hook. (#3294) This change allows local and remote runs to handle calls to dfg identically, and removes the need for a separate CI check. Authors: - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/3294 --- .pre-commit-config.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a075beea3..499192ac0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,3 +51,8 @@ repos: language: python pass_filenames: false additional_dependencies: [gitpython] + - repo: https://github.com/rapidsai/dependency-file-generator + rev: v1.4.0 + hooks: + - id: rapids-dependency-file-generator + args: ["--clean"] From 79ac27a67e534d00b4b149f31445fbfdb9765e08 Mon Sep 17 00:00:00 2001 From: Jordan Jacobelli Date: Mon, 27 Feb 2023 16:50:15 +0100 Subject: [PATCH 229/384] Update datasets download URL (#3299) Update datasets download URL to reduce latency and costs Authors: - Jordan Jacobelli (https://github.com/jjacobelli) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/3299 --- notebooks/demo/mg_louvain.ipynb | 2 +- notebooks/demo/mg_pagerank.ipynb | 4 ++-- notebooks/demo/mg_property_graph.ipynb | 2 +- notebooks/demo/uvm.ipynb | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/notebooks/demo/mg_louvain.ipynb b/notebooks/demo/mg_louvain.ipynb index b2b348fd2..3ff14ce69 100644 --- a/notebooks/demo/mg_louvain.ipynb +++ b/notebooks/demo/mg_louvain.ipynb @@ -74,7 +74,7 @@ " os.system('mkdir ../data')\n", "\n", "# download the Hollywood dataset\n", - "base_url = 'https://rapidsai-data.s3.us-east-2.amazonaws.com/cugraph/benchmark/'\n", + "base_url = 'https://data.rapids.ai/cugraph/benchmark/'\n", "fn = 'hollywood.csv'\n", "comp = '.gz'\n", "\n", diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index 7c32c0520..5e3f05210 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -84,7 +84,7 @@ " os.system('mkdir ../data')\n", "\n", "# download the Twitter dataset\n", - "base_url = 'https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/'\n", + "base_url = 'https://data.rapids.ai/cugraph/benchmark/'\n", "fn = 'twitter-2010.csv'\n", "comp = '.gz'\n", "if not os.path.isfile(data_dir+fn):\n", @@ -239,7 +239,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the [map](https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", + "We can now use the [map](https://data.rapids.ai/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", "The table below shows more information on our *Top 3*. Notice that this ranking is much better at capturing network influence compared the number of followers for instance. Further analysis of this dataset was published [here](https://doi.org/10.1145/1772690.1772751).\n", "\n", "| Vertex ID\t| Twitter ID\t| User name\t| Description |\n", diff --git a/notebooks/demo/mg_property_graph.ipynb b/notebooks/demo/mg_property_graph.ipynb index e8db6f727..0a5aa5df8 100644 --- a/notebooks/demo/mg_property_graph.ipynb +++ b/notebooks/demo/mg_property_graph.ipynb @@ -70,7 +70,7 @@ " os.system('mkdir ../data')\n", "\n", " # download the Hollywood dataset\n", - " base_url = 'https://rapidsai-data.s3.us-east-2.amazonaws.com/cugraph/benchmark/'\n", + " base_url = 'https://data.rapids.ai/cugraph/benchmark/'\n", " fn = 'hollywood.csv'\n", " comp = '.gz'\n", "\n", diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index 08b04a99c..d4d9caeba 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -117,7 +117,7 @@ "outputs": [], "source": [ "# download the Twitter dataset\n", - "base_url = 'https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/'\n", + "base_url = 'https://data.rapids.ai/cugraph/benchmark/'\n", "fn = 'twitter-2010.csv'\n", "comp = '.gz'\n", "if not os.path.isfile(data_dir+fn):\n", @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the [map](https://s3.us-east-2.amazonaws.com/rapidsai-data/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", + "We can now use the [map](https://data.rapids.ai/cugraph/benchmark/twitter-2010-ids.csv.gz) to convert Vertex ID into to Twitter's numeric ID. The user name can also be retrieved using the [TwitterID](https://tweeterid.com/) web app.
\n", "The table below shows more information on our *Top 3*. Notice that this ranking is much better at capturing network influence compared the number of followers for instance. Further analysis of this dataset was published [here](https://doi.org/10.1145/1772690.1772751).\n", "\n", "| Vertex ID\t| Twitter ID\t| User name\t| Description |\n", From a4b86015239ec353e6ace1d82f55891d211dda73 Mon Sep 17 00:00:00 2001 From: Jake Awe <50372925+AyodeAwe@users.noreply.github.com> Date: Tue, 28 Feb 2023 11:49:57 -0600 Subject: [PATCH 230/384] Add docs build job (#3157) The PR adds a `docs_build` process to the PR and Build workflows for this repository. The generated docs are synced to s3 for only the build workflows. Authors: - Jake Awe (https://github.com/AyodeAwe) - AJ Schmidt (https://github.com/ajschmidt8) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) - Vibhu Jawa (https://github.com/VibhuJawa) URL: https://github.com/rapidsai/cugraph/pull/3157 --- .gitignore | 2 ++ docs/cugraph/source/api_docs/centrality.rst | 2 +- docs/cugraph/source/api_docs/cugraph_pyg.rst | 1 - docs/cugraph/source/api_docs/index.rst | 2 +- docs/cugraph/source/conf.py | 17 ----------------- 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 530ccffca..4115f2285 100644 --- a/.gitignore +++ b/.gitignore @@ -93,3 +93,5 @@ python/cugraph/cugraph/tests/dask-worker-space # Sphinx docs & build artifacts docs/cugraph/source/api_docs/api/* +_html +_text diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/centrality.rst index 92f712523..9b634cb6d 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/centrality.rst @@ -28,7 +28,7 @@ Katz Centrality (MG) cugraph.dask.centrality.katz_centrality.katz_centrality Degree Centrality ---------------- +----------------- .. autosummary:: :toctree: api/ diff --git a/docs/cugraph/source/api_docs/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph_pyg.rst index b2772450c..7e25b3547 100644 --- a/docs/cugraph/source/api_docs/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph_pyg.rst @@ -10,6 +10,5 @@ cugraph-pyg :toctree: api/ cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore - cugraph_pyg.loader.dispatch.call_cugraph_algorithm cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index a8d025451..0e7598af0 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -1,5 +1,5 @@ Python API reference -============= +==================== This page provides a list of all publicly accessible modules, methods and classes through ``cugraph.*`` namespace. diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 4d39e7d8d..4d11d4ef9 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# # Copyright (c) 2018-2023, NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by @@ -27,8 +24,6 @@ # 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('../../python')) -sys.path.insert(0, os.path.abspath('../..')) from github_link import make_linkcode_resolve # noqa @@ -112,18 +107,6 @@ html_theme = 'pydata_sphinx_theme' -# on_rtd is whether we are on readthedocs.org -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' - -if not on_rtd: - # only import and set the theme if we're building docs locally - # otherwise, readthedocs.org uses their theme by default, - # so no need to specify it - import pydata_sphinx_theme - import sphinx_rtd_theme - html_theme = 'pydata_sphinx_theme' - html_theme_path = sphinx_rtd_theme.get_html_theme_path() - # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False From d020a414c6bfd21e2f9a41dfd6cf271719611618 Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Wed, 1 Mar 2023 06:27:23 -0800 Subject: [PATCH 231/384] Stop using versioneer to manage versions (#3298) This PR replaces usage of versioneer with hard-coded version numbers in setup.py and init.py. Since cugraph needs to manage versions across a wide range of file types (CMake, C++, Sphinx and doxygen docs, etc), versioneer cannot be relied on as a single source of truth and therefore does not allow us to single-source our versioning to the Git repo as is intended. Additionally, since the primary means of installing raft is via conda packages (or now, pip packages), information from the package manager tends to be far more informative than the version strings for troubleshooting and debugging purposes. Conversely, the nonstandard version strings that it produces tend to be problematic for other tools, which at best will ignore such versions but at worst will simply fail. This PR also replaces usage of an environment variable to set the package name for wheels in setup.py, instead moving the renaming logic into the same sed script used to update package versions. This change makes setup.py essentially static, paving the way for migration to pyproject.toml. Authors: - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/3298 --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 499192ac0..585659aaa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,6 @@ repos: hooks: - id: black language_version: python3 - exclude: versioneer.py args: [--target-version=py38] files: ^python/ - repo: https://github.com/PyCQA/flake8 From 2c2f2647512512cbb730847987d4cd6abd622980 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:05:50 -0500 Subject: [PATCH 232/384] Refactoring tests (#3292) Redoing the organization of the python tests. Merging both SG and MG together and using tag to specify runs organizing tests by graph function **MG Test File Renaming** - MG test files now end with "_mg" rather than starting with "test_mg". This will make it easier to see that there are test pairs, SG and MG, since a listing will now group files together. **mg pytest marker** - created a pytest marker called "mg" to identify MG test and allow CI/users to either include or skip - `pytest -m mg` to run all mg tests - `pytest -m "not mg"` to skip all MG tests **sg marker** test only SG code pytest -m sg Added markers for "sg" and "ci" for future use Fixed a number of test issues closes #1481 Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Ray Douglass (https://github.com/raydouglass) - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) - Joseph Nke (https://github.com/jnke2016) URL: https://github.com/rapidsai/cugraph/pull/3292 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4115f2285..6ddf97c44 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ __pycache__ *~ DartConfiguration.tcl .DS_Store +rmm_log.txt # Unit test / coverage reports htmlcov/ From 9e854b2ac87d1f69933070730c64e0688b5f5835 Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Wed, 15 Mar 2023 20:04:36 -0400 Subject: [PATCH 233/384] Migrate as much as possible to pyproject.toml (#3317) This moves as much packaging information and linter configuration out of setup.[py|cfg] files into pyproject.toml with the aim of migrating to more modern Python builders in the future. Authors: - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - Ray Douglass (https://github.com/raydouglass) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3317 --- .flake8 | 25 +++++++++++++++++++++++++ .pre-commit-config.yaml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 000000000..1d917da6b --- /dev/null +++ b/.flake8 @@ -0,0 +1,25 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. + +[flake8] +filename = *.py, *.pyx, *.pxd, *.pxi +exclude = __init__.py, *.egg, build, docs, .git +force-check = True +max-line-length = 88 +ignore = + # line break before binary operator + W503, + # whitespace before : + E203 +per-file-ignores = + # Rules ignored only in Cython: + # E211: whitespace before '(' (used in multi-line imports) + # E225: Missing whitespace around operators (breaks cython casting syntax like ) + # E226: Missing whitespace around arithmetic operators (breaks cython pointer syntax like int*) + # E227: Missing whitespace around bitwise or shift operator (Can also break casting syntax) + # E275: Missing whitespace after keyword (Doesn't work with Cython except?) + # E402: invalid syntax (works for Python, not Cython) + # E999: invalid syntax (works for Python, not Cython) + # W504: line break after binary operator (breaks lines that end with a pointer) + *.pyx: E211, E225, E226, E227, E275, E402, E999, W504 + *.pxd: E211, E225, E226, E227, E275, E402, E999, W504 + *.pxi: E211, E225, E226, E227, E275, E402, E999, W504 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 585659aaa..a5d5a00ba 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: rev: 6.0.0 hooks: - id: flake8 - args: ["--config=setup.cfg"] + args: ["--config=.flake8"] files: python/.*$ types: [file] types_or: [python] # TODO: Enable [python, cython] From fdfafb57035fc2327c43c85309d1c62396bd6e7d Mon Sep 17 00:00:00 2001 From: Jordan Jacobelli Date: Thu, 16 Mar 2023 15:49:23 +0100 Subject: [PATCH 234/384] Update datasets download URL (#3305) Some URLs were not updated by https://github.com/rapidsai/cugraph/pull/3299. This PR is fixing this and removing the `datasets/get_test_data.sh` from the ignored files Authors: - Jordan Jacobelli (https://github.com/jjacobelli) - AJ Schmidt (https://github.com/ajschmidt8) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3305 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6ddf97c44..3fda9f8a0 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ cpp/thirdparty/googletest/ ## Datasets datasets/* !datasets/cyber.csv +!datasets/get_test_data.sh !datasets/karate-data.csv !datasets/karate_undirected.csv !datasets/karate-disjoint.csv From f832eb3beb4d9223ac1aa61bae304ebd856e16e9 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:38:13 -0400 Subject: [PATCH 235/384] Doc fix and change to Louvain notebook (#3224) Fixed to errors in the cuGraph documentation and addressed an error in my earlier commit on the mg_louvain notebook. Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3224 --- docs/cugraph/source/index.rst | 3 ++- notebooks/demo/mg_louvain.ipynb | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 5aba992ff..f1012c0fb 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -19,7 +19,8 @@ General CuGraph Information - `CuGraph Intro <./basics/cugraph_intro.md>`_ - `Blogs and Presentation <./basics/cugraph_blogs.rst>`_ - `How-to Guides <./basics/coming_soon.md>`_ - - `Performance <./basics/coming_soon.md>`_ + - `Performance <./basics/coming_soon.md>`_ + - `References <./basics/cugraph_ref.rst>`_ CuGraph Development and Contributing - `Getting cuGraph Packages <./basics/coming_soon.md>`_ diff --git a/notebooks/demo/mg_louvain.ipynb b/notebooks/demo/mg_louvain.ipynb index 3ff14ce69..a23c8eadb 100644 --- a/notebooks/demo/mg_louvain.ipynb +++ b/notebooks/demo/mg_louvain.ipynb @@ -6,7 +6,12 @@ "metadata": {}, "source": [ "# Multiple GPU Louvain in cuGraph\n", - "#### Author : Chuck Hastings\n", + "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|---------------|------------|------------------|-----------------|-----------------------|\n", + "| Chuck Hastings| 11/08/2021 | created | 21.10 nightly | |\n", + "| Don Acosta | 01/30/2023 | updated | 23.02 nightly | 2xA6000 CUDA 11.7 |\n", + "\n", "\n", "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the Louvain partitions and global modularity score for a dataset.\n", "\n", @@ -152,8 +157,8 @@ }, "outputs": [], "source": [ - "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", - "G = cugraph.Graph()\n", + "# Create an undirected graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", + "G = cugraph.Graph(directed=False)\n", "G.from_dask_cudf_edgelist(e_list, source='src', destination='dst')\n", "\n", "# Print time\n", @@ -256,7 +261,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15 | packaged by conda-forge | (main, Nov 22 2022, 15:55:03) \n[GCC 10.4.0]" + "version": "3.10.8" }, "vscode": { "interpreter": { From 36663a03912096d6fde080ebd3b4b217d719e2a0 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Thu, 23 Mar 2023 14:55:19 -0400 Subject: [PATCH 236/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 4d11d4ef9..983584839 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -76,9 +76,9 @@ # built documents. # # The short X.Y version. -version = '23.04' +version = '23.06' # The full version, including alpha/beta/rc tags. -release = '23.04.00' +release = '23.06.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7c2bf1dffa1938c49a80810286622aee2b2987ca Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Sun, 2 Apr 2023 16:49:49 -0400 Subject: [PATCH 237/384] New cugraph site structure (#3343) resolves #3297 new website structure with some migrations. Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) - Alex Barghi (https://github.com/alexbarghi-nv) URL: https://github.com/rapidsai/cugraph/pull/3343 --- docs/cugraph/source/api_docs/cugraph_dgl.rst | 2 +- docs/cugraph/source/dev_resources/API.rst | 5 ++ docs/cugraph/source/dev_resources/index.rst | 10 +++ .../source/graph_support/DGL_support.md | 55 ++++++++++++ .../source/graph_support/PyG_support.md | 3 + .../source/graph_support/algorithms.md | 85 ++++++++++++++++++ .../source/graph_support/compatibility.rst | 8 ++ .../source/graph_support/cugraph_service.rst | 9 ++ .../graph_support/cugraphops_support.rst | 10 +++ .../source/graph_support/datastores.rst | 11 +++ .../source/graph_support/feature_stores.md | 0 .../source/graph_support/gnn_support.rst | 12 +++ .../source/graph_support/graph_algorithms.rst | 9 ++ docs/cugraph/source/graph_support/index.rst | 13 +++ .../source/graph_support/knowledge_stores.md | 0 .../source/graph_support/pg_example.png | Bin 0 -> 242398 bytes .../source/graph_support/property_graph.md | 54 +++++++++++ .../graph_support/wholegraph_support.rst | 0 docs/cugraph/source/index.rst | 47 ++-------- .../source/installation/getting_cugraph.md | 58 ++++++++++++ docs/cugraph/source/installation/index.rst | 9 ++ .../{basics => references}/cugraph_ref.rst | 0 docs/cugraph/source/references/datasets.rst | 0 docs/cugraph/source/references/index.rst | 9 ++ docs/cugraph/source/references/licenses.rst | 0 docs/cugraph/source/releases/index.rst | 5 ++ docs/cugraph/source/tutorials/blogs.rst | 8 ++ .../source/tutorials/community_resources.md | 2 + .../{basics => tutorials}/cugraph_blogs.rst | 0 .../source/tutorials/cugraph_notebooks.md | 77 ++++++++++++++++ .../cugraph/source/tutorials/how_to_guides.md | 9 ++ docs/cugraph/source/tutorials/index.rst | 12 +++ 32 files changed, 483 insertions(+), 39 deletions(-) create mode 100644 docs/cugraph/source/dev_resources/API.rst create mode 100644 docs/cugraph/source/dev_resources/index.rst create mode 100644 docs/cugraph/source/graph_support/DGL_support.md create mode 100644 docs/cugraph/source/graph_support/PyG_support.md create mode 100644 docs/cugraph/source/graph_support/algorithms.md create mode 100644 docs/cugraph/source/graph_support/compatibility.rst create mode 100644 docs/cugraph/source/graph_support/cugraph_service.rst create mode 100644 docs/cugraph/source/graph_support/cugraphops_support.rst create mode 100644 docs/cugraph/source/graph_support/datastores.rst create mode 100644 docs/cugraph/source/graph_support/feature_stores.md create mode 100644 docs/cugraph/source/graph_support/gnn_support.rst create mode 100644 docs/cugraph/source/graph_support/graph_algorithms.rst create mode 100644 docs/cugraph/source/graph_support/index.rst create mode 100644 docs/cugraph/source/graph_support/knowledge_stores.md create mode 100644 docs/cugraph/source/graph_support/pg_example.png create mode 100644 docs/cugraph/source/graph_support/property_graph.md create mode 100644 docs/cugraph/source/graph_support/wholegraph_support.rst create mode 100644 docs/cugraph/source/installation/getting_cugraph.md create mode 100644 docs/cugraph/source/installation/index.rst rename docs/cugraph/source/{basics => references}/cugraph_ref.rst (100%) create mode 100644 docs/cugraph/source/references/datasets.rst create mode 100644 docs/cugraph/source/references/index.rst create mode 100644 docs/cugraph/source/references/licenses.rst create mode 100644 docs/cugraph/source/releases/index.rst create mode 100644 docs/cugraph/source/tutorials/blogs.rst create mode 100644 docs/cugraph/source/tutorials/community_resources.md rename docs/cugraph/source/{basics => tutorials}/cugraph_blogs.rst (100%) create mode 100644 docs/cugraph/source/tutorials/cugraph_notebooks.md create mode 100644 docs/cugraph/source/tutorials/how_to_guides.md create mode 100644 docs/cugraph/source/tutorials/index.rst diff --git a/docs/cugraph/source/api_docs/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph_dgl.rst index 9a8b3ba6c..98e101f99 100644 --- a/docs/cugraph/source/api_docs/cugraph_dgl.rst +++ b/docs/cugraph/source/api_docs/cugraph_dgl.rst @@ -1,5 +1,5 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-dgl API Refrerence +cugraph-dgl API Reference ~~~~~~~~~~~~~~~~~~~~~~~~~~ cugraph-dgl diff --git a/docs/cugraph/source/dev_resources/API.rst b/docs/cugraph/source/dev_resources/API.rst new file mode 100644 index 000000000..409e307fd --- /dev/null +++ b/docs/cugraph/source/dev_resources/API.rst @@ -0,0 +1,5 @@ +=== +API +=== + +https://docs.rapids.ai/api/cugraph/nightly/api_docs/index.html \ No newline at end of file diff --git a/docs/cugraph/source/dev_resources/index.rst b/docs/cugraph/source/dev_resources/index.rst new file mode 100644 index 000000000..8568772b3 --- /dev/null +++ b/docs/cugraph/source/dev_resources/index.rst @@ -0,0 +1,10 @@ +=================== +Developer Resources +=================== + + +.. toctree:: + :maxdepth: 3 + + https://docs.rapids.ai/maintainers + API.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md new file mode 100644 index 000000000..4db2a4d77 --- /dev/null +++ b/docs/cugraph/source/graph_support/DGL_support.md @@ -0,0 +1,55 @@ +# 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 +``` +mamba env create -n cugraph_dgl_dev --file conda/cugraph_dgl_dev_11.6.yml +``` + +### 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( +- dgl_g, ++ cugraph_g, +train_idx, +sampler, +device=device, +batch_size=1024, +shuffle=True, +drop_last=False, +num_workers=0) +``` + diff --git a/docs/cugraph/source/graph_support/PyG_support.md b/docs/cugraph/source/graph_support/PyG_support.md new file mode 100644 index 000000000..42d4d1c55 --- /dev/null +++ b/docs/cugraph/source/graph_support/PyG_support.md @@ -0,0 +1,3 @@ +# 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. \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md new file mode 100644 index 000000000..fa2e7cc95 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -0,0 +1,85 @@ +# 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 | Algorithm | Scale | Notes | +| ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | +| Centrality | | | | +| | Katz | __Multi-GPU__ | | +| | Betweenness Centrality | Single-GPU | MG planned for 23.02 | +| | Edge Betweenness Centrality | Single-GPU | MG planned for 23.02 | +| | Eigenvector Centrality | __Multi-GPU__ | | +| | Degree Centrality | __Multi-GPU__ | Python only | +| Community | | | | +| | Leiden | Single-GPU | MG planned for 23.02 | +| | Louvain | __Multi-GPU__ | | +| | Ensemble Clustering for Graphs | Single-GPU | | +| | Spectral-Clustering - Balanced Cut | Single-GPU | | +| | Spectral-Clustering - Modularity | Single-GPU | | +| | Subgraph Extraction | Single-GPU | | +| | Triangle Counting | __Multi-GPU__ | | +| | K-Truss | Single-GPU | | +| Components | | | | +| | Weakly Connected Components | __Multi-GPU__ | | +| | Strongly Connected Components | Single-GPU | | +| Core | | | | +| | K-Core | **Multi-GPU** | | +| | Core Number | **Multi-GPU** | | +| _Flow_ | | | | +| | _MaxFlow_ | --- | | +| _Influence_ | | | | +| | _Influence Maximization_ | --- | | +| Layout | | | | +| | Force Atlas 2 | Single-GPU | | +| Linear Assignment | | | | +| | Hungarian | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | +| Link Analysis | | | | +| | Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | +| | Personal Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | +| | HITS | __Multi-GPU__ | | +| Link Prediction | | | | +| | Jaccard Similarity | **Multi-GPU** | MG as of 22.12
Directed graph only | +| | Weighted Jaccard Similarity | Single-GPU | | +| | Overlap Similarity | **Multi-GPU** | MG as of 22.12 | +| | Sorensen Coefficient | **Multi-GPU** | MG as of 22.12 | +| | _Local Clustering Coefficient_ | --- | | +| Sampling | | | | +| | Uniform Random Walks (RW) | **Multi-GPU** | | +| | *Biased Random Walks (RW)* | --- | | +| | Egonet | **Multi-GPU** | | +| | Node2Vec | Single-GPU | MG planned for 23.02 | +| | Uniform Neighborhood sampling | __Multi-GPU__ | | +| Traversal | | | | +| | Breadth First Search (BFS) | __Multi-GPU__ | with cutoff support``[C++ README](cpp/src/traversal/README.md#BFS) | +| | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](cpp/src/traversal/README.md#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_ | --- | | +| | | | | diff --git a/docs/cugraph/source/graph_support/compatibility.rst b/docs/cugraph/source/graph_support/compatibility.rst new file mode 100644 index 000000000..38f6df4c7 --- /dev/null +++ b/docs/cugraph/source/graph_support/compatibility.rst @@ -0,0 +1,8 @@ +Compatibility +============= + + +.. toctree:: + :maxdepth: 3 + + Compatibility \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/cugraph_service.rst b/docs/cugraph/source/graph_support/cugraph_service.rst new file mode 100644 index 000000000..620b22d1e --- /dev/null +++ b/docs/cugraph/source/graph_support/cugraph_service.rst @@ -0,0 +1,9 @@ +=============== +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) \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/cugraphops_support.rst b/docs/cugraph/source/graph_support/cugraphops_support.rst new file mode 100644 index 000000000..08ae3b218 --- /dev/null +++ b/docs/cugraph/source/graph_support/cugraphops_support.rst @@ -0,0 +1,10 @@ +================== +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-ops/blob/branch-23.04/README.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/datastores.rst b/docs/cugraph/source/graph_support/datastores.rst new file mode 100644 index 000000000..82db2c0e1 --- /dev/null +++ b/docs/cugraph/source/graph_support/datastores.rst @@ -0,0 +1,11 @@ +=========== +Data Stores +=========== + + +.. toctree:: + :maxdepth: 3 + + property_graph.md + feature_stores.md + knowledge_stores.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/feature_stores.md b/docs/cugraph/source/graph_support/feature_stores.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/graph_support/gnn_support.rst b/docs/cugraph/source/graph_support/gnn_support.rst new file mode 100644 index 000000000..2acb2254a --- /dev/null +++ b/docs/cugraph/source/graph_support/gnn_support.rst @@ -0,0 +1,12 @@ +============================ +Graph Neural Network Support +============================ + + +.. toctree:: + :maxdepth: 3 + + PyG_support.md + DGL_support.md + cugraphops_support.rst + wholegraph_support.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/graph_algorithms.rst b/docs/cugraph/source/graph_support/graph_algorithms.rst new file mode 100644 index 000000000..885be03bf --- /dev/null +++ b/docs/cugraph/source/graph_support/graph_algorithms.rst @@ -0,0 +1,9 @@ +========== +Algorithms +========== + + +.. toctree:: + :maxdepth: 3 + + algorithms.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/index.rst b/docs/cugraph/source/graph_support/index.rst new file mode 100644 index 000000000..9526fae7e --- /dev/null +++ b/docs/cugraph/source/graph_support/index.rst @@ -0,0 +1,13 @@ +============= +Graph Support +============= + + +.. toctree:: + :maxdepth: 3 + + graph_algorithms.rst + compatibility.rst + gnn_support.rst + datastores.rst + cugraph_service.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/knowledge_stores.md b/docs/cugraph/source/graph_support/knowledge_stores.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/graph_support/pg_example.png b/docs/cugraph/source/graph_support/pg_example.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce8a0f20549deaa34b968787f0b711ed8bc71fb GIT binary patch literal 242398 zcmYJaRahL+(gljU`!M*R!3TGD4UphISnvSB-GjSB2oAwrgEP2m2=2k%xtw$Ud+)>a zd@V1#s`pw|t5!#Y(n^H z?bh+@ERar%(7V80{g~$a^_sWWS?3)bDz&RTN{Eq^JScD~s}N8kIQ#<&tdW&Z!( zd-*aB19-oDtoXDC+?e6pcymq=^uB;&^K(g9OAA0J4seo@LYz4%r1V94zM@4Ign8)Zac zLgs-eUOATBNR#|XlD}11b){>p#?TaAnuWj1Cz0zKB^o8zwrh@4c>wXe*yzJ1PkTR_ zFNipBKX19*;P=kkg9YRcIqJ8FrP(?J<*x){#w}k1~c*ivwZP6W>!psu$5ZVb@oU`BGR!tRS2EO;5r0 z;ZyFV|9A?RjqfPUu(S2`Eg+h}&SpnOFE{Od4TfR#BIC_UTh_>+3q*};sU-Cir+YDU z>r$7}Eodul#Di?$nCC9@rk*e+q^dmp(#i+{f4NiA3$Qvpk?H5qGR~2r^B4O4)BBA`TirwaCk-32w&&QSa__qZ;-b-ov=irwcIe9D#S5>YI1mKo2?ao6 z^eNqf@eeI8r^4`JL`W$*f@WC-0rdqY*YTnm5|rfq{nJk8HlvxJ?G00V&D0hF&%`US zM|XTq98}X2jykmeW%?WEi5Kr9Rq>5|4nu$TQ&{>J*b;OMA%>a(>-E&t_v}Xgzu8p) z(Z2`F<)W8Id=IYc^%?#7Le0PDDbFW*QOt{y-S-mKsL<&39=_wY2ifDP6Z>K!oO1Jy z(kEiw_nLa``CO_)wbMDJ-+1w?w3)>Cn)fDFrmphRwCiVc>ADhtX!us2QumsATix-< zEWIUBc2YlW$5U6&=EPh5UxTh%$K2a6WJ7gY(+vtkwiO%L98&m6zKBgU0jv0DRhTKDn`DY{59Q4DgNioZHiOQHe4)~Giao0_tMZn-fnjEzosw>%Bc4x2v+>BM zpLx}E2DHwVvr&3SljgIr5>eZuf={&*u*1VB%Bqs;8g+?cce@@tOFKGmnqF&?O=&q@h=l4e?>W(Fd3LwQo=fH&#S5HUmU3T-8b=?|*jvf0q1?$cDVI z8Bume6E@XkY(~jF`Fdy3++QyjAB}%M^DQi#4w9RPZ&Bo-ws84TIE>#8#CX0QByYz} z=)SfvjZ+%V_&8}6Q##;SJWLyFGL)M)HNqtes^`?fk%W)T5rzN{*RoI59)2i=v0q(T zkQp~vtzZd=Cbz8kF)T>+7G?v%jhBvfEgINN`W4}GT;dOZOSkT~iZR;8jFaxK(pe5^ zRpiR0n#BGo>Ru*13)ZaO{*r3XhEYWS9q4x2E4ZFY8X%ce~ia6a>Egs>h!Utk2GyLv$+o zmwr0%?5X_KP9SsVehfhHQpDC~r(>M*JH<|?*vQIo4}*P4F&8h-t#lB!ajd*G#lEPxDGBv|6 zvmZm!d;A|B(OGO)5#v7I6;!U1G+3B_Nn?-Um!NmVQVzA#y7FB*uQOH2!z>}AT%w(X zY#$-E!#!F}gfhiAqtX{k8jl!Xjhgovb-x(2g`nckrYlJjkfek6YVwQo7~`Ho#~9>B zXr3VxAvV;rknu417joLTLYvjRNqaF?$Fiux6#KHQIjN)gp=-gyLe4yvJ*KJn;mgA8 zIly&&A+CJFed6b5jgr2Gh=+Z!@1XKh@_nCW!klkYs&N;)9hfAQJ8I|@{>ea0lBkcc zhST7Z8O_9}7iBWRp6y=_8`YpMliKCSp}`a31tzJZ-p9k6_^ae0?nL9TxrA5rGPuF< zeZMsWxMe%n#49l~n6P^l5R|N+m>BXwIOB_Kmqwzt5_l#}`?GJ?gso$IwCQg!m-yg& zZPacz6Ty_;$`T0hJ+I~tc#okHivfWA2+W@?@g+7I6cnGD&8CDf zAuCZk6kOhNQ>!)^*Cs0fyaC!1Yx?18L-po=809j%#M7S)_FAtuBUh3;{*|Y=U}T^%P%`9;L6P$W zofD2mHn^3X55G7xeY^M6p9}=X_hp-BHJx;tUcBLwau7_4b9!(i~%du!bP?T4jOaU`o5N0acY8M1D zMt#YE%AIj1?KZwNx*sv!3P`Z@SvE74y+%hgyJc%sun2*qK@tlFsXR)ZgNcHfh~H2| z6BkndG|gy&b_o^ZVmj!}gy)lJZc6$IyVY+@J7+tcu8ttCe-p#A7HE4EOrkjUy01(| zea1sb51qjZowSs&RDs|?uEQ5xC%h#M5grUpno`_ff*1VbAf!#xyo^$TmFW6?ixCTS zs7{yWJrSKo%?P&1{n8B)xLOgB@T!ZC&hX@p42xsiL{@L{QVPQ=6IXb!7(0iJ@lb9 z3CdKFxzbA+uvU^`BkZQ&9;*+^81)G+TD&VZ1k}B%Mo;Q{zXTA_0{`r=dqux| z5Y`~-=Jew|-a;jw)-*|y)}ATB5!cw$RF*0Q52ytTm3zEVcjn0J$ zp99pWSqd%;C-aj}z{!SSX`)@3=8VSDjzfNG)fE4GXXWb&6eP zDw#+bCE@0d39PE-`)?VvSUs9QN0O(%t{PpJL&IF~W@S}EGCbQkDBJsOgu|FPA~lMy z3?{WZ)ow2z6*m+IS4uCWXV3>+KiHoZ9t@H|&(dzx;Rn9u4lfASJRST7^|54z;sqGYr4+n@#KIU`1hk_620 zvWL+ALl5gHa&xlucGu0rK{E?svlYTt?3}nOb3|`2q36MGdiWQA}k;?Aex27=Dn-?{q29?Y|ClWi(qn1mq;)M?Iua^m=b-uRMMK$%D>XYW{N+Q zj(4VqEYe)Sg&K_Dnm@$K6hnMtR592;@sK8+(6sZqnRq{;i7PxD}FW@+H&kYLS0BERPbfBPp#o2Qrk87A1fDaAtqU*d zll9mQ5keB}%%1zF+KYm;1ec#^%X042tu`Qfc9ntjpB{yje`BV62~lW$9<;Q(s~zy4 z|M7x;IU~=g9tThESwO`;N2Rb+NFE-_hS=-J{4lglco>1b$JJRWVGCf8=mq^rqv9g2 zMDfMOb22lwmfZX|X|lG^c#wk=J&aJ@s;_N+J7^J6^(SafsvWn%rSXH9$=wI(8r6%E zZ{~XQU#~xWmkytMa7wF{O?Iggv-6xFN8yYGh}NWNe*>rM4emiErJj6@)AJ~z9A9piolfBQqepALdg^#(Uuiu+)h%#01y*v&QRcYR6y|P|E1%aXO`N zGJpd<4f+!x&R|lFdGv`60GoGZde0!3VU7ktS@_RW%wkCOUlu`!^HNaXecD`|1XYfu z0EJz|7BLYNbY9lMqvlxCKW`n;kN&@dRnBr`2N>8*?)M}cRP|vrueJDT$0h!(!nC-o zCy8&nd10seK4OiCy}*yWT@!uHbCiXQe=fw;p2;@wp_BUE#(RM#!Gut+ z9-z6%(*H6n0p)Mg?$MmSy3x6|!!*0C9Eb=)iPj+rP6oAel(A46c`s0%-GCxQbfW~k zM{vA-*qi(wd7EB$F^^xjfjUnkrpM147Fur)?n@WV>*g2UlP1S&7UyG^LHk=&OCwgR z3bUp_A#%Qb1oIF75-xfrlnu3ms;2$Y8%&w@?2LnTv(i9U8D4g8`+t_M(-vzVsvWz% z7s1kGYZzx?;A>X2aJg$p3*C4~MK{_Nx5Wg5_y|9M5)PxN3bBs}4|2KRV@};Ci#>?* z8?fYlj5Cpwwy01iek+sRN(zC9u)b5#e{-~G{|H*YEYKG7dB_vKupsyCWQzB#;9pFf z--}DUnINRU>5z6z`1I_U@;tk3>p1pS?WUq;xUy*oihk2HHif$3EY`f`9hOWyCYS5$ z5TC3Y<3f%qrv1i1*4tuORbb96A0!r+ic$e16fgp&%V(ICq6g4kv zcFDW()^irD@Oot!Vj*}6gbX=%78&U1Q^NBguE)Gxf9d=~dZQbiB=*T5e34E1v`%EC z3UJ!do@fxq`lsqV)y2IiL5Gug+5HJV)T<0t=GWw9b8OwJ9wet~aK>Gg>b0M3H4hkA zyZfN?D8^2Gxg#p9k@5iMy$7Cf>{)UtTW=sjsI9xhqD|Yqpx4on08{ z<%=e#w}cUbpF@)uGdV16aaRyjyZee1BD|ZBlH6JQ$ZbTAZYHiD8-JbAE3dS}i4cdG zPtACYeJL03=JMwFa;LGH0K^FIc6N$OM*{wyc0$XD4y@qf%-y(E*A+dbrV?qbBv3mu zjLC1;Hko>qT-C#w5R@~A+$fHTbpp+G2JNFHr<-ZeUp~}3|EtsS*tx&B-<`FUjBdHK zX&cKZxPzihl};`;Qe=Fd0dYwhv5pUR708`8B0?a;kyp=#rF4utv$j0c6h&gLR?q?>Vkx)#sOPbB9Yu97G@NyEuOuxG#?h zS*=5WEO}TCr(+m9j2f`K)=)zmR4)g~5pk`vz?2iH_0Ic=I%9%ur!>c_jlvXsJIMKlVZOe?D2h~DK=%6 z{RNf$XRsh(D=N5yxN&-H;yQ{ZbJoj$&8i|DzVpx$`rw(j6dAvNw|Oy+c#zH;7r+bO z%#J2?w~Kn9oBJK>;nj%&`nQ3W?CzJUr1k?^1sHpc!JYbCi>LP;$j+rPJ+(2*N4CZw0v6~|kS%m|CRk8RuMWpSI zW1Y7Au9Wlq2VqDl|2>z8AcTBskWI#hn}-*FA5nP0E`=zWf3eXj+WqZ%LDMCA)rbU! zV<4WK)lYQ;dAs$Tp2@ol#Jt2V(^>GG3Xmd@)pnBqAcu&Vs>;%vT z;`jvA3j*kQ^(%(%Q+SLemIOT)3@-xmow67r2QR9oshUoUx0GP6!-t{mr_=&2i65W7 z^WNXQ@?==6Kso5t!pVWw#Cy9`Ne41&flPja%1m4+3Nz>uMNkBvE0eSnE2hc3!#(xr zJbrRsg;|rdk$a{w=9~)@q}$eL5PTw_#MhbQbUi%^S=*|cHSxh}e8zG>B^|CkGV16Iw==uXvHLIU6`-{v`8U-nX~->OB-48yD1UL(6*%!$uLbgxzK4?Y3rbFhcyKc zMcsz3$}Wm_jOLT)9^H&-z6_BVVR1=HhpX7&X4T3KWSX#5^Crl&|Vb zmaf0-#VS*cCbXdGcaQdmDlIv900n%Hngsa^$#4y&^*R!mT-L@MvIWg)p z5$>JKw^~@sz@Gsw?$PS!0IW+b)zLk_7p@_}V_<`WA*Ve$TZ$qs2h#1Yf0(>QS9dD% zr5_r+=;OlGlSa2E8Jr-f*5jcrRn?i>gLD?6EBi=4HH|p3Q61ypsY8lfXhIc$j zTb4M)ga+L=IEN+Uc?GjM4SZMFL^x)i%wPd-2A8CV-T~3e|0x&x{#!1HWBA|452nQY z5{A)&XR9o1NQDEsNEAcx6)K(!VN;!KXRp$n z672LTgxhGpzj8cswyjhV?mv|dR4uh)C2_HJ(};YuYPlh#tMc)t7Sa4!O>!&XMnvrK zh0QP?x$)X{I7#&Q;O(|2Lh3DGRIePgW2a$B zPqOM3H5Jq=8JEl2@w6Td`$HF1BPCulo{R3XXD|qY;Z-rVEzb; zEphlih31#{xNkL)1AVQ60`af-=u|^}GYhZ6HM}r!M>L{BE?CCdV!`Yaeu0w{evy+CzM=kkFWINW_eaOt_nCfHt^T*iR&&40 z*h{OOZ*6UJ=AX3;P~X1$SvAyfEnKkR{dSz4cdkzTu&-z4sd36fXPWAvz2jWjvTkh5 zwO&1uJFq`z^_I_-oIN`Ucy<yx&?CySNcJxmj+#%5!%`DG%V)-7+1Z^b-u1AU17gN0lf4Lf#D=w-xm|5QjH3ulF83g1zx$3aaxKB^0-k6`lcjQ#3EvP z3#|Npeb|^a^!J+{RgJZrGeUj#qiKqD+#&x-Yx958DhPcJenh8(_uk$75jt#UW&euqPWc@OLR##@^%IEc+3>=XK$ zD1%>ydJVKfEud*-eZ`&KAQzR2BIeOc>W@j6R9WopwbEFPO)nqN^o(g734hwEo>AW8 z9sRtkSdtRsXwCtz#vu-PH8SO*d6JjpszYD8MrX}yC*l%-BBta z?9Ro>=k;N4Q28gliP4zH_kAu)49igLfwA}@oUFs}usvDPnq6wv?Vtu*iPVqaCPV7yD9}txPA7! z*RGbD%r?2lVdTwyqJ+G@l02sNZ!BcP+>5p&qlyp7OeRO^Sz-6e0OZdo^& zzB-ioS?5qh)FShN_UoHDuliM2TRGq=&5H|Mj^I+0F!P9Qr+qy?JXVfM9V1Ut-6auo zbbY06vqUnV>9I%g--cQ6e*fPj`BnqHblFfe>4xu zUbua9s<@NWiBxT?sS-0G1c5{ex=1HzH4u~<4&`u?gf(~<%>T@x{VM=eE{62KT|MQf zu@L}rW}Yw+qez-vI5S?59Uj~oYfr2&)h=QwtHuG8H(nC*6*PSFKPDcfBDt{*Lr{6- z?+yrmIjo{lT!u<(K97(CCVVfnzs@!F<&f-s|CoQOm(9_f>H$ihj6nI2?K~jXz_Z=h zSc-X-(qYK)eY2qVgmvp%I{tt#o$y@nm+|Yw&qvcE8e!;H76J=qq-A{(9N2_v__KO5 zwoe*z*mRM68oNxpI=xy3tOijo0?G!{@{z=+<*~kymR+AI@&UnUv%j+S6WhHjW(Q>M z!r)DM2#aEOJ7s4$7jcpHzLG(*LbpfR+&{W)iI?DG@8D?eA7CAxs2DEOVohfZGoz)r zTH7lpV+Yzjt?JOTd{&Z9XI$CTeQJ+&ujCF-I8A0E>IYZMuSP;48SS69h8vgP^-HAc zM>LkDRH^Rgz-z<=FGt`E>P<0c(f}E%n@}whQ3ii?d=OYV}IxsFDaoE;j=DfVm6UpGIVax>J)hRj) zRSxhgiyDWEvgsiNtx>TF%ae#Bfr99!tSuTo(Fo|Egt$ zyX@xyQPf9ZZzErB_oAw*!~eroD|~O0 zt9U;Vc8H_9ME^Irw%cTU8UVYilK!CSs=YmKSB!I$04UnIH(iZ!JH)|d+fP5l!6D9R zkGQr7|1Z{9-mb%qx`m9Li-jQZNXlkq=|aTPYOGnSGJaQ4{R-Clh;UPrx$g>Otb%~CAu475yB|SE9Jx+ICp&tkMlS*^B@y+gS^z7r+SsaJC3T&?} zGj2mQTpVHlX5_$dNT#LT)3LAJ!g>G;by5to7Utr}-$7bpg=01TVKOL+1 zQ-^xASQ~i(>Ed?mmb^#5irge2>bai{JCXx5(0fbxX5}ECb>LjE1{Htg%GqVipoNyD z`!91Mr==S8BOzkG+Z>#$es=IOW)_FLJLjo<27Gh2IzR1`sg4ZWpgmN&S=hg2aH6}D z4)t812?%P&4FCskB=mzlj%%;qG(=kxw|6`y_^Zhs@%!8txA$FVs@i1%z9;y^f#@8ZY z^RGlEOV7OWr7f6r;cYbaRU$K_dLXyoTr*gLprU0&RAd93KO3?AFBn2T_*+0hnyN1H z8Ekh+p90_(fbTFK9WN^I=3oA!rI`NquOO)=CUU6IJN6F1Bk0m%P$ zW9R6#3wi1$XataBs^r(tVxzs(APcU&iJ;B|9Z%xi%gtJ=$wA83XWj{4moRPdCl&+W zd%8)d|Duz=gyprlwMx9RLS6+=%Z$z_!(4`+UBip>Xd(hZhcn)6>YmBgmg^dOd%VX_ z($^SZ!nbmwf5u`lzHe8&metI%B%9PXPK3p5lLOE#2yM=4c+r_?a7O`8MEP>Wlj63s zlo8d+$I7~A6yhsWIS(i0yFl;HFtTK85g*5aQ$>sfC#djo+N^_1@D{7sQvWa(SS((9is1swzEb!DxA3}^hjf4r}3u*_|Vjj zKS-(1S}Ggo#Z(E4mK@l$m^)+msGSVV{z==q?M3mRodoHOhX!NJSv=I?wJ_ON1)+O> zf@B?Hy3oIHbxm`KWqd3e7^5ZX`ZVVd47M6=*UQxW*1Chq*BqnZvUb=z9Vk}R?` zu6*ymY@Cn#(NHhGkdp#qc!{D~!k?%tn><(%Hm=fJxC|jmnNr^(;;&Wci+Q-BFS5oW z;$JL0&XX4_{3>z)fVc+R? zLgvBQ7GYct*5spt-5uCVRMJgZDiKSL!6bWxYbLVlF|571;Y)qD5hfib3!Hlqs0k`# z?ZXROMtMJVCexAhbJ@AJ{*B9*rr9eRoH8s3(%9qyFEbq^TxH(5_fj0fCb8!T2R1Ha zADENUW6Oa4A1ozkE5U&$>}ux6>Qckzq+4nft_D=1wiB*>@GtY0;}VIp625hi&bqS= zHMH?S{a$cVg>`}qF6>=j9AI3@zqTk1KRL@W>2-#ZHaK+Vh+y)0^ zU-J4-YTUOdNmC^!juMstQ2rp@AId%~$L<2mim9${%I4HC{4XOMPD-(v^3`rll*+YS zQ|_9u#gxDL@ol-LSV1UUq)n#N>+6!I?Z_M@-vlTO+Hv~6{TfPYPu)I+b97Zs|4vbq z5#j$&;Me00-A-2nc0m*2Px7lI*q$V8`$71Sf-K_DJ{}8-W|-PG*E!(Q4nUPGZ& zCRA*bX;j-`=a;^aV?NqF}MNf_W!e;*r4S)D{L zEcR(TN0*339KI_Ghp84zKHVWB(91!t_G6rY3H=yHw5Kf3ADTdQT$SG_dxXB?O(!TU zW9q%9Vdht;n*yh_9K#Ex5Ps;vMIok}VdJr&uv0%NM~K-~ zT*e46id)EX%*t>tgKi@L3CO76UsBi9n0|f@9=T@oo^|CN|RS9I~L{U(IAX|qOreqno^tY=ED^fYd0hfHx`gG+|tQG(&x@LNES2* zN@;DW;D^IU5ss`r9*XX?*%L?w%KN;onGyPDkv`w8 z3)_JOQ|33TZi|~I0h#80cc}VicS|!%l+L|rax^wtfC8Z$ma}HLIt4KZri0#t6>VS?n{BNkWGi3l4st z{j&B07fY_&q`(|S0&r!k%)}~a45NbL-QR@L9}$gwgI#AEsN8B{X*}7D>NFW&OEu$U zOJ&Y%{vM>J?Ceg!mOT=pGO9Ufnl#%} zjl&u6`avN~5Lz;`l5T2KQiB=GzHDyzrs4XHY$+4P3}m_2CP*usX7(76E4&*FynWX# zIk+~(wfBBF(_gpL7~MvnWeV$$BN;B#9FkXn`9kf*Z?yAfl9-{h;D<@&$r@9?;5{84zy#{Inr%jsR%^G)XUBR1{A3Qg+- z#c<<rag`a^YM%bwL@q2I&eYzgR?K z1izL=sCW<;*Bcd#kRAe$P`HhN5hN=tAtf$f*rXe0+v?TvhEhNPRp+FEOAk=SFjX!z z2@_BCUBcf?vFBjvM>Kty0bNy*f(io1WKO8tw3R0O6<-nH9i~C9}Bf zy!I?d9+E&>E1nEAAGG5imHZCYuVGQCiQnC?vqK~UtLu7cK!{9(2&u>O8AEPzv9m&5 zO!Yain}jL!C4(}t>9c;&yYxVJzRkdcXyzCrhW9U`{=jjsT9Fe>HAK9wBXN2y-6jA3 ziU^uv)ic9y|BvrZKXeAqG>Q1(7%FIktVgR*U8WvW{6}*=(s4A%40byWq#i^O%aQ+= z17EpQTuol3!NxSaOCpYjTwxITea;+gGJMJ&N8bkCm_L z0&oho;RFcMR6Gz#pEgMKvjxczURiU1$|jcXXbP56aoJe{JEh{+^Zr)`?*yEq4elBV(l~%%6gJ6M@)Oxj#%3+NaGb3 zkc|8_u2J&cQIOw`N{xWwd6T5$UxZinwHjcl!0;ppg;o@ibK=yqL{7$+ zL>o}5V<;H0Ow&XWw1I=8+=@U_Ru4xg;O9`WsF0kE{V?|UC4Snp7||L*knx@1xsKcZ zI~;hZd<(x9Lj+$6|A_mg&PtR8tnz|LjvB@s^**i%n#sDpevYbZwfva2t(Pgc%2b_IK zst6_R^cftEwIV*Lty{MjO-=x_UU=#zlnU3OUuJTvTzw%x-N6G4@BXt6Of`m#X`2uL zALnTZoHp&etF)q&kn{;P1p1FrGVHpPcEp1cko+VibC0KudA#d6GdKvXU=i?#*6FJhyB_ffzrk{PW3B!&mT$KHRM1Ecp*-i2QtsC9KJ0t9X& z5%~QN8pzqv6ya2dEE1^HyZHfA1h!Yyo|g&OxYn;`8i_cTGZbWG+T{ z#IT3mtmK$r2f%l+D4z%Dewf24qoP%Zt3I+opHM$ZnC7YEu|=?_rjv+BhF?;VOPay7 znB0FkV}*lf*~jE4x;l$0Z{sp&%c4m^SKR^mX4IPk>M1q1;h%k-2af4|zUQNE;^oPWpujBP?hMDXGq(rywMgIxv>xz&zZ~sOdm- z5w=;){8<>^vid??ItAVApIw47jJ()J(1D>UNt(H&F(rPOEPhbaT2zUdA?MU$2$N?e zZp$FPxo)cX$N@KYv@(zBBMnfP%%Wf>n$9}ZzKi@SwMoX`AOAE%g)#GsH;nP8e3q(h@-6tJ@^j|~-m`?~7Clv<<=DTE9~H4OA`QY3GZuYJa1 zG*E+$KD~uLu=t+WiI})-Ou};IAhaQc6AX@v=H9UrznQGIuw2hdrKLW+G1s}it%v%Z z0miIXLS9ETrz@$@e2E!;p3Oioc3!7=S`V@)W16Pxon0gt!|b4azDkMH%v=~;&6U!< zWrD&jEQIbm2tO7tr7;*MX-H%WK6$|i;wG-n`b>Z5lN;xp&2?*O=f(@>gZ$Y4?&12w zzl6+x^;2d*SBhs#88@24GP={BpX%4_-+Sx;{{=)-d|HTVLHlm1HB!EgCgE8B1A|f1E;$036v9FOC zln~;{l`@L7rjnY6w&1JnkhkLYWUc&c&O^QWyi9XuqCIAC9F$-~f6ZVmOyUp@7+@nw zvWaR{%1NlZa}Xvy4A39SastjTjz)L+S*~)9B3&&sNvuWwnJ43NzWjt|Dml1CJJ$|^ z*y=}*aGUCMpym_0Z$?@ZM=NrH9K5YUv|IF$b zgjPU}T|!~_eN{DGnLCniiIO;`-F=h zuc}G2E}=VqL<%6er{hufk013zZwn|T{smk((LtA>9yq);#TdB2*<~cmBV5gKY zm{q0a`9%HX3L2~&ANp1PN#5&(3U7@+rZS*C>eJ|}? zm9GYqb1G_%vDraKTC5I6Bxq_BX?H!9jP%i-C+h)1U*R{?-v{Skh>Y1s7v+t<6ghg2 zB#2u$W-!RIE{nI^WB-_@+aLQ`(X;c$U{Ak3iWmRU!dX8M!ylfv^=hhV3VW{vd7G0R z6Ebl?)n{8C9G%IbQ5iI8`^(U>594V*{e8k_gJwX`Z6FH}MY>m?dSx&NLvkok^H zZk#30k>m;~zDjZfJ$bsMNKKZjs3FJoaud{QA&$0jxoh-eA9$!6_dfTZ9S7kK$F{hK zp~lGx^tij(MvvDFfN*0;$PNP6u2eku`(a;DIGa_uHyt909mD)BtdtE`aQ%QMsH(B@ z)^)R8dMjrkHHP+_R3YbF10f2nxh-N#L?ZjkCer0ViD5#ue$GiJWMQIdSl$1Xn$q~ALw0~^GY|Hx|!kFbbij$hs?@dwcbS_12 z!2dzPev0p@NiR11@|rQgPA0SIf{Zgz6N3LKLa+fJ7x^32^*NjJYAYEh`{_`KTNI8# zGwLfc3UkRf&{<`H&dW49_ZJ}e`q<$5n* zpRCF#I0pnJiJ*L-AJf_S4vjfM;ih*5*h>D(pHVVLe``EJp*khOF_9D#!!IWM(^uUA z|M-~2;UW+y(Pb^TA>UmiaW9HrT*aM_+;^I3-v z)Ie!zX?Tn)4wKaYCEAWsMpzNM8**%R|`ZxS_RVTL6tC3() z88sW{$J{^4K)%3KK}>Nx>?NJO>FL`~WRca+-02CqB!MKT#APn@SA+8G_*W^uuo?2F zRyYtzz7b)tL&R`qc--r~C_B8Vh7s$9o?-kbO`3`!VPBQSR|f=>or%V=*utJXc?VY{ zzgK`nu`E0wZX?nOY6a4hj!#%rddJND73CejdpI~CpJ{)&-Ss#|Pjn75j*qnv1*1au zb_ICT+XNIwz+iH^#&d4fq2AlKGeUE%hAIx(w*2L_?@7?%f#ZpgdtS`y!7T)*M$}L3 z`bIBon1H@sj43bBg1#(QzWJ$Uz-&BTgdZ(IAB(NTQCV+JxZ0F*`Ng`b^ zyI<2-H6TFSZ}5CCh7o9d2<6kceDp;tQtii$lVTYEwHNLdz{mzhrmTOeqWArSM_+vf z*%CwKB8sQhSvhx~5?!Y(P6*~)^5^}QD;&+vrs&97{l4Wd`}pPZ(Erpp&~!p5RD1~mPMHR{1>t=J8!H{~>Pw$|m6cQh7B0Gf z?gXpR3U1YU;0N*Hx_)cusd;}iV3cQeur5>g@{A`Q~rLw9#K(jDLUo^!rm%s;N{Sv%IcYje|>E2kqf z^pMMU)(&*(pO+*P>eX&qm1w&w#)Lf?;Uv7o@TTne%F|q#;!f%eu zb+9%B*clN7PM={h*!{So*O<0RO(@9OSO*Brl@lb!Xs#c3$DhQ}V@7naAAdj%8EaLS ze`A9oYK2Gq5-ljq6<;ATDI1l!t65-C;854GRQZ|8T)QCAHYiFF0B84H$~WXUA5=Gk zp+Jvm;fErQ#72JT@K4S5I9v!vMm&PQZgxYg9HTOXx(X8uy11qi7k?QxnSg{~2gb2; zdivp(y-LS$5kHXWK_;+ug#x5t<4{(M*;zRkH#7hCO?*~-Up^$wK(K4Fk>DfmEw6^B|bb>gTPeAL;{Jud+3R|zQsE(O20%*R_;&S2O+!7ZgQp~I-&Ew zT%$~XlgH^V;1v!UZO6!eu9UT^LQcS&{T+U>j`_~y9-2jLNk`!#qaQ5zDEt<`Yns4~ zn6P&vq9z~;k8zxqj-A$Tn*BWUt_9rbfmkD8m&AamqJNFTe``WPHGXmC3`?R}w{kze zkPhxb{+9Dz8CIp(n_Un+7FQihuI6i^d@7zYjF{6NNUPH$MvdASMxIL z(o#h1wspBZqv!HdcFhZ0(}JQcydN<~9k#Fn!DJZi;a35hhjrg1p9iEYi>GTXDE0p3 zK(RfEpzQh+yfub_hx3*#RaYwa;9OA&f}g&(VF zd%@``QcnK-XvYRPBl&BvkXsa9%32?{5|NT=18ZNc)KaR1C&6_94T6$zOH2C3Jxiv% zXXx-gGc?`95L#a5RqgU{X1o%4c39cu^kr)*ffT!&Jsx49)*VC~INYA)&#%DhDilz& z#leufxL{oy4&xMx2Y2{j(-8)_Eug0Mb;tD_(8C6>uo)I7Y!~*MKJU<3?848Rj?zi| zV=%?zT=~pA`2H6K4JKzFGlGmn)R_18bn>dPj9L|K5D8oHJZ!Sl?Kk6__ZIu~vvfeT z1oPu$fe!3*C0iG<9%}E)uV3531LUJ{K3X&<;$gn}>_9NU1z9M2p-wPC$IS=GJB*WO ze{bVLBQ*!)gDMVeaiPHTnotCbd9q< zBj;vv=w&wYsH7~>RwkRSRVqdB1jr_d5GCJI+k|D}G$t8~qalMAwH+`1^q+sRUBp2M z3xf>CZ4iza@$cdc9RuGto$YT?^x9$7-YlZl*Nq)rkEQI6WowMhra~$EuZc#!28${7 zAfZBdEv<}Lgr(vNMG(!)W_fJjSY5$7*JF+c8_xzKHP2x@mk2#(V3S@J_c1|S=cccS=Gph;{ z7mUE0Zd@|61IM$tq5>%;lvtmSa1(y3k%7T4r0av7W+@66!Paf~|-#bac|kW~F|NU}cL zcz!DuQVw8krj^wPR*Xy**?qaOBFdYrl~_J?dm|)`k)S1NvkAh$3rE6-j3$dEIi|9^ zj3VpEF3=u0pd*DPt^M*cQPURH@qb&=M=6g>2{-Z78R7-!7a~LIGrfzk&mGjuevZcq zRO#!{0pE<{)zN%8;Wp1fzVi??wkZ`xswEi35Ic+4COD zR0^@P%hDTM-_~bq*yGR_MO4(Q`?p6v-bb=k)Y!4jM|q+gw{K`{*!NrJ{`SIPjxM|y z-@NM->5cs$CMK7GDJT&TeFKsiJTq77@!?L(q-gIAYz2nebf8VtZJ~B>FHljAJ16d= z3L=H_Cpw6WRWQEb2UwAx&+_efYMNSO9m2eV&vT0c3X1coVLtx@zf-z`5$$jxrCxlZ8wwVFJk*Zi*Xwz4 z%BLH!P6XCr5NFs1eg7!TMU&;86{+l0DuegW28NO*IfFvtSpxlMb^S-Mc^xq#rJ)2# zs|C}pV}R8okH%*7(m5@pDp?qybE~Cq8H5n6_-u%#m3%;ap|S_K3)O5~m)gtQ8)oa+ zwM!17RNyk3uB^E@h~igRI?>L+rVL}i`8r2kUHE#y>0|R7%t~g7YKjLQ{`GcZ#tU4B z?j&iulQM_SpsAP>9n09d=F*b|(dbO(?^ zEBQ#kOvtK77<@=vR!F=Z(Pt@v9Z{C)gLRda+~&Qu2&kQZfT;5KpXiGSx{)sitP@p% zJo)`NEzYZhK7%N<3rJM6TlbtxLbx)UkraCs#=e7l#n|m|j-m9^M{WC`mZa48@s=^HVXv{oaK$gg%|!mt!Jtq0k(VSNkTU_XJ9w^KKBQETP7OxgS;l zQ9N0oDa+BvP-XqCC4)|Ki=#)ydv1V0M0dDdt&OM=DEKn%IbxH@u#-Z!7ymZSZ0vEnGlQRu z_hfNFL>Pd7JKWV`7OE$<9l-(lS1P7|G+626o$VKRbS8Vr zDDpKbW(J>0Kp7g7dPD{W#5T^UjU-&D28D!3NJ)+)?Q@4mgGx{O2_R5*JX+3G%J>Uo zmNKu2X%?s-*`Xkf%6IOvbW;t~&4su@@ANq`z_bTa z`A3I=^055g1Y-MOG)TBoDGCY6&4Jh)^>0nFuB&e+rU(zIpG;z+WZ{T|o=9)C-0|mc z0gBQ`i1>|5_IcE((8dcGbVwsoR6q_N$3)yqzy<}HMwkat^^sXZ70o0}%E1*Qg+pX%!JqLhVXbVL{zx22b3t_OG@2H5O(P zV7_|f2jzc3JB=M&a{#!_uH}GP&A{rVTzX)-hhK)wVrXxZ<&P`4c!qEROXiQ&k1Zb) z(1{K9a`#kQzC9j66+GnzCc%Jex*jd=NoHG$RVYGz+W` zE3SL(N1ufS-G1!>ZYUU?^h=x+ z_-wAr%r>FY0H9$eQ_RdU3f?eR472AlLbO8&6UNA={pEaG+yyNo>ywVhNFuf~eXHxL z!9%8OqZRfuRhJXWNS?y;H8|Qbhb!J<0#O_H5SiQC@dXKD05~oS$@d|o8mn}zp!X4< zgDMcWPi0HKZ;=}{+4eNiVM!&n;9h5amf*b&YR2YQwS600LxfQof>4g$$;U>$AAyv- z$dO(z8(3!)=1wtC(z?_65^g>BG|jg{+H=-b-BpFBe!vFQ9&Ez9LSbj5%m&4daCf@hN!(Y|j4eV^R0hQ%?!s>J#u2U@M%UJC%yx5%Q?YWA z-0|5sd+XrAo^+tv9H|O`0p)#G7; z^SVkYpAV(hjFJdjrjKUtng3i1k5s}~GSf7Ju0u1Fo6|m+P0>2P{-dveXkVg!9vkcn z@eXIqkn$}L5V6A7)8`+VjaW*`3MKB>@V_^Y5dY~*MJM7pJgYDB4&l|W^qE}MC;RN7 zF%oz|`e9$)1d&-bZQ`|P|8>){PaW4PzsO6O`MzJ}ip9@Mzgoo{pgoSNTgT!+>)7>` z4@uZ+A>pc#&V0Wt%MX|!-mk{U-!fOum|DNZB4%xvBIxw62JrzBpbvibCPlLMW@qnZ;LVoQJRZ1oA(6@5p^9m zp?eM?$1P1F_f_-Kniw&5X;g4lepBYG3FZz1UqOFkKBZ%l;VRGH zqd z($E*kdA=8(6`qshVo8lBp80-X^@jJ*=xFHDE$n0GGB2s1)mWKV-;8Pa5o-B6maQlWJ)tl2hB)1Qgpx1IFlm9ht94z*UXCUj@wYL^``0S^D6|DGEE z!54XBDQc6n!PNlJ+6ekl<4KcW1Nw12OKaZB^zzFVPXmX239t0DO+VjeDMN$8Cl@hj zH48yHdHmobUE#))=DvpdBrARc1V4sz0?xRqEX3+rLU(H3LXHH-e@PPm67qbH*c0zx zY%}xbIaWnw$5nt#pC9(Ii%VB z&V`_uGp73mh%3wnW~jeq#d2QEW&#OSPf4!2&b zoqfC{sSUr5^lGLPCPm@Qx7n+&sOwj8$HY7<`ZuT@vAYz3MZz~h@TG$+9XTBzyRt+T@{fIepb9*^)E!D|7mQHmFVP*mnFF`< z;O(JAMj<0WdMAlRLrZ3DvyN1K5Ty#FP)hv=2|OUPVyP{cN%$mX!L%of@+mj$PTVW_<+e4&PCK{_Tr8G5=UOMtzQpwHlw7{`~euW~JuD?f}jvOkKm59W) z*g%K!Gyaid)E>)?+`hwdXXM1IU+ewZ4b89q5Il%LSJ?mA=*u2If+hQ~M#s?WeP>DJ zLxtjf%8@H$R(^O{c3{w&Xk3N;su&Xs_z>rT0D&Cbr4Fma^{XgoQe|PA)N7DNw%Q32 zwjBrSSL6o)n*zLDkn9^$Bn4kRr1#cAGO~HRE;3JJ>G3VCxN6W6h7Pr9ar8U_0SI0L zIKLfr4}B?ad^akIfj6&mu}elGXfoRz;}ZrPBMx5N4CySxVTiGySUB1@yE<)E4Oc+?wf-)q=H<@M=%h-L;a-W^8N zE#i@&%ii&iSJ&pvT+u5=ni+%~e+%wu%lfRJ%TUw}Ht1yhtx=wd+}lC#LX$yfL>aqz z0KY2|a!v75c8Y4>*t0U{4^h17hO=0ajx3<0BFVIq_nU=fp*VMG*P%s+>^%u`I1KZB zq!0`!8_u2*3n9|;kJ>YXLiHXHWtoBg+d6wHFB(K^WEo@_!mZ;pelM+Rtl^b8;Y%GI zhi%TMuNqkNENU>I*j6AU9LSY;p5SXa%dVMf8JlR@aXdllqp&D`phsMF!eM;*$jhhK zZWwd3XyS-dv7#Dz{mMn^VHq!Meu^|+a0!zs6HwjEg7j{_qjeFNnk)m@yhKsas1K;@ zLlZH_!c2<9&;=snBcL{ZE0wmn0N6rEf9S|4l|*u6lZQOV~7a{=R!OEk6rnb6PsihTIG0ZzZ zDgMH?M`@+VQ;y8Bj>X$<#Mf^g*&1iY-Mi}r4)42e zYs&G8CzLj_rFwzI2VtS3pF7xHGM-*7GKwP20E5S_p0ZLm1@ReGGG9Tqauu@l2;<@p zY(0J7WICJ)ZTKTX(~AC^btgfqy}^p6nV5z5neqBNG4)L3Ct`J&$dBBpW!91Pkw@(O zDPVQ+H?vz20j{MdMhD?1O2=~G8x(s-F`Mc^kl9b0_~q3g_>rB5A{y=p@7i%8LzLoa zz)Zwds^%t)F+qtq{&Uc^uB9Ry&)SnQ=#G6^(xfIeX(Q}2HpQt_hPM+7?M-J$`x-ZPexBee21mLJVnryvi{e-=*6+k=`P4 zd)Y??^!dMtK4kh_R*vWvZWWgrk}g^@Dt4Lf;J+fyi99LIg}T!eZZ?P9RrU3QCOdqj z2zRJ$R9Q{Wo#Hdp1G)}e^w9Kc_}I{agi^p@))iH_dw(K{5fv@&WXGCNSrwO*7~ECNOt<;LQ#bR%>zBYd z8;6#h-R%f8>v1thXznsh`||k4WQnO>0?+Fk#4c5 zY!7-pOdP)nOYfauy$WX#62I}J=^@Mv0R<4-+x+JA(R67`#Jt)SSRkxb<}iCg3S&_U>hXp`Q?>C*=1H2RUWCiP&BiWap(=&OS0+M0FW$Z7e+wWIr(l`hAHMd ztWUam;))rYY-K-Dpv;bls;+Rl9;j84j%X!uSs6`S3%SPoR~sd00U#LKaywd9+0XaR zAO9BiR3@nT-0igL_&h5pHs}wZTz@x2_(#qfum<5<58nvl;%#p;;lAHj@TZTfAN=IV z5u8iLGtR_!1^iaG410WatGUsd61Osp2_)CgewA-Mb#^Rg**gDyTy)X_M-2TRczEFubFN<<}#CQocao?Wakk(^B_#8{)#x;CbnG!F<+KT z|Mi5$>w|iLaz6dGKt1!=8(#~$nK_#04@}HLKAfhto~D`=xDPWP#&!r)f^<8K6(yZa zcCN#cKF3Oh=oQrgUYR*-Y9EC5-4X}?2yzJ(&svBH4{`b^Fc+lH&Xq9wr-n0#Nx;~H zl=@vZd*uj;qpMw5k$X-ZOEVh^-etr9&0e7DsH#d^!mSzUAdK{V=&Q(&vC6sIR(?pb zgxs@Csbk(g|GqP?>%H3DEx{iC-(<0+;L4cX`?tO+I=%NIr~VS&*GulIy1Ehh`3k2g zqK`W1OUYYC4Q&<%BC=1V4G*x(ugsenI@y*=q{jNtUGu&c*SZHml}xi=7b%&!e>Ogt z3VAYMCSfGi=(7rEG&IBwxp6DLH zD)<>tz6u&|?fIo9?7#{(6jS3jq8u^th|>>4CNq~fV#KJypsFHlNV=W4T63sZbrN$k zjYf@Jp=~5Ojm<}UrL$!+_98fiiWHxThYcAHW)dX@+1*Nz=fEL{P&dj-HA0JV7*dGJ zfD>EQ{fo~X=aia#Xp~_G``urdSkNGQ4@IWRE;V2G)E;01`Vub)r+r;iya(YfR$6&&dz#+ zzpy7s0OS_figXr=}p5|<_8+=m~{S!PT7`H5IrS)Ftf8J#TG;c&39pL3?Y za?NL@jX-0dnU=R#DT}+&qjO9u9``A_H!xY@9Y!oU#EWCkLl21 z0|g{R$+?zA;+Fbx6~>{%pvX!GXLfB1Lt$KG?|@Cm&KtA8G&_!nsS_OscAnb+{tQrJ zD!Ivt7|ZCh1Tu<~O_GT}*OBsil-UO7RM=So`|Pk&-KsHL4i?$D=3t){i0wm}2(GGo z7r)v%j3{yn#8$SC5`%)6?Apv6V|Ll+VPpk>%1T>+&QTN$nH2?_Oo|F@e4?H7$_8L{ z1#%!I#{}b%!gpz0-oycoD-zyY%KL8_8@(UKHxQ2brx7Ji?Aaa7k(5(X>aH;Bb$EL4 z+$!)gXD)4d)j4A7#91RZhS}Ztkvl7CQd(GnxOAmWOQFL>-s|f&FRHQFzwz=yQWPB2 z4h0~FSDvO&O>f0_PU?x%xAx`Ihj#d|j}2xXl_b8tgTz_;F}K!-z={Iy?PB+ypy(@% zWreo5Mdh(wjcWLylDNnFdEtAi?Oh84| zYt!p$X$b>w*wLo}fjSc_NA#N{ep=sW+Y_U|;T2zwQ$Os#e6~eNeT*q?rTF2Aql!Wj zNJ4+i#QhDpv>K(2c#EMeRQmZPB+4FFg5{}!c;#Qn%ezGG+&o4GR#rT=rjwvEb^p&s zP>{6N%!q~B$H+}jnstNUU>TyvP0t@IZPN*|QPmehE-&hm|7Y#ZUPqs+zi0caNB`fK z8~71QpBWJTFk!UznXPm)k3e5apiBFzbxqxnEIsdKG}QKg@1(@g%scUi8%mNnycD#S zx!3%R_R>9T%5c7Q8Gh=LIg&!9lF6d%J$k%UO)Hu093HD0{o8d$1nG%R{tB4#}F@=Kq?&PhVb&n)R>X;!c%14hU#Mw+iJ(+;rtEQ3@(XtgX7ls z&Vy|9b!r$B(siqpZR1^k2q)lGGq9%t<;wv9fVf-yRBA=(zwThT_9Yx6;KK?gWb!qD z*3{>pDX~z|kluEoMhTH+@^wtfXz6|jjpVJoFl!Ria~@ukf}R(&*hD5pNRLaWGv#+} ze*BX>eRX5<^YfR6{9*3=_V5_S@pGrwaBaFL2*V!D2JxHo0m#22 zO_!2X6c3sw9`hr}diKM>_zT$u@b787v1(Wnat$2(scTAr=4U?zP;e1YIYcOrJ}3v~ zqT^WrH^l&?x*d!}ypu;#%^8+pGVUlxe@yg)`o%4|Qz8e!%xi1ROhLB;Es8&h3^wHI zIitzi+lu>RewjX@Buh!eE6x(>*@xaRSawl3sExkr6p+Fe;+_K-N)d(uYEADk- z(MWc!2R0_@?pe&BC?A;v#*rX2k*)tW-sDw*=p*LAbcv*e1;euUU*Rpr7vEde)Ywlr z(~{^Cyw$!bKRzXGYao-Bv`>8xp#*crzA~3A131W9niZYg@Y3C=8Mu?QIk>7Oi8l3&JtoiffJp&3|a1o z>qlbDK{$DaC_khm-rtF%+pul z*cWt=5&!Y81V2cO++z?DpoNB_CmtbLVPt%VdE--pO8J($4bQ;4B{uoi zH&r6hck(~8&ooESA1@Q~ul8?C6$mgliNWUz|3yRi(Zt2GdHuiuV4|Cs&;*HBGpUgZ zf}1N?#?y7FE2dE$y^rE0!sLIuOAH!<+ItLrODU>nfU5W8aejmGdqY@UC^8ampf|sl z;umM})-)`tDb=vV5hXa%nKdd^QVlyG$9=JT5$?R~XKug^EKtJclviXR41q3%f`f0!}G}53k{Q3OBe>3xlQ^d$f8ELP1@h< zbsam&_B8Q&I?(YCySf$Axp5D|6nJ# zG*TXX3>RAbR=yDdZ?>QtXDeNP4fM{yFt?3!EJvof<}-aFl^DlEQXPsuDT{0G6#9vT zFt1dL@8S_n7a&j61J^O^VN{n5{aE^?$%rNDOVvoKU%H&amb^J}(9j^@^K`qzVsdA^ zl0A{fb$kDe^Y{IpS-khTQMPaNjL{>Y7q2BEF?6}>^lrwX;gnlw;YJ|K*6a1i_%q4A z%Q+LDYk*^&@A|4W-`oSKGKF8-=d7J4=S6?Yg4m`o%h+bc=bifJplyhLhcb@>`Ox3V zH6oUK0_7Qj;T$5a*5tbN@z^!B;qc%QwMv%K7PitF-)|-bc%xr02&ONXmv&Ab;!{o* zRi}^II6byUBPY)%u{BFuSWMW~r8cVG4fQchfAJLZ-lgC2Z#pH}exwIL8B_EPqDf~}6 z8vVE-j<75z%n}#y@EgCcK(@;??hu|(+~uBunP4)Y6uSnjka99?&Kj$=;BGTlbi-Zr z6bGv%JBAzC3nocod*@aQxyT0T=oIy!9iu3mNCS2OBfs4SJEJ%h$;#XD))3y-nxUv0 zE3F$109Oq^O??gMCyPrDa^{sigJ##($@gWN-&4CeAATsZ5_I6V9V}ah?!fZI5+~kF>p6_`H6j;Vb^gaR4Tin zbW-F(7v>^^Gtos5WJ;RxXGUGCJ+k`W8$tJ}cno)plXo?EZ||>;Bz1MaA(8Hdk144X z9PF?scU7{k58kqQ8d+W177K>#nLRqV_ue~}?MUuUJvrjEe13)I=7Z%coGn&X6Pr`8 zlY2oG(UKXOJAz9)mbgFvgn4lYFIUFTkqxDuMBW`!RlmNH94%S$b$Kfswcp3Cg#S+K zy!H7v`)Ol_jMj)U{`VQ&;uZJ8bIIMMQ|b%oZL^L{D;cE>RblpIw==sJ2i57pT-NQQ z|71~TFtNjgS@Oj-Q>#cOrAbTdiO{G0xh!+H@AIOH!V-O+4aHeUl+w>`DyCwg1so?K z1*7Tahy$3a2QNFuQn@+Ed53M4CVPSAh{W$}()E^q$m4%op4)Tw5g}icCH_?{YhmWC z$YK-h7W-}V3W(6ZuVouadHqjR~HokyOM43kN1yCsfMetKtG;c4h7`wC&Pc5 znqXi!!eBm5h>tdB`eNhin`H;WQ-p9B0Rs+!O~c3&M03WbKXH4^XU()1&b%&&Wo_!N(m1LT(y*mLx-dfZhyQLG@f1ujY- zO%fY>I1PjtmUFu^$Ay6t4U8rcFdeS1e(P)rwoA_u<#s;?o>&qd{!aDR{bV*t=-oWl z{q|Wnfg@K7>wqHG(OueXz1cB!S?_8~yG3CzGQsEPXr_k>4#Nj^?-LI%I@1T?3SG~r zqA8V_?jNP{Dcz5!*D_{KWyFg6R52z?7P%`!Dyw6Dw5N;VGmcr{T*|!_R7f&7-lUcM zKUc=mnA6O&c3g$DRVKQcwOz-brkY)WcrnNfs!DGIxbln#Cz9JtE{;Tn@lWq4oW}z^ zN|{)>FuDROcoUe?N5X63b$o<^?|zYC)zKMP<3Se?KyV!5DP3#q<3$#wiN)Sz5gT0hNQuZG!;C? zlUgx|sj6`V&^idu`{@P)X)(pcf1&^Pl1gYg9-RPuSC|8ms#QBxq(v(rKx*G|`*VJ# zy<4E9PBgZHoW$L658KCi+j&dfKsA&E{|==50DO?6?x56;C=X-;a2Rv{Kue~!_<;HY zy-ap<6&IsG0^MF}_E8UbyNU&cD6|I`ecg3P>u@$vKvc}3Jm~OZy z*&~JCFJ3kq7NTz8zn-ParT;jQh8jyoUyp~Qk^Nttt9BE3t?1iZL0 z9rR~@y>WcrUH$|*Ib54@xMDgIQPnbfvc%<}sn@5mohUbo`zP`EdHiX4$;F=>o*F+k zn+%>n-Qd*AxyBJ3gg3qhZn@K%$l~LuxV6k$^6&c0Kv2Tny zfSMGJrP{^~iAl%NuA?|j0D)#<_?;Vz0QEWC^GIQiw*xOHob)+Z=P2;+W^gptIh_S^!VoNH0(rp}O+@hAI5B-gNbWCsoyfjF7n=Q-x7rtxt+G=$$TY zbvrHz`eFS1C&^R}>hl1mj#@qfsJ2}b#m^lV@QXQP?I_F%!Up5^_xMpG&Rvp=DRY66 z?sdOC?FdL0*;;kg1_-ppqy9CeFRDTiTthRX40;-;Oa?nDA)55;CFSsUQ!po#XeFYA-x`Rrs(k2994OkarVwUo4D$3*3}i7({wB&VZHtA z`M#OP+el9pC$TcP@hf%Ey~!Y3-2y4>O1sxZ2<`66)f-v4Ye^q5=q*jTK8=cd`=H}4Ek^WcaY zLcnRv2`78lUnh6Pp%j5scCMe?7DP*7C;i?W_Ipbn;HKAisHyBNak@~6RZYwtQb&;`=hXA4TI?RrvVI^O=Ty$pQG`J) zgg)O9Pv}wcU(=^D5hz6`_QPM3C4lDYw3n)gEjc10V$ugdaC2oKA@`QC%SO_r>?rJ5ymrAt%C$%e8XFyUSREeyWC6RH4+2O; zzmVY~yH8!V1}-3);UB*YtpRh++%yek9~UZ60zWCFR?|hxbemQV#QBZC0>JvGj z`+S#NF)t%e0u z;>7zR47aH@f2|sXWK{oZC^klv)3Of4`P{LKZj((rBd@7=Rraqs8&PMq43KqtDfJA< zE_ZZS`N(95hDH)?ejD9viBo{mTeEfg@&A*ld~3+{$BN6@H!m+^Y8qG?TNsGal(Ze& zmJgDv!=$Z(Iuw&h)colwHor=u=%}skjiR47jdfSz%{c-wEXwhbd>zMoX>H%dE-~;& zLJvo&T;r)$31XrdE{MpC>U|hbpR~?R`;r+q;lLR5?ucV{1ush_b!Hj0^3M_YnxG~$taHQ%HxD+GzdCHy!Rhm2_A3b4`H|s zQB~r#^%is*D=`)PtaavCk3VPEE2Q*LY`AITdlAXYq1v~m^60Ov1IFmfzWrIe|ATqpf_DrxCip?=+=uhcepR<3Y@+7&2n>?DL+lYCLRAU^= zgaPaJTC-lzG_zWN?NW&mPdSYACthQ$yLXbpeMbu`mU0+*9d>9G!{<506=2N$3rQT7 z8P+mbKs6Dr;DAZH3X7~`Yvvn!)b_hB!5{)R*)vHT8^v&3qnSu$r+KvOac77+BSJTl zuLFEA*i>BV?Mr=h;aLrKTDJ(q!TKNK(AW7_6cLc8RNqcNhy`7L4X@J?`+4~qoZBTM z@XgMt3L8s#88(TW8P_Mnza!->b;w;+Q7bvGYRUc5FbW6H&M8l5wYBf13djXI)(hLm zgA4mGCRhuCy;3+Kqzef0nJkZ&f7JF%$3`Zgrkf%bf}WSvoJY5g=$ zZ5Mj@r)&%Cat!#N4Bq!w2uBx+9}HP zMTVT=tz9!4ass~3JM5ov*nrR$ggHCoQRZhivYV}4PhDv4X_rBKDsSp{$R|!DFMEm2 zwxcl0a+3JR*}7|kkhqq}wUsh}h_7?`cXz^V_Ys*JvCmC2ozGd^7`y#P%U^BUcxhm( zpvByvXfOH+HD4Zf8(|4At0!vVw>_8#Lm`Iif4XRe#yRMPpce-l zjZDEk8VJddm&NL56vF(W=rqR*7_EqNOHrEu6&Qnrq4%=6KP`E^CJ8ic$@$Wr_eX;k zb<;KB&BfdHRKZ~O!)1BCnrp6MUwUB1gW7`yZODL(Y{W(Bq9ex#F^F| zQEEZG%0y7|3o*!f%=|!;^^lz4CkF5wxFPEllLW}EM%2+KZVA&$2kLBuCDE1uXEuY% zt@Na()252s9bp*!XocS6;)opE@LSXTf^gS(fj$WK>E*{@;Z9qUl&wm;3Ly(r4jO)Z zLIX_5w`^vAa2zcsZsg|TUI48_s^g{%Ov9~5UED5gI4wH%>4KGv!H{G;((2bF_j*mk zyO2jhCF9KnF^i3!XsgdbouT-(QRzU3ijcHyGAJtm+VZq*9TYW4h;6gr@&ZH|-Ja;) zYdZY>^$E!bOe&sDAQG2wy}v#1$Fb3uEoV}P@)L@tmQy2-k~8%t?JN9OO4eet#ynTe zn(YO>PDp^jpCeX-t?roHi_HK-0|jE4XA!2g1!w-I#*~iQd&teTHfpO~5n$4mMZzly z1fB+>O*6f~*sUUb8k9Xdw^+PYd zn#Hs>lYV=x^92!c-IY-q8P8h*Y+PUIwfeiWHWlfb^YGDN<~Jl5!)*QTlGRLjX50X` z^{I%X>VQVEo)ceTC##L=AfQv)U-l40#?flYVX>Hw{Dz&zH%)+_UGCuP4lQPR&z7qyQscOPy&W*0DDZk5C-BUqUD9^R)oT2s8) z&(VC3d8#S&D0z;_wo?uYl5CY-z`ntz1X-Llx=O?B55vXDcprpGVJLk&SYx6M;;UUT zFK7m^XF+l{8maG8*5SHJ$&VNkVaz4~Lnc29I`Ti3^=?)Mj5--=EI4nsxHwgMaC2J~ zt%z0>#Z0`yQ#{}?=5oz06-~(kkQO;n5d%Vh4JzQq{wY+oKiQ#Avg0FPyF)9e{g4o* zxfrq5egur?1^ss* zll}0_AwsqiLKPHxS7z&yImDi_%n#@UG{4~aRAJxR!+WLRW`=X+`_El>__t=t>h7}jjh~#_6fO9HvD?)4 z^9&iDcPue1Hp(l zYV=p90DCIf@iyvC_76g}p(dhj2y&cq;;;3SYQeMOAkCoFXBab;|J8tvJE14Zg7NUGAz%7|#VfMm`0wsP@KR zTwpPu7q#ErSOv!hDlfJDDh6wm(YwZvT#*x2|j5~Xg;pSOaJ9#cjqHghWu4G$`xv~LkEoYwFV zZu=j8eFL+pj)3&@7&EhDRdW4X!fB~VQ|EqQ)1O;=zLq=5q`@+YU*lylm3-cVn3D9IXMSCIR_>+ERsqb&%|rM@G{t?dBn_eKU#z`u31h$h6%ZwD z_9-1OVNFZptx5A^g)m5wL}rB|u)r&}N1<0)PfVtf^-grCs~HP=0q*nz{_ERQ{fue@ zqMAP5CEW2|q6Tl;GnbgDF~4(W2=T0y82{;Aelsf!7aGO7Etp3L85hAN@#A#ON(g=t z4*INA`8Q|Ws4+|QqivjD*d^blvOND{0i-T->@aX}dm3)DA2tpOj%%u>l0m7K^jMZ^ zy1&-KfH)aI50TTc-s`bRvu2sJN;i^1T?Dz!Xv1b&r+Cny2lx%zpv24@rx-beQ4jKybj^HR$0a`gf1>m;# zt}XDAsj9HZdeV?xZrSHF?3yR_Qg!|Qh5SqR0&Be>+1UJnm3-lh`pIEe;lc0O=;UEI z_S9}^hp+rbxJ#q~t!3#9FzXBKKr0q&3&__VZAH;hFLLx560PWXe!6ST$)f=CFdFq5hJK%Low8!U8(F(5b zc$|0i)OHV8HjGdW21?2B5fO5uJB|p;ztXF1rYIMPNU4|fCkI91N_V>@d<~mye19%t z<+A=@zKmu0e*h>!*S^Bq*hAQweF{q>cH{Jx_wnl9KjEcapWuVWFR(rRFsiekLrumj z$R4wa=Whu@L=t31;l(RJ=CU-?u9N{Xzg#mw=6X!O zk%d;|{#K3S7u07I8_sXesry}q$%sX#&&8lIPMDe87NN^Kz^l|5err51f0+jsENcy) zsCbe#V2zvFpIgHHm9AQz*Q(G4;U!1u~&*XhZsJL~!p)1oc=A`5GsxR|VqxZ6lChzFNp-hf;z4ywoVJ3ht9jsJsO@0}+5BZwKk7A3w7*q!|bRt7gCZ~9IgFZmOSr|mBV|5Y|lxnT-a>{Km`xnd>#Vq4fd1-^k~B(qK|-FcsLybIHC=JrZif-9@A&YW=yt$k^E)xD1IC1Q#+Z=Kcsh{j8Gi)Rj|l3B zCw*n#lCNIB>yjlHy!a(9U66r%2FUytO@|TD)%M(T&nb}Ewrv~!`OkkUzpDX8|7z*yGXWXt&DCBm ziB)agi)jx8VEiqS2$N5U2{EB;c-6#ly~+@NZ#km7Z&VY@g$%C1zLbx#Ip}4?KD-XI zdgdT$%2pg+`$rrr`veISE0H&^2G4K%3NP*Y7Y>%cgH;L5SRC1e%IxQ`Gyi$4ia3C% zC(2L}@H|$}J&DvuW&B7v!AW4I40+=l(UkjF^UGLIEVd15zqC%lIvMW5p6l237X$=|R$?RQu- zyB-Bo_F{kL`$&FbBZB&tBB19I%)TX?@K%Zn-&1JL`5$Zxe;He%UPX2Kdsyv%0-IuA zLPg{$q)ps}QolOv&3*;@i{3`=^lgY5x&j+RPopaSO{6`!4M9Cu68cslth;<#F5_e5 z)sg`+zcn*J=DJM3lchnFkucIY3dGQ5gQ@O$`AulQ3%v63YbdW=iA5`tuy}1Oiprvp zy&?<+Wl2;9a#y4ycWFBEmS+4kS|-Z8hI=hP>o96*Ci0hOVsTjka+ahabz!`UQ@Aom zh3BgH8OSb4!IFxF$SFDA772)1<2{3<;XAOw?=`HQ{T!0+-;U63GPlb{1yL~%>_G9htU}Dt^+;fy9<5;mLT$xHP{;S5)Kvp5o-gEBYo61WQ^E>)F-whr0*I8 zbX$qYzLkjRu^!>wH>lZ>jUJibo*5u>T_$(2Jb>gAJ$Y3jlUWJGa9=)AGhMlPx|ZyS+$o90k=ix_&@zPB>YP`H9wn4 z4dkRtNBuWAM`%&JA`*xZU0_`=@tiA|k@$xF)=UQzUDCs%TUl8d^7Hd?>eMMU@txS! z@dae8)BNw7+=u!vORG~0$lRiXjMgI)#l|>pz$PU0*^0PcI}p)(3j+F9z`y@$Ld*&T z_FhS-*oMQ!f5GXMpCWVo9{BcOii)6Du{-HK_zzi(nZ48C|KKvr?Y|gfZcoC5+Y>P3 z-fRT2!S}vv6+*hMV?)0Ykv%r4nS(>w=+C)h8NBXYfuL?H;NP_r3wkYq*TAI+7_=N= z{YnwsuLSdY7GgT{@xHeJfjvqP(q}pRdz51S-HQ>_y+VPE*S)JTzdOtBUV@qT7GiGC zMerZE4F1ex?mdM#UGN$Hx&!$8PX1i?1Ai$0H;TtK!lzpi!UwFPEBTeci>~zY`16>( zdzPxttb+!w#I)OU;MHRZ7Ib5M?kPb)&sB)*FZ1XSwgzlPbnlHw7_bd71Vf`o=C@}C z$Xu7nT`UhEX|3h8lKPXM-t?2#O;*pQ3t#fDJZV^EK(M^#V9R=mlKCSp$-|TJFVdCm zpGI00ew6q>dDzRtT}&nqlfjZ=;+{Tz8j+EaSg~RS-g@h;mU%n$MnKY^J9ob2FWhU_ z^9P9ewSb95@`tm8UF3Pa$P+D}zsrzG>1|QEF<>GR1ce^alP-*#U$pD$(ni(K-UB(9=A3$ub zEwaoxAUC#p_o)p4vP0CFDZ&wYgp)TN88|0N!$h-IBQ^EqC7^+lwoC1Kv&87Nu25FdQ_2OjVR zoc;Psl}^48xrsxV-fXPA5K^N1RwA0`Ll%RS8H}R_Y-U+JN4+X|ZZ;xN7KiLZP#GYgSBVg{K;=f& zBNKGbYSk+fZGg;g(hQKf4wJ`^Jb<*G0R9!n8=Od>-Qz9yyzEG;`!)TfVVAFFq-B)` zS^z?q{ui0_cQ52F6*wH{_|*Yf+{G?u3RUHR40K1_Wu5aS6lA^q19PS&eWu)_wF zBYN;UwLVcu_to(0wG2_iHlSd3EtV~4MA``Y4_*PU9t4HE^ReKbJopn10(z{Vy999$ z5-j>HWV%K0>n*Qj2p`>ZFz=om1ov2tfZJ9e;?8nJ-c4w@cO7H}?QoX0;9dgEfC^+j zz6-JUl_Ox_Qh4J%}E@7CwU(VNTCHq&>ZzfK-N%eya&vETf04Aw>x4zYe~H zrw~~`sSg2;b&8Uu5oE2Y-W%vA%P;WU^r}R-z#SnajIa_;|8T-zcu&hp+&qWjy#xTc z&G`B}G6u-}cFX{o>o9rv2)f9_hkxsj!z7)6 zivk#)FE!4EaaA2e^tb$9lXitPX;(-8t5;n0Kr-w%XF7-o$ml&Qvj5k={#Aj@h7B98 z`1Jb!+T>o9J5;|r#dhiQ$fybN)@T#r^;=IUSOcH#i`l?0Lr{<9h=05io8n)_>56~i z#r6Nfb8G&F;@Qwz~B;OjoX6t zA%~DVek(y~DM}|E!1D2jku-o1&|{7IVk)$M8H%SI!0|=zV{hb}$Q-r>e*KCuvqv5> z#%#yF*w;}saW6sY5E}FU2On(x7e3tbHFie6g7EtZP6L)=@$?2%20w$`i94|? z*|SHjdi_f=xnJc@)Snw-JGa$f@QPPUFzBx3N3@c@$2o!rr8}P~mkPNe|2TlV$MjUZU1gTH|{P|ELEJrhb5| zC%0gJj{0~{&*3$ljqCd8~{*((stJNJ>mcMtUyl>ki=K zkN$|WUrS_0qAr}}xw*iz!jpCJ9MMCznV(4V6aoOmR`R&@}F=v|e!RF1)%}7Z}QJ-Fa`KA8a^Z(xDew8~>?nsf? z&TVy=M35PMTMPmQlqrz$r-JWai_rU4B9cHOkP$O<9bw=NtcW;-sXgP6KW7W}FMSK; zNe58qy9I~WzK(xCe+d<_$59$kgO|4b32S4jkv6jo+jF16OS}GxQ=8tyo7I2D{^EDA zXl^y4A76op2bUsb;8H@&V)*qbWjPyga`C@V9sMRUhHb*^d$W-^ax-?uzl!Z4&mrlt zb(nTfIwszog5v4>v3kJ~BtNwYfrCnsKY0%h=KleUXICL+*b2<-m4t}lC0G^SfMtZO z(4k8Z{p4z#Ed4ublHW!0<69BXYo+ReQL9)>PZZtYzOr&Rfkb*&1Wr^>i%4L_S~|dp zB>XCnF?wWvvu1$Ib(nrzYrvvOe;8@|TAzTtdb-4hR~k^Q5tRm3pho_36v>0v`r&K& zo%{-Qk^9*aBugg3jx&&%?)+N54?i($hwrs?gxcJQ(sEP3`ap-B-Z`3aT zmiQ}^o;`xh_U+ph$Q(O%tmW&wUxLYP_@5vnJu-o6t)+neYZ1tX++SWV^b{D;XPmXOh^r`DnmH!N4 zCl(=b$_gA@`xgFu`Vu}k@&*2M@*k*K^d{!^&&G@%DFmisgb!JP$otnIbnq(7>9G(y zV_rvX{M*R1^vD#?X+(X-`&c@)9)W#|;nlAgMRS`_oB9VVncfJmUPa7jB{qaSOTV{} zGQ1qKyQjiyU^Z5V9l)CK1BiZ_VADGtvwLS@Yxwin68bU{ACV;m)*yVq288rouLc^+ zD%b)tVRU7{ufRzJAw`pH3)l#_=AOw8 z_w_$~#CC7n*Rs}drFZpdM|1UKgMRl%o3kkoLKcI z)GvM;`_Mri#pEjzo9I;9{CHlp*;Q=cI3W*ZY;BjqKe zP1uCM2TKw0$SO2ue2AKa_mDnxC&J{*EP{)CZ6#kL3B&~V5s(pS0240azEVps&1F}5 zZ!SyXYEt87dQ}o+jIWk{Yi5AVb(*@Lb;7SgZPVk_WU`VIr}xvStcO+;G++*Y{hcS zm^Blr>1jB2;y6D4@(UI3qBK5?BktGd&niDXPYq-wT+Wk>a}kh{aW?`o=U5>=U@XrW zOsu0rKP1PDk{Qjuf6t*0~zfXtNjy`&#z^zrSZ2$Aw)jE z?z@2?vjG9URwL^E^@!@X9$vSXB6RQu?9O}-e?0>H>nL!fRqBiQu=Rn!O(f^8SMA#P^Upx*8FK z%Mdc448FZqAc))LzAs?i+|!62P>!6@HCPw&GM3Lij;Q`?vEa@{h<$tus!~2gnb&iO z7*qzY?n|&}%0cXne;?_?cES7qv3C{#S{3{I-%c9A7BP|TP*IF~?Jg9hYuQeg4Z6F# zyOw1;=?=SFK_#VQ19<+=Gv__a3nJI+z1%Ts_K8%PKdlN>nTRzWG1^ zUa1nvO59oyFR;!$1k{*{um-abS#KVKs?S8%+A|Q;d@edQnTU|)QxWsXY;N=iHk^vk`|02P;}H4KR0PzTf?h3B5Yu2Gg6^A! zfO{rcQ=obOuJxuNyy;xT-@l0Wor2It1dAq`5X!Skp`mm;Jwfua5!L^PR? zkVbP&OG-Gy+xec!rjKugxCSzRKXnac{){pSSqWMR zo3*2vMdLJs#h*gpj)P(S=a)POWk1SbH2g*BOuCMpFqm6U?lpAnM&}Oho59Cn2W( z0z$}mo{vRv?J4M1YdYbDu)^yCYmG+){pxlPp`#k%p~if(;9gMendnlBz|)9!Jl4v> z!Mwi~ozvC`8pER2kWktMG?;_V1c+ejfwiU?yWocNcpYJb;1F4FkpY@6HK(8h!x2z_ z3cA#rgw70mSmT){OrbTW5in*TrXFFV2K}b!INZ@f6DlC7OCT}AbA}M*=NB{l< zFkrwyq^GCj$dMz)jdjgMAY=Sx809U+96Ew+TDNo$vm?1gs}i3k$MCCHi~Pu)uKOD* z6CM0_u~^Tm2Upw+98_T2gU_{~qqV4`(v4v~`F~1RI578jGPhEp?o`PC8XKl= zLTgIAY?NB{cY!$Gt2zD`%1#${dQ)2a?z`{Mr%xX<_4>ep1IGMnQF>m*xHTcbszg^T zUV)YmcEKyRMG#)5nHCw-l2CUZq6srGH5VhI+CqfYCd@RRkM;&&wC>7ygg2gnfI3qV zSa+&fSgvagniDjl2qPWt8p+CgDl7Nt1_GiQ%^_S69(W$pfS_~F3`EslfS5W95nXSA zS=Bd)AP~%ZhOyG`boUgqRYG{frSyL>f(btn4d#x99|D^}t4dt!>Ut6nZvmvVDS z;lB&yQf~f)*s*)w?0lR$$Nj&S|E=1!YZtP!voU7O81(Gf6Qf3rGP6uho^(u?<-?pY zEjoM_MwoQ_Sn+43+N$+OP7T?pMM&<8QA}Xcx-^0u#Ids@o2?)k56J*{X$h>rW7y)9cserWuwx$*f zFuD_DBJW+q3V9(yn#@D{TH3gA96@Fbx~gTSHsL_KKG&O!F105kwDBy0#&mS7KAKQ6 z8Nqeb%`*+*G}FR*;RJ|Cf=zgB!i}~=xNjP|+&zx&rXZ^6d~~{R3cA#sg%E95Krjic zyAXl(mJ&ebA+W(T-e(GrXV6?NI1><1cLJehCShilxqm=|spwF9JUZ5yfS|^N9FQA|Ez0Cd0HP&rQPAL}1=%*GL!Hgwpjj;UHJ?sk{ z_tg6`$22n@{=Tx`yZxR|pFWK>Yt|qxF3v!)Hb1?Zl>NpmkWtKAEiwX`mv0Xz$V_1+ zKgVhbVI>@L-*iORT!@J33lY_DF^0dHhq>V!FuU6t40>r95}#av*vICg@3To5_+l!0 zJ-rOWU(Y7+OhMv57GmIY$%ubsJ|de;Ls$dB!(_t2R74PLv`v8q+Qu}Ti-Auq$EY`W zJ^c%AJQ>4Y%|>d%hnU=cEg~M6kM55w$JlpPV`k85%nn|Q*hl9esL4c(c{>C1Lf2u$ z8!Hg^_#6y-Jq>e0H(^f18q5gH#jutc2yRC3X*eFepIU|?FJ&OKp}L|b^Enxox&*Ac zf*A{FBAh@*Q>T9)Wd4|_i|QK4{5{nb2N|n?J1->(!iXa^*a_oexxhIMN(#8&)Bmj9 zA8~UzyFcQ_SuW@1a(1>{$_>SQj$a&a4x!bB!hgEf;o!IL>3^?m;E>XK9~##X5D;L# zsMX!{%{Skem04{!(shk0FDbRk=qubAaBQ*d1v`IFrS~QjQR{|UTMRn#Fb>YY zZX+_XMXfNFOGkVekt2yJS&4u{{#z|M=evgN`{_RRH9Vze?jy0iq=5}X=fyeQDHPVd ztd=9I^~f@lr@yc4cP?FW^5jV*Cnp<_*|~G)RkenUlodsa4XeXVYQ>^t)3x*xK_;}m zD)`w57R0bZ52`s0p*3eCu-Xjt{$~a@Oge z5oU#K#D+0@k@(acOlp^hjGkX%a@%|ic_A4iUrt9)LQSwXWn_ik>FzP;a?eCed}9N? zm|cjEX79(qH|L`NYYVV_%0V1la|C>#t2Wfek43_0D2fW|E7|{+>$jO;Dh5FE#*396+OY?F_mXr42?8 zuhUQdI42rgYXT_i)7C&x*a?EVR3QEGD#Ej~x?_AbaR1h<|A^;$E17#FwTc_^}~K>c7=& zfzZCmK(ue#3*);j#>yd^(68kznx`Rc$PR3q{XN!C`U;bR>35Ufc;(*iX4T+{0jm-9 z#1!;;aRD}s{{cr<0h>qdNB9HN(aq7-q@BA%>dl~7Q?1Rw-a6V4a?Ul7xu!0wt~kiB zioHNC{*^eCIMPaq*oCbrSLxbR*ep=5$t8r5q)J+GrMkeDlK7+8@oa?uOrd`MT{!># zmr5-qcFT%$WhA9z*=ggyw6rwS-PEN^7tEhO-*h)gslpNf=^DG$#r98T&gYW9r?TFg z^;6ubP*&w{gN)J#pIufGJ6$-^hN9&>25z=rr+TS+`p)D3*YL9o3K6w}Nr|rVrp6l>M@(~oj2do|UA>yAO zk8z!rVZ*p@5Zrt)L1qckdw+-tZ8H(vWDGji9Exsr#~`rY1O(TegfMLdP+MbLW@1W* z^++A?8HTq@LEA=y@Mi6v7#EO&3BhUT`RW|BYcdGk9vOx?v3XcK4)Q8$;flYTin>6f#UemOhom$Oscn3_TH^@l*lAx?)E8UN3e zDi?u<#2H`&CmPovGs&@I$IL7g?VY2UC~exbF*_Q|+*Zz&nSJbRX8ZrQR(w`VlqPK9 z`DH-Hdg(eS;-N%oN@7__jB_58cu(h&5ks}SvXzH~fSN2!4TDc${Z#~crFW(kHkeN!5QP<0CL_M$o zZSEO~Hg^*~2pw$+AkWt7gOFEdVBMU(*f47sw$Azy@6Fqdyb5ji~!)qsx8cDH9M%XzE&PD#o{6kEGt8A@2FP z=+I;odcM2}b7ME7&l_{mzUdIWQ-2`ds1=WPO?zW*j}1ub`!P08JB-P}t1!At8uCVe zN3)L*^UM@X4O@*B{oY5^Q^KAqIXRu@@cab*LBDjC6xJ-b9^f*ZA{ zs1lNro1;gM;`7fxH-myT{vjeF0!x=J#ooPpjT>9p*XtU)f|L9`m7Ytv%mEE0ts~AN zXZ&ZtqR=5arXBy}#>5l-(e!AoNNo+s)m9tA8v0ImW;~59kyj2WNoVrk?EcAIe~uuc zY4Flj3YdGz-r2pAC=8BwrBGO+J4-i~l*=poT}%D)%P(fvYo!gf=-FxPYEt%7*`Z2a zlww+Bw2n+@gYzI0pef2tSs^!^hrl|s5cl*-EE)7AKFRzQyH*2v9L+z4ZR3B!gx1-Z6R-(ciQi(>D_Q7LeJr9I&qHLR`RH`_ zWCYfpiP?c4U}f)b(DQ{Q=>J98kC_EnKXEsPx6Q(!HaPsfSHIVuHsw)mMzbU6K5?h({;Usps ztD@P0AV=ZGg3v0gob^k|zpyiY{Rh`ypkGR^inT&*bc>}J9k2m26E zUYd!JI)sJV^I74~N8;nj=<`Af!duKi)V?7RvKqqkt>J81}ecse2 z^-ZnH=qxK7$vG4lU1nAzJ)P5~CFY+DoTbF_f1{i$At@c(ttqy$-AJ5)L}MW|%~pHr z=nGs+(rZl`4HR~srKD?YII{ha*vG$jKV4(Hv)xLrF2(TJ0AX|ig@a5KR_a!`nKCp$ zmpMxd)1578aVesCF^YLj5r4v#A|v|A%o;f(5t2xhj&!aLC{@Mg$Lp=ZzZ#FCu}KBg zv5gj{3c1Glf(JU)n;;^FkmsR%rkrE6Ga)W|`uzL0Ct8VJGloexqCnmS5 zpq5XZs(eXZQeK6a&>riVn zI@TGBuJtES#xo3K5u|RTdJ_=Vcq+mgP37@K1l66yXPUw=O(3}NIkiw<-5C_E2jf^1 z#-4I*%O&9C-;rw|^Y>L(9ApX$RhX$XQh~&5t3}JGpD8|HfmoXY+J&SAE(J8v3KLo` z>lCF}2}q7C(zzxV3*$x`E*6~S_cJS#)2uuSsGneka+0;cX;xsTD2iW4wPK>v!z88m!_u5U)JWe0q|1J8i(n_{uN{mh6_o^Q~$Op@OJr zv&A&&Fs|v|z!yWHaGDC9RstDQblBJZi}a}bNTdWVTefULw{G3AapT64_kT4h3uCNt zfA)fSNoF0H&Sv_xwIJSHglh4-nsd>;!BT`*TZqtm7a_9#5(G4yjSd8ah-QL=ab|(J zAdNF=Fx@PIr~Qz$@nm4#DTruDC}=PP;nag_PexF!DTryb0Kv5g4Yg+@wALI%)?L8L zem-G>;8brOx)CI_ok2w7Ip|Vj1R@(vLInK_sWpROF#{32S46#;2)s`%CQA_BU@q@D z6B=4-b{iDk9kcfMKh!#2tHxjVxZ1+`lSW$Y=F_4G1l5KmS`Hb6VzM+ zQ2wY~1DU_Cy5b`4@zIZ9qQ#dlu7JY==76!KTVRB;MNn7{Vo=$S9EuV5Q~IGKenk1oas`{rQd z4>Pdg`{`Ko^#tU9Jr1kC8H4rTjmPHQld*lzEPQZa3BEg#hrI<`2tJ=PkM5$M2kHAs z-mB2Sk~qaAE9!-eb~TQPSr{wUXSE5%6?B$8b_6zn`_2T zsbxkmDrMVW4ax=?<;W6{S(0Qx#$FIl-94eT79hIbVno+jgowKrBAgOheE|YkIfpdW z)NHNRI~f7BtuZyB4dbIMm8p_2oM@*tALq^X}Z7wMVD$52@`XvYwLm8=yCrt zbh~dVLTb!LbmJw2jQQwVjnGnCQ=hdT(pW;z7{oN3XTlO%gOE{sCb|;{!fP($`4Wb6 zF5MAK2vCBQ5CbOauClfVP`8+Npe_;m9bSu2!~35H7YW1d5VJ6z18A;+%r*6U>VE<< zr%x83;1mlIg3Or$7E&ysoW+z_jzah>rI=r55*52Deg!r9-V^B1)iwEDVMXhRzaqsS zg;>L%sxd;$*#ew6qq7Tn#T;BLvM`o^9p&7bB6aZKK?5)vJJY#yXETFE3!`cEV8M!% zDmME%XK0bA@{DG5IF+T5$vVrQU==nYUv^ z&V3k_(*WagTVVNz9kG4i2z*_TguQ3B;Mm#k2+Y3{N0joc7Qh1L?*h_@T2}@8qY&e?P=8KBf1H}NB~4w5PWEFB&}5w*>C|O z8_YL5Q%5(PjNlrh2`$qR%W%ZjTY|_Ma}ZjM?rJ6>rd}$7@0*Rl8j}%w|6Fvxe-66U zm_%5aPjFaBfLMgc+KVX*2rmShngp4e+E+=tT}x&YTx^iBSNF9;E6 zP!$!hKrPUhq6IGJig--3a|9geV4=&BhITZQumV;;zO}g=D-vdM{jABxR;$f5xlq(V zt)~66gq7mrQ;gD6CJycRGlivr9J#s(WSsJ8iTnjKs|^?uRcL|`8%{p_@Iwq7I1p{y zwl(XD*aL#?>D^M&ZTA=ZWy6f^?rI!!p~j6uGJ$p_R|}`og+2pL;wZ7=SIS-<@5bJu zo!GE@I%cmA!tk_b&@ZV0dM>*I@yoA6&y-T=o$iaC>7GbTcSC%-3*s{dC@cN`Igrr|wn>vFVfgUjrX|ic*ZaI$6jK+U@nVp%x|Reo zYGpCgj|nn?_e@80o%x8Zv4|kEl$G%Ubg4ZB!HuV)bM>JJYd8U&YECe_PIs<718?6o z7TpLekSuBB`0a_WkMj7b7~`5GT%lt8AC zMQkx)MnF@@Vv4#2GfYU7bCNR>g3cL!(>dTqMYE}_ugP!3R9lLtV#Zm~Y3htO#i1Q{ z0>g8x*rhxDRFsxvPDfrfqI1V9`>QBbQi2WVuWtX))z5+#|sKgH)8=#6Ds!M$AT?b^Zj_t+SC@q zvK~Of@>>wMq8xf>mL;6{5?I_3m*$GtG&l4h$i!t(2rcnBmc&tdP+|!)F@&4$gq*}I zSM*_-g(0Du&o?499$L63@y-^5za2kS}O)?Vtz*Gb^ z8;`(dW6=GvN$B0Tmm5Lm43 z2?Q_Ns=#?y>)*o3za!T`=I^VnD9Gqt7qHM$p<2X(L<8>57+|q7tx;q@H zrv7bZK6{;&Dq%s71u*ADl?ko?;?b>&N)?ts#BMRM;low}l-;{`n^{i!T91v5HDB)9 zC0Ta1vVlcuR_3-pwp?wMqTa1$9i36@2La&JxzjjJXwdZOeZ^m5`%lZTXj=@1X8Z$* zE2<(stt@(GyCX4AVB(4>LWv|Uk7ld95tHeG?paO?V&tcQ9(fIaw4ny$;L-h;6>JW;~u^eFhDGJT_IY-yB zHC9INO;f_vnXDoIHpcvW@hw2Lx3ti@L|5ZGQ)u*DdOnHNibW}oSxfd_OEb+FmWT$b zjHe-r6@N^Cm^i$41{XXFhL@+E+ImT+X+?(CuY#E0T@f{sn(%p3igF^DLDCehn{Vs%POZQ9)AtaiR5}o6UNJ>ne z!~@aUZivc~5O64wbQ@{h(mvPS;f7`eomje!&+|fjt~X*cy%3#32wK7Oq?<4*^D!j7 z7lBU?F2JF)+leN-nDUOHSkPtH4Gx`=%oBd(P%cc9R=WIm)CV7YU}h`{Sna{vS08*@ zdCfV`X|JU>AJ957p#&LirZ^ozgqd#jCL^rj6ohJ4(0$|3x&9c$zrFwq`ftaUxj$e+ zP!gs^W@E$jU06T$Tcizt7i*{dfYjmJkT>B&teW%<^2UFSm4kO+ai8@_8n^>%Cj5Y{ zGxuRm>_!Z3y&Ow=y^Gw@-(elE%Nzd@Ru0{OtdXB!3_<4O1-~G7=zAFO(n2IWu?Pd6 zPesDx3lQ0SE;`hlg02mxV|vI2?40`(j_x>%pH?5k+{k={HX_K>or>UElL#u)2re@T z5d<4PS6E#N&o$-Rl356;r^WCjbF9^U%?iK&owa02Kt{WX{|00>Ujv!Hu)5+Pqqdhq z7Er}%@^&_y~4uL<+&Ho$8|3vsBkE3(*hwyf@ z`!OIS7$2?=nS>uxErvE%^={c^hNxVTQFcnL(JRU8t?9z zfP-f@6R>{b$IVd`sVmIl7Ar~W5giX>>WhoyUnyr$(I9VaVIeTJ-t~D! zNWq}iOR>1ucBGH^6ifT>z|c<1(YMtCteWsW2EMZp8zz5?G3}Gkso@B`e&-;(amNs} zuQ?V$&E}$A%^3)Ja1oOGevS7R9l}p*3$bhUX`~MN0Fn1kMtFlM2(GO?op?;(iJ%C` zLh4MVu1z9mS_|P3VuB@tn7W$EZHbNrH|JYx{+wvPCbh;y)Si#oc~z{)J?vV=-4>ArmiA&#X&~zT{9?D0oX79=)nVcwn<~O@bShg?rwP7(;cl{ z-O$m+1%Z@qlyDbMibu(LSBC_xnAz&hr-g$xN)cd zUd9hy8%lGD&J_mBo%~Q3biMB3PBT6O%_WM9ZfiJ&VvcDhj1k^AUejMr>3N)?6ryOj>qQGP5g4I}Fn0&Njc4l9gRP zTA4+yWCaw0mTg3Fd=5~o)-=1q*Y)a^(Wyp0X@1&C?8TllTd-~a2u$1f1bQajh`1Gg zh|d5FLG!-wMnbkbdJs-bH&LDoVgxh}V2RFkHLWcMUI;mMD~&PFb*B(ia(oQH7|HTQ zG$n>m6HT~@On0NGg~t_fd9J3*NidU;S`KkbE2HPKdogw0b6B^lKlT*m;1o2w=@d?B zV6sGyr8TA;Ei#Nm>#=P)9~r-^?6_8Upr&4T>eR_Vs{Ot$Zk7B0t?bHD`A*{qrB=+( z#p@4*Y0y>;X9B&=4)gQ{}f66 zwqfOf&DcEsC*+L!63hDR#MFq@^dlFWrtQOou36YHaTivN_zXkdOh&@fNf_`_2BKTc zM@NEHM=fag;C%FZjX=~Y87l{Vf*o@YU~beVgg2XN)~^Y!O>klOHDfBYzFJ&pR!8un zeU%&lV_IMcE)IAJ;&TVpo5y2oy8?U5f{TwYrC-vl&OC(I(7@xxh-$bL-5O5Ab9aZ} zpEX|ON8bA=K54b!Do5$9NQ|=6o-@c?Q&*L`;)8unT2MKnG-3fSP98sscUnA%@QS4{ zjk35x87wO8i)24fxObs}ELtmPNjIS!8>bLXJ-vtoAF1To+%g z^{;>oPk&_iltr3PX=IfukL)tnA=RriGCWEn$Di!$VMMVq&k3F!qalHY7Uq>v*GwQ~D|ILx!$IsiyB(|c4#t>` z46fHC-B{OX z9E~etv)m}stpUN(yJxr|F{c#6QWlYmD`IeVJ!F3$hCS!9HF^gp7;i;PjEpK2F*42( zZg7s^c!p0^=y*6W-1*4(m+HWQ16aO%IePZ&iBCTH#JmqF!K;0IH7KS8=0nXS)SzZP zAVFsCTD;ag9{;?f2in%3N|;$pcv;NKeF=ep$JM7IqR}jje|rs^TW5{hor+;Kk7$h_T7!# z0Y76xn>7e*JPDoajYpUI6VRc~NW6S|BKo|r1oI+5Kw2j14Jw!5ujLd@%hCf zyZKIHnF~rTKE9NGDYMWz3lMVO5=7Kkj_!??Be2nAJY6*q|ETsVK3VrUiccsbDv?RI zGbNRb9O86%O=HZJ?yl)=Oaw+mh#~;w2EpGDP#fY9~D@FH}8-+<`3X^2BnMI59xufDr>A8r+-ZZgmy$ z8Urx7wmZwNdln%^y19;G`yr6Y^r9ag#vkJ!uMJC~AG~*bW*H=;R>G(?4X|ogJj44Q z!+pZEL21FfGiTKzrNO>}Hj<4d1=!_=i66=zP@1u%@lL~r4Kq+`L#E!5iSMgM>HQa> z@a!S#RyXF#d28_M12K5w&M35PI0;?rFF-)8g{*`ZBeLFNgw&pe;F^;V(O@cKADoVm z2IJAG<}d^`9EaEz(-GQi96Hn*h~Orp(c{q>=u~?!LYj_2aN|)3q69Y{jfBT%B97AL zzP{*Kdk~LjAoTw62yHqRp-sjiyxBzR+Jay-LK=-n=i0-K-u>ZO2;%*M8caa+gR>CT zY$m$a8HY|aM)UrYt!}S-Mj*WDOvFFD5COF(!F21?(V}{DjP5M9*~PlE7&9|Q=D#3y z<{`57as=PA2wkg9L;G68@Z6nU@qGO@_-O4HC_d%LaV3?NGMZ&%i=|n=YwGGz|C6pI zBPxij^27p}2b-d|zZa6c-I4F(O_1?G4lCSj$`*pfW*0wJ)TOY-r!-P%mrV0~R?-_N zs=RHm5Fl(J#0WUn&~BqDd=Gb1xywK4>j(y`yBYmHd( zVA;Ex>(|rGYQY^rW&qCxGWi6VQ~$?7MwOXevDqMDS8&ef0usALMT3I1m|nYf?aTse z8#Zh(i|VO6%62b5rAu_3#@@)x_S5-(_BADT_Iog0OWK%2>nCZxj{PoVsg{_N6stvs zm!m)n-|;0D5@L?y8*JM*A5*usN5aY)2wCcm*bEo+Tw~2T3Quz*nD`+k*VjOdb4!a_ zXu1eJnSQZYT?61Tnr8uk#RN>;y7|n9NcXe~ORsD=yE|>T)9B z#AlU3RFW^E7MH`g)sJJ_-l+`t_vVSMO(+>3rUKz}o^!yAB0*x}hw=xMx(GG(diLzu zX6m(bT$}j5YLvpIfyf7Ou4s=jSw1ZpuQ%z0m+uQj@Pp$K-o%=%6Iy*H!YMI4j@EdR z8siX9Z6reLO*C5t1XLe`z?$O`P-8p-YY|H7sw-y-k0%%jt2Y%vwI`x$^>IcIrJc-T zn$1RJLjq5=(dfo&BN}LBUX5RwjBx6qgpuw|=OFQcMaIvd8k1=@&8*-XO6k#T5yEOQ zT#XkJvW6XZ}YhI%UI)Q=(IHaS}^Y391BnO4PcAFLpB}4nJ=LRmluXerazkrQ2LzZ>;n4LK=^k(N3VGa7gmx zj$z1mn5jia@FYmeCfF$4lAUh;_`su#ftpQp^O3Kwc|O63-CAUUidvx-UJH*NG2gB)ddmh9)uV|MxFysa?gteGS+nK*i2q$K&CW7 zM&n`}ZfsyNEiyh7y0^_}Z`pb9dS3%G-6=5|LzC-?_%(zlwFV`7nkm}xDW%aXxhiID zcoUx;U5=yY_Ogs1%Wy&qQfO-y+^~@h^jk{ zP%#1Fb!VV^lLdsGIYz?k%|%qh1x637slAP6oBfm`8!Ry95gLEO^T3+geqa`XWR`KG z6?`M=&qI)|p}p2|39U5^;c~!3K>XVFjJc3OdQfAB$YdU_2}1aUQOi?cqW*s|6&70FqCT zG2r6L%33dbp6x+D z>DIJ}Py{i88PhW2&T9!JxxOCA^mWHd9;ec7YsHHAwq|vFa?jn!@%F+N-%=)gx{v%) zSCj6wk@s55FzS3GpM4{rccX_Nfk*M+fvxVo1STJ>CfwOjvdN8Zc#YNCqShu4hTVhb zR;!E+T7nt57xY{TWbz0yCt0v78(sq$>)1YbKDNQe?n1IbM%_pnf1x#J=FgvBvX@g< zR@MbTqe@fmHS5XtPk!0{UVP7zNY|n4__IJpEi?{$Gpbj|0-$0Pohf9VqK-rO{zMLv z-VHwRJ14F5lR7IK zZ{Ht+m+uWhwC-vJG{X{imso7?#+^T z-E0I@C&)C?J?5fYO?A~Qp!r;i^!bFMh4g1WA{!>r-zDf)onhp?!VO%_WY}jr^jXv` zv5tRhC;j}fWfxv=wwbCevoOMl#5%U@G>EvwPP*e*W|kcxOdDP{oPwYxW6|}2p=jSc z5id9HjK}M~fXz8OaO#-KKq)0OM|yJ>qp6HkzO-TInz|a)6$hEqeC6u(S7W)=_jnek zjvhi+g3KUqUt|(s*1P($a`z{A_z)yKkmFYl-`0N|yWa@F7m?lZMSKi)g$3e^M;}3& zj}Ml6dtecPVlFG_g_IOeZ=|z=7wD*^Wxc1L(bYPlZXW@Oz(L?5U9BPOUA+kiKE_^f zq*fMPuQ4gh2|$aer}%hTtuGV-iQFx9=qZFDxk+;O#60S&%2dR`r=G!~7hXWRk1yed zkVBAI;u0qRQFeHFV*>$8<9H+*!?TLl zjV8(8Vy0AsY=Nia3DH|eev0=g%Rd{x#r|u!!T-``^MJQckFEqthV`$>z zQQ>Pd^V;n zoYpe}DKm1=vRNRWuNH{lN5&%j;i(90IFUdz72!>0BDC>zbgMrFfvl86o6SRT(*@|- za2|r15+oYWL2#2fW;RZ@M$-}Ad_F=Sn2RtcmjV96G@d#^9Ab611G@XjzX49!pqy2P5G$%YfFpKV{BJ}=Qw3}h>8Ps$Z zh0xT5W)g-sxbZX-ZcCqL^b5^?>&A9xn*}wQj=&}~yGUeq-i~ga>?}EN7u0kzIyM-J zpofMc6tlmY58AOY#_v}aZziG7b|dAiDAKaX!U)$+}^kay?Zm_v|wzxf0Bv{O5L{>0 z$iDX;tiG=r)>5`LYKTt=Dqp_#8Zs(hkLB0jgb$v10iSi^S7qz=I2{^};t?b8ZD0^S zXxbb}m2SrNruXCXHf`{A%eSzlW*wy8bSpl4_Bnjou`}Ln&=@PPzX5BTG{k4!I^f;6 zUPbE7*CWZt6FG!60oZm=FUF4rEP@lY$OvN8awVt{w3M_gIgT#?89%=ZK<3mnkSVFy z?8?nqIoqiP#)b}ObBPTp+S5k>qxEMrOJ@A|@uo#UyDv-WdRxg48)S5BiH=o(ic)m0 zBmD$1mjW4T%tzYS{M5N$@a55TEZx}#y;t0d9xJ^GFs_I(gLbt_uckqJAtu8cQR&`h z0IwFaGXUcRGFsTq%w|%nj6H}~KteYbv^Yr#$Ve)%B4O0S_wxfjv6+{?KC`c}CA#&^*0x>jgXsTG=C{|3!oMdR|%qfv$D@W2hP zqUm)n;lUeTL*t4snDhH9zl^4pUZ%h2^#^F*u;-}IU}ZdBoUG^y|c-O`MHK6u0H^p9>UQvVO7 z$#ws^G-EtAF0c6DGv53>YF2y@Rm;}I{dFJ3#}?Uk6**bh7G~53+Lj%{JGd26o{-R|AC`}d*g8C zauiJ*iErO}4PU<961(4i8}C)QkCl7{R{9mN#KjLgYd691euHpw(E=QqFdoMed*Y|y zAeXehLV)JoYKJoee@# z*1ZHWDirk&bguZ<&%7mbq(AFD@lay6A@~)C&wYfvF9%|1dVM6UEQJKZf!2u;mN6!*P*_r|y1erv9^uXjGa8kF^(^@(@fh(7mrZhsep`wd6CmR<4oOP$dA`7Y@E zS_nG566BC>X#YwVbfC0lc0-$&19(pJ*E*u@OKpv`d$}FjzSx##?a}_# z4(Rw=2XuP96ZMX0|1!;9X^+k=JJbJ8JZ?vK9cbPTonP;OfVVo)Z9BAnp%vP_@(!Nk>Zi zSO0VA!1(L>N;tYcAA$DI1fkV4?eWgb9nm*oFuwTw8x)=?wianr{!}vgjVMpr9~jp_ z=4w(`9As2ImJIeawWn70Jr6ROZk|}<>d8vi({!1vV&%Nr+Yc*Td@-AFb2uUtU$lN5 zvnpSYt5pErf2$o%j2MNSmtV!^4jr&FECh?5`6rhA^D!J9HG-ctOYy_7KG@W) zHBL<(gC8Sr$STePyh0tBfs;THyOmU9sxL=dtX;2k=8^7%*oZ zPLCdm84onUMgq*L*I&j5o!jGRuLOM8>K&}O?q;OlQ41I}3SS0>V^HN=G48JF_$Vj{ zA4h~^@#Bx-VBZ1Ad+l}1f8sG@zWECF3?7JMBZlMM&KbjUeOZMsYEs!Ni&wWrK`b zWb!E4*JdsKuCgmO8(3^evCV8{yOY>T$NKuW!Nj)H;(5u*$);;V15O1uY8m+T*I$kQ zwmaKDtF=Mq0vgL7xv+-BINevTh@wKah+puh&;5jNPNZPw`Zp1~q!QxO+|0g7aRdax zg<53KflNE@H(`K@UCm+FTfe!$eJQ_VhFKmYu*F*DaYbo=;fPa@ z^5nVWDAahMt6c5dvkUX*Ovn7WGjQz40f*_|L#a$uon_{v*iuqP>RkV>fy~vYt|-VT z9Vl@)#we=1Ht+uAp~L9Xv$VP3&c+yS|Rzi zDwtQk3bsG;0*)mN0A|ib##&GGv!%%+_%@&$(s})ohnizgWGv21n2G`xgfkmA z!1gxp;KL5>@pVua><;RNtt}qMGXEQ}_O5z3+j|f;wQ7UGRqn#9hWF#Wz+kNH+zAu! zZ-y^oqOiGB2kaR&48;p)0jsj`{kV~s-n=Ph{j)jtjv9zB@b{LG8M>}gM#Tp z@M-H8kbDQB&7W}RscF{M_!q4kW33Hy36OEL$~c3JT4V$=YLT%)=GrMn6WI9^X6LcE{Z@QkP%>LC0}bbUqVN| z1u_DR?wPLWnOz!j=@k*Zq9Wo_Z{&Gp#A%HgUf+Y@q;93y9CyTNg;PrlrTU($KwuC*EISP?$89CoYX}w5TdFzU+%VXFejr945>ZS`~|urlR)`CQ9vY zK6L0%(<*Z@JUYLht3fFwdNliEPoiUqX``b93urBO>TneJsM}E@1UmmK=I@Ndjedfp z-_tK==k#NmJabO>)0iz)@xa>k>(FmNf6Sdf4@Zt4Gdr1EVPm+NK+h=sI?g5Ph`Cxs zuii9%Iz_V5mdtI4xd3EJ9)u?nI=NxpN}U}JP0qU zkXhMEG#FR2Zq!1v+P54|ba)4Q-+B>wcin{B`fJ$VFAkV64BvNYgRKugi0_|&7JHw60qbw5iforMyytaT=2-z- z8$O7mef#kG1;FA3IMTZxHb43gV8lqAn=p31F(o7v%O_Y6b~N?%$S68v!(#^XW>_d^ZmAO;p>YxKv-WY)wg>h#($5yN z0%C=5?yUS`Wxxuzut;U61xtm61$;#szA{WemOhozcq8P$oatWSm!dg+$rJt$-{@y>Ha3@OOQ$SbVa_08&95YK1lTRL7$76|wcPhw%05 zFW{pGn_}C&cjKGJ4e>)$R_5g^AjQoKsote9*VP>x>(<8c*l?U3)(5|IB=j_Dgp`|a z#`YEu;k(yg#(o0HhmD$GYt0(iT)PIcudjraF7C*7_s8a&@5WCpp23;7I%EG6uV6>r zCRkOo4p!b?75NOu#=7;e{n1D8b<3CW-OJBoXS1f*(x3r;dhHeLf2Sq3)USh#+i%6Y z58aRNUwR&2{qs?5x%Wk6!KIktZSn=^b*C(rK2CkGc{Tz(5AtSpPDR0o_8EbJB!Yas50EivceMt0f&(w*W; zh;c(qz87M0{1Bd676J2aK-Bz3SoC2O@^??f)iekdS>ot=q$rIz(K7wugCgBjiWTjqU zRpd&VN~3=;QL0~12gVp}NSXasyYs>f}%iGhMLhb8~6h9w) z+^8Oob#9H_tzJUjJ-1_trzb(e4@tUj<%(ESwmkB+x00tf;fH`h$k^oVYsT|r6DT(N zR>b=iZpX&b*CWHbH2p1uB)ZS_D~n_gFC>>Kjg=M4A)R`Tzd!QIltFH}vdAl27OP8@ zHZ4-=zJ6F;zA`pcyaDU{N}F*)>s<+U45#yKq*a=JO*;cJ1RH^h%rCbf-ZhZ9GRm$T z?N%9Qc(H*-BBcsdEj5~&EqKYx%QJ&fwU^WM88h(n?!CsHrS!F@0f)>s{CDaUt8`v} zrkF)K-_u!~#IFS!!5{gFui@SP&>k49I8?B(-=rK*0eqrq#y4jrLpevRYyc zWDsa_d=QaY5fQ0(pkMAkk^IF#{8+dS`|%!*;8PsN2iS9F6}J954AVb+0==>;nQkF< zF_{*beEDsi3tYOdvchD66OR=xo||2?v-~Ng7*4g!5PB4jl}w{4cO(7F?$~p7J2B?O zp8}aBOO_xuHWr&UZ8GQfJF?%6zL~2U3)NcX(uuvp~fYSvm=TfQQ`Z_o%IG-!a;6)IxAn?F9j z{${*awJP#?o=$*S&B|V_6xjrpbY7Q2Fp|Hj+_l(UrpA<*u{mzYB1CMxu`)K@eLJ#m zt&9v`A6}~!gSD5EtJ$+j-CY6%`KeWZwaDH!4^M2Q{Z=nc85dNzA&1vwxp*SYozEnQ z@bocj$0T{UVuhER35V`)R`hlFrDxT)1TxF#^=o;(z2$%)#=ft@F43{zL}O&+-d;yW z?yiB%|6bV@Xen#VER<2x$`1nM`MD@V(B`fg5ci-W3!EpkM^^Wu& zii^*nxKP*g?VQtigoF6`*eWdC)*d}qT#sJbky@=FdDcRA8eprI7HeZi%|aqb2xO=W zIARUlco8_<%)r~2Jlf@ZAvE0|;b~RSE3XBXeG!XY#hLiFC<*yr^~1{dW0CdA0DO6J z34TEeHXZDZ(OViJK9hb4WC$WXG)S0G6_r{RF&X~6C+!^YWB^Jaqp;CDDqFi~)2#z! zWEYc0`z7Tue@82PcRCBFamebXP|~z(m_MKvE?j7~k@)DNkIcCp|Mq*4e$^&RI zob= zbHPI{^$niZ8ZBz!$Ro^X(K-z*)~?&{(cf)6))*6k!Unq8Zs5k1_Et-grbBPz`DVw$ zdpQjIS{|pldK$l0@Hw(+mQFp1VOUOhGW#vjPK(;9g{)k3Cm}%aGv4}-}n6&Pn`1sIVoWf5QxSe5~I#s5Z zQ)>0n7$ohp^wn2i88aIy^&YNnkkLz41b%jbqX3C#*SCU^ZBgU`)lGuJZ;w(Ee z1A_-V^z5o&*ywq`QQ?k>cl#1)gp+FN?Jm%VVvN53eKSxVaIm+_2N#+k{2;-0I>@ zfKf{i;fVlbwo?$m5Q2<2V8+^CN!t^s1xH;=0xlbJ&dW8Bxw6W+VziGhKDVJoz+%IU z&ZShj+S?jP<>#)!fc}Hgzuy2>##51g zr4gH23EeZw@m^YUM$@+~5kzTsY_-5BeCL5nEi$eIArC|^^~0!~rr5lD1dicLrcurC z(g0{B)_}TdZysE9_3r zO}^!cT~X7(awGk}Bi7<@^pk}|K|vv=O`D3*V@6@e&TS|vR(T;e>Q-gCmdJU4&prI5$tbeB>{_q+vr zpJ)w4_5ubC#fhkJY=8Ix%)72E7T$6Lva8>RwRcv>qEZBgIs}L3A4A&1jgfTAO_*24 zA4_k(9_iKY#KzliN19(Lq?9X*+#7F17LU~}v(u*>QVAldgp5yKeg>bmdI@XpxeGZi zzQ}d)!Ak$q`2LwEu)SU_EUQ=s*^O)9leeG4NB?Msyvh}^kPx)guQa}X{2%zR*@MWc zay#C8;C`S-1P~X4&mVaR$v0F)#vM0d_v<$Gw|9CZl^MqEu7 zmOX1r8%?V9N1J47Mv}}eII+5r)b*tuulb9`^4!K)>Xu z2q*CYw(sqQ;aT?~A zm{scX@j`I&_2`q|61l%D#*fIwhQlEkmT@Bzm%E@p{qLK6D+Z@Lggk=I&sc{ohsR?? zeiQV{EN`Z2YfTun$_Pkec~32*CxGff-K-a*h4grDh39sAaOJ`A&G&oZ;cq@3T6j#W9^mpF@2B?itm z4w0D-|J&+a4+n8C1r4S0YG@nYxR;z_VB>j^9{~KbW#>CBkM{J)JGD~RgB*xwb zO4G6==+QOjmF4c5y5j1>7js#4WxJM`F^icfikK*hMeI!GN)*QkGVLF*LB<Pa$ z-om+zFj!$2B5lipB3x}gZaBlV#91jY_$4#1I&l@dqtYb&)xaD?icJVV^Fl#*g zaO|0xY^&c8XXAR{eZomz)hhTgE(}PWhrOL!A*pO>q?WFL z`4z6i-gjDKf6F)V^%GCxmzFJ25FLRty%KRQI1nj>sUKf_8t0~r#hHHb_^4hDEGBHE zd;6HZp#)TGDBAaFwOXTGUCoZ%xfFqn^fg`t6JDe6o(CDV%BV}p0V@I-in^@MgN)U6 zb{=FJ5@Z(PbdlP}tb*zq$oywY6{Ov5A!P%M%$$`o%t*JpnXH)Bi?DRn*E$sd?fhUJ z`tU_qEMQ=+rI5SCm8gV%M%hJAVX39GQ`r#2XxRu(-| zT#zVGS$Q40FRg{7&wAq*Y{y3@7GlEchtMyxf&m!=E*fv+kXVI7tuWM0*OppnGOb;+ z%`7GZF@zb0ORYn(e1-(xZ%}$oq<nRT|wb#96P=b2akP^ zeMi5+o?~BQ-?4A7pXUdUeT#!MJ4mzNip=HaN4nWX+0A1Kk7Z`;zN0_iQsm#aIB?W5 zJ9yMdc>b#~mw)HwfVoB@KdfWRj$u0XgOlj|!fUN?(@%&0=iNAm{Xdn9WYKRIjzho(bQ5VZDr9T#}5-^ni-H;>EVMl zZhpvBO9(6UYe?L#J-|Cb%0mw|Wh~#&yR5t+@M-C$YBby~y(^ZN{K% zr)(iatoAE|{axB(S9}Q48r8=V*D_dDsVYu&>Wckuy^YN`-Hl9w&4X3BMX|@i*yCX&&evJvXRNNX^C07I zflTB2ShZv>K}H)!u#jNFFcp9i78%z-=HFI!1!;rK#pkxVlp9M)=L;}jfXpj8~F#+kTG3cgs`}DU-V764~y3%;EPYc#-2}3gVY3^gjrYT1mouvPiYD@ zP!%h_93qvHv=jq+Cm=IrIf_nc^G;Sqgb}l6mH?9RuF6?3WQ!>)Dd+P7#dxYN1?36H z>Mo8}p^^+D`7bNWTm5X9vBhpba0IW!oqiVLSfZb8f8OoIy0cu$&W1!y_b*oKA$>ef12C(>t2Gq1r<(sNM8dj2JNi2lpMf5{4SZ zoL}B0)D;C8Qy}Q;w1|bl8Fgt0WPl?l4x_{U7RabYW|f=9oOn?@k>jdetUa)z?CmJ* z6pK%vB*XycS1^&`k3qDj}5m~ z2O^^J^^;Fyb*bx+LeO}(Zap06)(+pk_5xP=m&Xdf^4R^x+t}T@JvPNRn&pd;*cifJ}ex8`@>5d;>dl|oWcoS=CSHXO5?WQeo@y13sZC>f+Xk9rEESC}+ zTrQRi-3ekWD6&Atg&HSwEh8E?qm_BH90P%A-h&_$vbZY7Zj8gbN8ZJ*qCBkr{8fxx zSq9N7z0hT)H#%pPMYqhmG4r!n{CI9BemtuB!kSRI|mRHM{F$5D0BVPrkDA5j`I6_G9kk@f~P8;%>Abbsxh~3!O*SLVI4@e#D(Tzl(lX zIfWr-=CIl5)%iEFX_BTz_>aN zy(aaV=sLa@I*q%JVZGDDU*Pzg5jgxFGN6$)y8 zXX3CLbw#;H49N8M^~G{8FJ!uDy0cm!+_2Uhdm#JzswfJN$H9b~Lq)OwLb{hQaH!OziMkl(x!GAiGM{ZBlH!*9QZHP!A$x`&UM zne<+rS~wZl0l&6-4SD4&VcRWt;&|(J_~PkjkyYh3EG<(8+a7ul1$+UAql58&i^fR5 ztrBLJ^25)szJj7It?^N#`;hLVtpl`LuP3(fIcRBLDd=bbPp^2j; zw~el;|AkUaGtSSQW}SJ8q5_mAXU?LC`K9=*S_3R~=4=su+4DKJd@>#L*S&$hOR6AY zC7~e8gY7tCL;wK)^hrcPRPf@CP>q#Q3y6W0%Y#h!EFbCw4W1jx@I}P(su;g12Jar; zgx!THSpC@(7?bXS?rE+FB4mWDsz~6djRjxD;`_5}@%^dASh(qa3?byir_o=*2!SP- z5@A|k)ZKIu$e6J(YI!02WV%_PLvsO`+(f5(Ab!c6h#d4X-h43vEg$HIfJgeF`!gdj zy4xb;&-euU-)Ci`nZGA3IakCANoC8~lbAhg5{3@%j~(xCGjUeHcsy2k2B%0Xg^cPV zCU~{VSZxLR0xzPRrVtwW4lJ0|3t(Qbnk4AACDtmp0w7&!clP`}mECG+w;T#;v~SqV znKQBH7gjERWu-@=nCCO;zy=swh`8spkRsCo-Tl1hSHum7$Mc=5BYa{*3`*w*c-p

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

Gu$r2h3*h?XjEqP~ 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 YT>1_}|7E?P7l? literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/cugraph/source/graph_support/property_graph.md new file mode 100644 index 000000000..4610cb7c3 --- /dev/null +++ b/docs/cugraph/source/graph_support/property_graph.md @@ -0,0 +1,54 @@ +

+
+ cuGraph +

+

+
+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. + +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.experimental.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)) +``` \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/wholegraph_support.rst b/docs/cugraph/source/graph_support/wholegraph_support.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index f1012c0fb..2dd871c4c 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -1,53 +1,24 @@ -Welcome to cugraph's documentation! +Welcome to cuGraph's documentation! =================================== 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 GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. -.. image:: images/Stack2.png - :width: 600 - :alt: Alternative text - -Basics -###### -.. toctree:: - :maxdepth: 2 - :caption: Basic cuGraph Information: - -General CuGraph Information - - `CuGraph Intro <./basics/cugraph_intro.md>`_ - - `Blogs and Presentation <./basics/cugraph_blogs.rst>`_ - - `How-to Guides <./basics/coming_soon.md>`_ - - `Performance <./basics/coming_soon.md>`_ - - `References <./basics/cugraph_ref.rst>`_ - -CuGraph Development and Contributing - - `Getting cuGraph Packages <./basics/coming_soon.md>`_ - - `Contributing to cuGraph <./basics/coming_soon.md>`_ - - `CuGraph Development Guide <./basics/coming_soon.md>`_ - -Algorithms - - `Current list of algorithms <./basics/coming_soon.md>`_ - - - -API -### -.. toctree:: - :maxdepth: 2 - - api_docs/index.rst - - .. toctree:: :maxdepth: 2 + :caption: Contents: - api_docs/c_and_cpp.rst + installation/index + tutorials/index + graph_support/index + references/index + dev_resources/index + releases/index + api_docs/index Indices and tables ================== * :ref:`genindex` -* :ref:`modindex` * :ref:`search` diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md new file mode 100644 index 000000000..390ef5221 --- /dev/null +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -0,0 +1,58 @@ + +# Getting cuGraph Packages + +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) + +Or checkout the [RAPIDS install selector](https://rapids.ai/start.html) for a pick list of install options. + +
+ +## Docker +The RAPIDS Docker containers contain all RAPIDS packages, including all from cuGraph, as well as all required supporting packages. To download a container, please see the [Docker Repository](https://hub.docker.com/r/rapidsai/rapidsai/), choosing a tag based on the NVIDIA CUDA version you’re running. This 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 [Miniconda](https://conda.io/miniconda.html) or get the full installation with [Anaconda](https://www.anaconda.com/download). + +cuGraph Conda packages + * cugraph - this will also import: + * pylibcugraph + * libcugraph + * cugraph-service-client + * cugraph-service-server + * cugraph-dgl + * cugraph-pyg + +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 numba -c conda-forge -c nvidia cugraph cudatoolkit=11.8 +``` + +Note: This conda installation only applies to Linux and Python versions 3.8/3.10. + +
+ +## PIP +cuGraph, and all of RAPIDS, is available via pip. + +``` +pip install cugraph-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +``` + +pip packages for other packages are being worked and should be available in early 2023 + +
+ +## SOURCE +cuGraph can be build directly from source. First check to make sure you have or can configure a supported environment. +Instructions for building from source is in our [source build](./SOURCEBUILD.md) page. diff --git a/docs/cugraph/source/installation/index.rst b/docs/cugraph/source/installation/index.rst new file mode 100644 index 000000000..f9e8acaa5 --- /dev/null +++ b/docs/cugraph/source/installation/index.rst @@ -0,0 +1,9 @@ +============ +Installation +============ + + +.. toctree:: + :maxdepth: 3 + + getting_cugraph \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_ref.rst b/docs/cugraph/source/references/cugraph_ref.rst similarity index 100% rename from docs/cugraph/source/basics/cugraph_ref.rst rename to docs/cugraph/source/references/cugraph_ref.rst diff --git a/docs/cugraph/source/references/datasets.rst b/docs/cugraph/source/references/datasets.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/references/index.rst b/docs/cugraph/source/references/index.rst new file mode 100644 index 000000000..e70df627f --- /dev/null +++ b/docs/cugraph/source/references/index.rst @@ -0,0 +1,9 @@ +========== +References +========== + + +.. toctree:: + :maxdepth: 3 + + cugraph_ref \ No newline at end of file diff --git a/docs/cugraph/source/references/licenses.rst b/docs/cugraph/source/references/licenses.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/releases/index.rst b/docs/cugraph/source/releases/index.rst new file mode 100644 index 000000000..7bd4f6dfa --- /dev/null +++ b/docs/cugraph/source/releases/index.rst @@ -0,0 +1,5 @@ +======== +Releases +======== + +https://github.com/rapidsai/cugraph/blob/main/CHANGELOG.md \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/blogs.rst b/docs/cugraph/source/tutorials/blogs.rst new file mode 100644 index 000000000..8f6623a98 --- /dev/null +++ b/docs/cugraph/source/tutorials/blogs.rst @@ -0,0 +1,8 @@ +============ +Blogs +============ + + +.. toctree:: + :maxdepth: 3 + cugraph_blogs.rst \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/community_resources.md b/docs/cugraph/source/tutorials/community_resources.md new file mode 100644 index 000000000..572f85a01 --- /dev/null +++ b/docs/cugraph/source/tutorials/community_resources.md @@ -0,0 +1,2 @@ +# Commmunity Resources +[Rapids Community Repository](https://github.com/rapidsai-community/notebooks-contrib) \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/tutorials/cugraph_blogs.rst similarity index 100% rename from docs/cugraph/source/basics/cugraph_blogs.rst rename to docs/cugraph/source/tutorials/cugraph_blogs.rst diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/cugraph/source/tutorials/cugraph_notebooks.md new file mode 100644 index 000000000..1624ef10a --- /dev/null +++ b/docs/cugraph/source/tutorials/cugraph_notebooks.md @@ -0,0 +1,77 @@ +# cuGraph Notebooks + +![GraphAnalyticsFigure](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](algorithms/centrality/Centrality.ipynb) | Compute and compare multiple (currently 5) centrality scores | +| | [Katz](algorithms/centrality/Katz.ipynb) | Compute the Katz centrality for every vertex | +| | [Betweenness](algorithms/centrality/Betweenness.ipynb) | Compute both Edge and Vertex Betweenness centrality | +| | [Degree](algorithms/centrality/Degree.ipynb) | Compute Degree Centraility for each vertex | +| | [Eigenvector](algorithms/centrality/Eigenvector.ipynb) | Compute Eigenvector for every vertex | +| Community | | | +| | [Louvain](algorithms/community/Louvain.ipynb) and Leiden | Identify clusters in a graph using both the Louvain and Leiden algorithms | +| | [ECG](algorithms/community/ECG.ipynb) | Identify clusters in a graph using the Ensemble Clustering for Graph | +| | [K-Truss](algorithms/community/ktruss.ipynb) | Extracts the K-Truss cluster | +| | [Spectral-Clustering](algorithms/community/Spectral-Clustering.ipynb) | Identify clusters in a graph using Spectral Clustering with both
- Balanced Cut
- Modularity Modularity | +| | [Subgraph Extraction](algorithms/community/Subgraph-Extraction.ipynb) | Compute a subgraph of the existing graph including only the specified vertices | +| | [Triangle Counting](algorithms/community/Triangle-Counting.ipynb) | Count the number of Triangle in a graph | +| Components | | | +| | [Connected Components](algorithms/components/ConnectedComponents.ipynb) | Find weakly and strongly connected components in a graph | +| Core | | | +| | [K-Core](algorithms/cores/kcore.ipynb) | Extracts the K-core cluster | +| | [Core Number](algorithms/cores/core-number.ipynb) | Computer the Core number for each vertex in a graph | +Layout | | | +| | [Force-Atlas2](algorithms/layout/Force-Atlas2.ipynb) |A large graph visualization achieved with cuGraph. | +| Link Analysis | | | +| | [Pagerank](algorithms/link_analysis/Pagerank.ipynb) | Compute the PageRank of every vertex in a graph | +| | [HITS](algorithms/link_analysis/HITS.ipynb) | Compute the HITS' Hub and Authority scores for every vertex in a graph | +| Link Prediction | | | +| | [Jaccard Similarity](algorithms/link_prediction/Jaccard-Similarity.ipynb) | Compute vertex similarity score using both:
- Jaccard Similarity
- Weighted Jaccard | +| | [Overlap Similarity](algorithms/link_prediction/Overlap-Similarity.ipynb) | Compute vertex similarity score using the Overlap Coefficient | +| Sampling | +| | [Random Walk](algorithms/sampling/RandomWalk.ipynb) | Compute Random Walk for a various number of seeds and path lengths | +| Traversal | | | +| | [BFS](algorithms/traversal/BFS.ipynb) | Compute the Breadth First Search path from a starting vertex to every other vertex in a graph | +| | [SSSP](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/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.8+ +* A system with an NVIDIA GPU: Pascal architecture or better +* CUDA 11.4+ +* NVIDIA driver 450.51+ + +#### Copyright + +Copyright (c) 2019-2022, 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. + + + + + +![RAPIDS](img/rapids_logo.png) \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/how_to_guides.md b/docs/cugraph/source/tutorials/how_to_guides.md new file mode 100644 index 000000000..42da6ed21 --- /dev/null +++ b/docs/cugraph/source/tutorials/how_to_guides.md @@ -0,0 +1,9 @@ +# How To Guides +- Basic use of cuGraph, on the page +- 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 \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/index.rst b/docs/cugraph/source/tutorials/index.rst new file mode 100644 index 000000000..2470bced7 --- /dev/null +++ b/docs/cugraph/source/tutorials/index.rst @@ -0,0 +1,12 @@ +========= +Tutorials +========= + + +.. toctree:: + :maxdepth: 3 + + how_to_guides.md + cugraph_blogs.rst + cugraph_notebooks.md + community_resources.md \ No newline at end of file From 1b031ab264b658787ff4fb75f7d7ab4511b64b43 Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Mon, 3 Apr 2023 09:41:21 -0400 Subject: [PATCH 238/384] Generate pyproject dependencies using dfg (#3355) This PR uses dependencies.yaml to generate the dependency lists in pyproject.toml Authors: - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3355 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a5d5a00ba..3c2f5fe2c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: pass_filenames: false additional_dependencies: [gitpython] - repo: https://github.com/rapidsai/dependency-file-generator - rev: v1.4.0 + rev: v1.5.1 hooks: - id: rapids-dependency-file-generator args: ["--clean"] From f51f00ff7a26ea35c2ba72d0d46fa50b288b5daa Mon Sep 17 00:00:00 2001 From: Joseph Nke <76006812+jnke2016@users.noreply.github.com> Date: Wed, 5 Apr 2023 08:23:16 -0500 Subject: [PATCH 239/384] Remove legacy renumbering (#2949) closes #2437 closes #1679 closes #2535 closes #2536 closes #2537 Authors: - Joseph Nke (https://github.com/jnke2016) - Chuck Hastings (https://github.com/ChuckHastings) - Alex Barghi (https://github.com/alexbarghi-nv) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) - Chuck Hastings (https://github.com/ChuckHastings) - Alex Barghi (https://github.com/alexbarghi-nv) - Vibhu Jawa (https://github.com/VibhuJawa) - Rick Ratzel (https://github.com/rlratzel) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/2949 --- docs/cugraph/source/api_docs/structure.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index ab097156c..0d6e28792 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -102,4 +102,3 @@ Other :toctree: api/ cugraph.hypergraph - cugraph.structure.shuffle From b01c85923f91a05bfb2f74c8a9db639dc40f6d0a Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 5 Apr 2023 14:59:36 -0400 Subject: [PATCH 240/384] Doc Updates (#3418) Trying to fix doc build issues Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3418 --- .../{ => cugraph-dgl}/cugraph_dgl.rst | 6 +- .../{ => cugraph-pyg}/cugraph_pyg.rst | 2 +- .../api_docs/{ => cugraph}/centrality.rst | 12 +- .../api_docs/{ => cugraph}/community.rst | 18 +- .../api_docs/{ => cugraph}/components.rst | 4 +- .../source/api_docs/{ => cugraph}/cores.rst | 4 +- .../api_docs/{ => cugraph}/cugraph_top.rst | 0 .../api_docs/{ => cugraph}/dask-cugraph.rst | 0 .../api_docs/{ => cugraph}/generator.rst | 2 +- .../{ => cugraph}/graph_implementation.rst | 2 +- .../{ => cugraph}/helper_functions.rst | 2 +- .../source/api_docs/{ => cugraph}/layout.rst | 2 +- .../{ => cugraph}/linear_assignment.rst | 2 +- .../api_docs/{ => cugraph}/link_analysis.rst | 8 +- .../{ => cugraph}/link_prediction.rst | 6 +- .../api_docs/{ => cugraph}/property_graph.rst | 2 +- .../api_docs/{ => cugraph}/sampling.rst | 4 +- .../source/api_docs/cugraph/structure.rst | 104 +++++++ .../api_docs/{ => cugraph}/traversal.rst | 8 +- .../source/api_docs/{ => cugraph}/tree.rst | 4 +- .../api_docs/{ => cugraph_c}/c_and_cpp.rst | 0 docs/cugraph/source/api_docs/index.rst | 12 +- .../api_docs/{ => plc}/pylibcugraph.rst | 2 +- .../{ => service}/cugraph_service_client.rst | 5 +- .../{ => service}/cugraph_service_server.rst | 2 +- docs/cugraph/source/basics/index.rst | 3 + .../source/graph_support/compatibility.rst | 2 +- docs/cugraph/source/index.rst | 1 + .../source/installation/getting_cugraph.md | 3 - docs/cugraph/source/installation/index.rst | 3 +- .../source/installation/source_build.md | 271 ++++++++++++++++++ docs/cugraph/source/tutorials/blogs.rst | 8 - docs/cugraph/source/tutorials/index.rst | 3 +- 33 files changed, 436 insertions(+), 71 deletions(-) rename docs/cugraph/source/api_docs/{ => cugraph-dgl}/cugraph_dgl.rst (58%) rename docs/cugraph/source/api_docs/{ => cugraph-pyg}/cugraph_pyg.rst (89%) rename docs/cugraph/source/api_docs/{ => cugraph}/centrality.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/community.rst (78%) rename docs/cugraph/source/api_docs/{ => cugraph}/components.rst (86%) rename docs/cugraph/source/api_docs/{ => cugraph}/cores.rst (73%) rename docs/cugraph/source/api_docs/{ => cugraph}/cugraph_top.rst (100%) rename docs/cugraph/source/api_docs/{ => cugraph}/dask-cugraph.rst (100%) rename docs/cugraph/source/api_docs/{ => cugraph}/generator.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/graph_implementation.rst (94%) rename docs/cugraph/source/api_docs/{ => cugraph}/helper_functions.rst (95%) rename docs/cugraph/source/api_docs/{ => cugraph}/layout.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/linear_assignment.rst (85%) rename docs/cugraph/source/api_docs/{ => cugraph}/link_analysis.rst (75%) rename docs/cugraph/source/api_docs/{ => cugraph}/link_prediction.rst (84%) rename docs/cugraph/source/api_docs/{ => cugraph}/property_graph.rst (96%) rename docs/cugraph/source/api_docs/{ => cugraph}/sampling.rst (80%) create mode 100644 docs/cugraph/source/api_docs/cugraph/structure.rst rename docs/cugraph/source/api_docs/{ => cugraph}/traversal.rst (82%) rename docs/cugraph/source/api_docs/{ => cugraph}/tree.rst (83%) rename docs/cugraph/source/api_docs/{ => cugraph_c}/c_and_cpp.rst (100%) rename docs/cugraph/source/api_docs/{ => plc}/pylibcugraph.rst (94%) rename docs/cugraph/source/api_docs/{ => service}/cugraph_service_client.rst (95%) rename docs/cugraph/source/api_docs/{ => service}/cugraph_service_server.rst (92%) create mode 100644 docs/cugraph/source/installation/source_build.md delete mode 100644 docs/cugraph/source/tutorials/blogs.rst diff --git a/docs/cugraph/source/api_docs/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst similarity index 58% rename from docs/cugraph/source/api_docs/cugraph_dgl.rst rename to docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst index 98e101f99..4ffecd8d0 100644 --- a/docs/cugraph/source/api_docs/cugraph_dgl.rst +++ b/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst @@ -9,7 +9,7 @@ cugraph-dgl Methods ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph-dgl/ - cugraph_dgl.cugraph_storage_from_heterograph - cugraph_dgl.cugraph_storage.CuGraphStorage + convert.cugraph_storage_from_heterograph + cugraph_storage.CuGraphStorage diff --git a/docs/cugraph/source/api_docs/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst similarity index 89% rename from docs/cugraph/source/api_docs/cugraph_pyg.rst rename to docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst index 7e25b3547..2cd8969aa 100644 --- a/docs/cugraph/source/api_docs/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst @@ -7,7 +7,7 @@ cugraph-pyg .. currentmodule:: cugraph_pyg .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph-pyg/ cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/cugraph/centrality.rst similarity index 80% rename from docs/cugraph/source/api_docs/centrality.rst rename to docs/cugraph/source/api_docs/cugraph/centrality.rst index 9b634cb6d..c3b026597 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/cugraph/centrality.rst @@ -8,7 +8,7 @@ Centrality Betweenness Centrality ---------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.betweenness_centrality cugraph.edge_betweenness_centrality @@ -16,34 +16,34 @@ Betweenness Centrality Katz Centrality --------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.katz_centrality Katz Centrality (MG) -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.centrality.katz_centrality.katz_centrality Degree Centrality ----------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.degree_centrality Eigenvector Centrality ---------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.centrality.eigenvector_centrality Eigenvector Centrality (MG) --------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.centrality.eigenvector_centrality.eigenvector_centrality diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/cugraph/community.rst similarity index 78% rename from docs/cugraph/source/api_docs/community.rst rename to docs/cugraph/source/api_docs/cugraph/community.rst index 94eb1a49c..acbaa086f 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/cugraph/community.rst @@ -8,7 +8,7 @@ Community EgoNet ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.batched_ego_graphs cugraph.ego_graph @@ -16,7 +16,7 @@ EgoNet Ensemble clustering for graphs (ECG) ------------------------------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.ecg @@ -24,7 +24,7 @@ Ensemble clustering for graphs (ECG) K-Truss ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.k_truss cugraph.ktruss_subgraph @@ -32,7 +32,7 @@ K-Truss Leiden ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.leiden @@ -40,7 +40,7 @@ Leiden Louvain ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.louvain @@ -48,14 +48,14 @@ Louvain Louvain (MG) ------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.community.louvain.louvain Spectral Clustering ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.analyzeClustering_edge_cut cugraph.analyzeClustering_modularity @@ -67,7 +67,7 @@ Spectral Clustering Subgraph Extraction ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.subgraph @@ -75,6 +75,6 @@ Subgraph Extraction Triangle Counting ----------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.triangle_count diff --git a/docs/cugraph/source/api_docs/components.rst b/docs/cugraph/source/api_docs/cugraph/components.rst similarity index 86% rename from docs/cugraph/source/api_docs/components.rst rename to docs/cugraph/source/api_docs/cugraph/components.rst index 8616c8742..5835972cd 100644 --- a/docs/cugraph/source/api_docs/components.rst +++ b/docs/cugraph/source/api_docs/cugraph/components.rst @@ -8,7 +8,7 @@ Components Connected Components -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.connected_components cugraph.strongly_connected_components @@ -18,7 +18,7 @@ Connected Components Connected Components (MG) ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.components.connectivity.weakly_connected_components diff --git a/docs/cugraph/source/api_docs/cores.rst b/docs/cugraph/source/api_docs/cugraph/cores.rst similarity index 73% rename from docs/cugraph/source/api_docs/cores.rst rename to docs/cugraph/source/api_docs/cugraph/cores.rst index 0e48c584b..9d274d1c4 100644 --- a/docs/cugraph/source/api_docs/cores.rst +++ b/docs/cugraph/source/api_docs/cugraph/cores.rst @@ -8,7 +8,7 @@ Cores Core Number ----------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.core_number @@ -16,6 +16,6 @@ Core Number K-Core ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.k_core diff --git a/docs/cugraph/source/api_docs/cugraph_top.rst b/docs/cugraph/source/api_docs/cugraph/cugraph_top.rst similarity index 100% rename from docs/cugraph/source/api_docs/cugraph_top.rst rename to docs/cugraph/source/api_docs/cugraph/cugraph_top.rst diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst similarity index 100% rename from docs/cugraph/source/api_docs/dask-cugraph.rst rename to docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/generator.rst b/docs/cugraph/source/api_docs/cugraph/generator.rst similarity index 80% rename from docs/cugraph/source/api_docs/generator.rst rename to docs/cugraph/source/api_docs/cugraph/generator.rst index e89fe25e8..9b4ebbcf7 100644 --- a/docs/cugraph/source/api_docs/generator.rst +++ b/docs/cugraph/source/api_docs/cugraph/generator.rst @@ -8,7 +8,7 @@ Generator RMAT ---- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.generators.rmat diff --git a/docs/cugraph/source/api_docs/graph_implementation.rst b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst similarity index 94% rename from docs/cugraph/source/api_docs/graph_implementation.rst rename to docs/cugraph/source/api_docs/cugraph/graph_implementation.rst index f6dc38a27..91c16c242 100644 --- a/docs/cugraph/source/api_docs/graph_implementation.rst +++ b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst @@ -7,7 +7,7 @@ Graph Implementation Graph Implementation -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ view_edge_list delete_edge_list diff --git a/docs/cugraph/source/api_docs/helper_functions.rst b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst similarity index 95% rename from docs/cugraph/source/api_docs/helper_functions.rst rename to docs/cugraph/source/api_docs/cugraph/helper_functions.rst index 08585d264..ec3248bfa 100644 --- a/docs/cugraph/source/api_docs/helper_functions.rst +++ b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst @@ -8,7 +8,7 @@ DASK MG Helper functions Methods ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.comms.comms.initialize cugraph.dask.comms.comms.destroy diff --git a/docs/cugraph/source/api_docs/layout.rst b/docs/cugraph/source/api_docs/cugraph/layout.rst similarity index 80% rename from docs/cugraph/source/api_docs/layout.rst rename to docs/cugraph/source/api_docs/cugraph/layout.rst index b3943e4d3..1c097346b 100644 --- a/docs/cugraph/source/api_docs/layout.rst +++ b/docs/cugraph/source/api_docs/cugraph/layout.rst @@ -8,7 +8,7 @@ Layout Force Atlas 2 ------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.force_atlas2 diff --git a/docs/cugraph/source/api_docs/linear_assignment.rst b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst similarity index 85% rename from docs/cugraph/source/api_docs/linear_assignment.rst rename to docs/cugraph/source/api_docs/cugraph/linear_assignment.rst index 383bb4d43..dfdf6da96 100644 --- a/docs/cugraph/source/api_docs/linear_assignment.rst +++ b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst @@ -8,7 +8,7 @@ Linear Assignment Hungarian --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.hungarian cugraph.dense_hungarian diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst similarity index 75% rename from docs/cugraph/source/api_docs/link_analysis.rst rename to docs/cugraph/source/api_docs/cugraph/link_analysis.rst index b84dd2ccb..5f977b477 100644 --- a/docs/cugraph/source/api_docs/link_analysis.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst @@ -8,14 +8,14 @@ Link Analysis HITS ---- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.hits HITS (MG) --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.link_analysis.hits.hits @@ -23,14 +23,14 @@ HITS (MG) Pagerank -------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.pagerank Pagerank (MG) ------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.link_analysis.pagerank.pagerank diff --git a/docs/cugraph/source/api_docs/link_prediction.rst b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst similarity index 84% rename from docs/cugraph/source/api_docs/link_prediction.rst rename to docs/cugraph/source/api_docs/cugraph/link_prediction.rst index 7c7b34f2f..b2134fba9 100644 --- a/docs/cugraph/source/api_docs/link_prediction.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst @@ -8,7 +8,7 @@ Link Prediction Jaccard Coefficient ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.jaccard cugraph.jaccard_coefficient @@ -18,7 +18,7 @@ Jaccard Coefficient Overlap Coefficient ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.overlap cugraph.overlap_coefficient @@ -28,7 +28,7 @@ Overlap Coefficient Sorensen Coefficient -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.sorensen cugraph.sorensen_coefficient diff --git a/docs/cugraph/source/api_docs/property_graph.rst b/docs/cugraph/source/api_docs/cugraph/property_graph.rst similarity index 96% rename from docs/cugraph/source/api_docs/property_graph.rst rename to docs/cugraph/source/api_docs/cugraph/property_graph.rst index f3653c085..672aa7dae 100644 --- a/docs/cugraph/source/api_docs/property_graph.rst +++ b/docs/cugraph/source/api_docs/cugraph/property_graph.rst @@ -7,7 +7,7 @@ Property Graph Property Graph ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ PropertySelection PropertyGraph diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/cugraph/sampling.rst similarity index 80% rename from docs/cugraph/source/api_docs/sampling.rst rename to docs/cugraph/source/api_docs/cugraph/sampling.rst index bab8aee6b..52004a5b1 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/cugraph/sampling.rst @@ -8,7 +8,7 @@ Sampling Random Walks ------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.random_walks cugraph.ego_graph @@ -17,6 +17,6 @@ Random Walks Node2Vec --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.node2vec diff --git a/docs/cugraph/source/api_docs/cugraph/structure.rst b/docs/cugraph/source/api_docs/cugraph/structure.rst new file mode 100644 index 000000000..5114cb57b --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph/structure.rst @@ -0,0 +1,104 @@ +============= +Graph Classes +============= +.. currentmodule:: cugraph + +Constructors +------------ +.. autosummary:: + :toctree: ../api/cugraph/ + + Graph + MultiGraph + BiPartiteGraph + + + +Adding Data +----------- +.. autosummary:: + :toctree: ../api/cugraph/ + + + Graph.from_cudf_adjlist + Graph.from_cudf_edgelist + Graph.from_dask_cudf_edgelist + Graph.from_pandas_adjacency + Graph.from_pandas_edgelist + Graph.from_numpy_array + Graph.from_numpy_matrix + Graph.add_internal_vertex_id + Graph.add_nodes_from + Graph.clear + Graph.unrenumber + +Checks +------ +.. autosummary:: + :toctree: ../api/cugraph/ + + Graph.has_isolated_vertices + Graph.is_bipartite + Graph.is_directed + Graph.is_multigraph + Graph.is_multipartite + Graph.is_renumbered + Graph.is_weighted + Graph.lookup_internal_vertex_id + Graph.to_directed + Graph.to_undirected + + +Symmetrize +---------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.symmetrize + cugraph.symmetrize_ddf + cugraph.symmetrize_df + + +Conversion from Other Formats +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.from_adjlist + cugraph.from_cudf_edgelist + cugraph.from_edgelist + cugraph.from_numpy_array + cugraph.from_numpy_matrix + cugraph.from_pandas_adjacency + cugraph.from_pandas_edgelist + cugraph.to_numpy_array + cugraph.to_numpy_matrix + cugraph.to_pandas_adjacency + cugraph.to_pandas_edgelist + +NumberMap +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.structure.NumberMap + cugraph.structure.NumberMap.MultiGPU + cugraph.structure.NumberMap.SingleGPU + cugraph.structure.NumberMap.from_internal_vertex_id + cugraph.structure.NumberMap.to_internal_vertex_id + cugraph.structure.NumberMap.add_internal_vertex_id + cugraph.structure.NumberMap.compute_vals + cugraph.structure.NumberMap.compute_vals_types + cugraph.structure.NumberMap.generate_unused_column_name + cugraph.structure.NumberMap.renumber + cugraph.structure.NumberMap.renumber_and_segment + cugraph.structure.NumberMap.set_renumbered_col_names + cugraph.structure.NumberMap.unrenumber + cugraph.structure.NumberMap.vertex_column_size + +Other +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.hypergraph diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/cugraph/traversal.rst similarity index 82% rename from docs/cugraph/source/api_docs/traversal.rst rename to docs/cugraph/source/api_docs/cugraph/traversal.rst index 675bf89f3..c8fcc6b72 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/cugraph/traversal.rst @@ -8,7 +8,7 @@ Traversal Breadth-first-search -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.bfs cugraph.bfs_edges @@ -16,14 +16,14 @@ Breadth-first-search Breadth-first-search (MG) ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.traversal.bfs.bfs Single-source-shortest-path --------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.filter_unreachable cugraph.shortest_path @@ -33,6 +33,6 @@ Single-source-shortest-path Single-source-shortest-path (MG) -------------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.traversal.sssp.sssp diff --git a/docs/cugraph/source/api_docs/tree.rst b/docs/cugraph/source/api_docs/cugraph/tree.rst similarity index 83% rename from docs/cugraph/source/api_docs/tree.rst rename to docs/cugraph/source/api_docs/cugraph/tree.rst index 7952c4fa3..38bfbad7d 100644 --- a/docs/cugraph/source/api_docs/tree.rst +++ b/docs/cugraph/source/api_docs/cugraph/tree.rst @@ -8,7 +8,7 @@ Tree Minimum Spanning Tree --------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.tree.minimum_spanning_tree.minimum_spanning_tree @@ -16,7 +16,7 @@ Minimum Spanning Tree Maximum Spanning Tree --------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.tree.minimum_spanning_tree.maximum_spanning_tree diff --git a/docs/cugraph/source/api_docs/c_and_cpp.rst b/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst similarity index 100% rename from docs/cugraph/source/api_docs/c_and_cpp.rst rename to docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 0e7598af0..f6307d5ac 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -8,9 +8,9 @@ This page provides a list of all publicly accessible modules, methods and classe :maxdepth: 2 :caption: Python API Documentation - cugraph_top.rst - pylibcugraph.rst - cugraph_dgl.rst - cugraph_pyg.rst - cugraph_service_client.rst - cugraph_service_server.rst + cugraph/cugraph_top.rst + plc/pylibcugraph.rst + cugraph-dgl/cugraph_dgl.rst + cugraph-pyg/cugraph_pyg.rst + service/cugraph_service_client.rst + service/cugraph_service_server.rst diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/plc/pylibcugraph.rst similarity index 94% rename from docs/cugraph/source/api_docs/pylibcugraph.rst rename to docs/cugraph/source/api_docs/plc/pylibcugraph.rst index 7b63cd7dc..7ebdd67e9 100644 --- a/docs/cugraph/source/api_docs/pylibcugraph.rst +++ b/docs/cugraph/source/api_docs/plc/pylibcugraph.rst @@ -9,7 +9,7 @@ pylibcugraph Methods ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/plc/ pylibcugraph.eigenvector_centrality pylibcugraph.katz_centrality diff --git a/docs/cugraph/source/api_docs/cugraph_service_client.rst b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst similarity index 95% rename from docs/cugraph/source/api_docs/cugraph_service_client.rst rename to docs/cugraph/source/api_docs/service/cugraph_service_client.rst index 1ea727bd3..383b31d26 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_client.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst @@ -7,7 +7,7 @@ cugraph-service .. currentmodule:: cugraph-service .. autosummary:: - :toctree: api/ + :toctree: ../api/service/ cugraph_service_client.client.RunAsyncioThread cugraph_service_client.client.run_async @@ -18,6 +18,3 @@ cugraph-service cugraph_service_client.types.UnionWrapper cugraph_service_client.types.ValueWrapper cugraph_service_client.types.GraphVertexEdgeIDWrapper - - - diff --git a/docs/cugraph/source/api_docs/cugraph_service_server.rst b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst similarity index 92% rename from docs/cugraph/source/api_docs/cugraph_service_server.rst rename to docs/cugraph/source/api_docs/service/cugraph_service_server.rst index 5f4c6aa5e..a7e8b5475 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_server.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst @@ -7,7 +7,7 @@ cugraph-service .. currentmodule:: cugraph-service .. autosummary:: - :toctree: api/ + :toctree: ../api/service/ cugraph_service_server.cugraph_handler.call_algo cugraph_service_server.cugraph_handler.ExtensionServerFacade diff --git a/docs/cugraph/source/basics/index.rst b/docs/cugraph/source/basics/index.rst index 46331fc6c..1875ac22b 100644 --- a/docs/cugraph/source/basics/index.rst +++ b/docs/cugraph/source/basics/index.rst @@ -6,4 +6,7 @@ Basics .. toctree:: :maxdepth: 2 + cugraph_intro cugraph_toc.md + nx_transition + cugraph_cascading diff --git a/docs/cugraph/source/graph_support/compatibility.rst b/docs/cugraph/source/graph_support/compatibility.rst index 38f6df4c7..be0cc21c2 100644 --- a/docs/cugraph/source/graph_support/compatibility.rst +++ b/docs/cugraph/source/graph_support/compatibility.rst @@ -5,4 +5,4 @@ Compatibility .. toctree:: :maxdepth: 3 - Compatibility \ No newline at end of file +Compatibility document coming soon \ No newline at end of file diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 2dd871c4c..12bc74aea 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -9,6 +9,7 @@ NetworkX Graphs, or even CuPy or SciPy sparse Matrices. :maxdepth: 2 :caption: Contents: + basics/index installation/index tutorials/index graph_support/index diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 390ef5221..005938f47 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -53,6 +53,3 @@ pip packages for other packages are being worked and should be available in earl
-## SOURCE -cuGraph can be build directly from source. First check to make sure you have or can configure a supported environment. -Instructions for building from source is in our [source build](./SOURCEBUILD.md) page. diff --git a/docs/cugraph/source/installation/index.rst b/docs/cugraph/source/installation/index.rst index f9e8acaa5..27858b770 100644 --- a/docs/cugraph/source/installation/index.rst +++ b/docs/cugraph/source/installation/index.rst @@ -6,4 +6,5 @@ Installation .. toctree:: :maxdepth: 3 - getting_cugraph \ No newline at end of file + getting_cugraph + source_build diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md new file mode 100644 index 000000000..cd9297abc --- /dev/null +++ b/docs/cugraph/source/installation/source_build.md @@ -0,0 +1,271 @@ +# Building from Source + +The following instructions are for users wishing to build cuGraph from source code. These instructions are tested on supported distributions of Linux, CUDA, and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) for list of supported environments. Other operating systems _might be_ compatible, but are not currently tested. + +The cuGraph package include both a C/C++ CUDA portion and a python portion. Both libraries need to be installed in order for cuGraph to operate correctly. + +## Prerequisites + +__Compiler__: +* `gcc` version 9.3+ +* `nvcc` version 11.0+ +* `cmake` version 3.20.1+ + +__CUDA:__ +* CUDA 11.0+ +* NVIDIA driver 450.80.02+ +* Pascal architecture or better + +You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). + + +## Building cuGraph +To install cuGraph from source, ensure the dependencies are met. + + +### Clone Repo and Configure Conda Environment +__GIT clone a version of the repository__ + + ```bash + # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME + export CUGRAPH_HOME=$(pwd)/cugraph + + # Download the cuGraph repo - if you have a folked version, use that path here instead + git clone https://github.com/rapidsai/cugraph.git $CUGRAPH_HOME + + cd $CUGRAPH_HOME + ``` + +__Create the conda development environment__ + +```bash +# create the conda environment (assuming in base `cugraph` directory) + +# for CUDA 11.5 +conda env create --name cugraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml + +# activate the environment +conda activate cugraph_dev + +# to deactivate an environment +conda deactivate +``` + + - The environment can be updated as development includes/changes the dependencies. To do so, run: + + +```bash + +# Where XXX is the CUDA 11 version +conda env update --name cugraph_dev --file conda/environments/cugraph_dev_cuda11.XXX.yml + +conda activate cugraph_dev +``` + + +### Build and Install Using the `build.sh` Script +Using the `build.sh` script make compiling and installing cuGraph a breeze. To build and install, simply do: + +```bash +$ cd $CUGRAPH_HOME +$ ./build.sh clean +$ ./build.sh libcugraph +$ ./build.sh cugraph +``` + +There are several other options available on the build script for advanced users. +`build.sh` options: +```bash +build.sh [ ...] [ ...] + where is: + clean - remove all existing build artifacts and configuration (start over) + uninstall - uninstall libcugraph and cugraph from a prior build/install (see also -n) + libcugraph - build libcugraph.so and SG test binaries + libcugraph_etl - build libcugraph_etl.so and SG test binaries + pylibcugraph - build the pylibcugraph Python package + cugraph - build the cugraph Python package + cugraph-service - build the cugraph-service_client and cugraph-service_server Python package + cpp-mgtests - build libcugraph and libcugraph_etl MG tests. Builds MPI communicator, adding MPI as a dependency. + cugraph-dgl - build the cugraph-dgl extensions for DGL + cugraph-pyg - build the cugraph-dgl extensions for PyG + docs - build the docs + and is: + -v - verbose build mode + -g - build for debug + -n - do not install after a successful build + --pydevelop - use setup.py develop instead of install + --allgpuarch - build for all supported GPU architectures + --skip_cpp_tests - do not build the SG test binaries as part of the libcugraph and libcugraph_etl targets + --without_cugraphops - do not build algos that require cugraph-ops + --cmake_default_generator - use the default cmake generator instead of ninja + --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) + -h - print this text + + default action (no args) is to build and install 'libcugraph' then 'libcugraph_etl' then 'pylibcugraph' then 'cugraph' then 'cugraph-service' targets + +examples: +$ ./build.sh clean # remove prior build artifacts (start over) +$ ./build.sh libcugraph -v # compile and install libcugraph with verbose output +$ ./build.sh libcugraph -g # compile and install libcugraph for debug +$ ./build.sh libcugraph -n # compile libcugraph but do not install + +# make parallelism options can also be defined: Example build jobs using 4 threads (make -j4) +$ PARALLEL_LEVEL=4 ./build.sh libcugraph + +Note that the libraries will be installed to the location set in `$PREFIX` if set (i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. +``` + + +## Building each section independently +#### Build and Install the C++/CUDA `libcugraph` Library +CMake depends on the `nvcc` executable being on your path or defined in `$CUDACXX`. + +This project uses cmake for building the C/C++ library. To configure cmake, run: + + ```bash + # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME + export CUGRAPH_HOME=$(pwd)/cugraph + + cd $CUGRAPH_HOME + cd cpp # enter cpp directory + mkdir build # create build directory + cd build # enter the build directory + cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX + + # now build the code + make -j # "-j" starts multiple threads + make install # install the libraries + ``` +The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/cugraph` respectively. + +#### 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. + +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. + +### Building and installing the Python package + +2) Install the Python packages to your Python path: + +```bash +cd $CUGRAPH_HOME +cd python +cd pylibcugraph +python setup.py build_ext --inplace +python setup.py install # install pylibcugraph +cd ../cugraph +python setup.py build_ext --inplace +python setup.py install # install cugraph python bindings + +``` + + + +## 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.8/3.10. + +### (OPTIONAL) Set environment variable on activation + +It is possible to configure the conda environment to set environmental 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/cugraph/source/tutorials/blogs.rst b/docs/cugraph/source/tutorials/blogs.rst deleted file mode 100644 index 8f6623a98..000000000 --- a/docs/cugraph/source/tutorials/blogs.rst +++ /dev/null @@ -1,8 +0,0 @@ -============ -Blogs -============ - - -.. toctree:: - :maxdepth: 3 - cugraph_blogs.rst \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/index.rst b/docs/cugraph/source/tutorials/index.rst index 2470bced7..cce352509 100644 --- a/docs/cugraph/source/tutorials/index.rst +++ b/docs/cugraph/source/tutorials/index.rst @@ -8,5 +8,4 @@ Tutorials how_to_guides.md cugraph_blogs.rst - cugraph_notebooks.md - community_resources.md \ No newline at end of file + community_resources.md From b2e29e839515029d30ff03adaa5c903870467375 Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Mon, 10 Apr 2023 07:23:45 -0700 Subject: [PATCH 241/384] Branch 23.06 resolve merge conflict for forward merge (#3409) Resolves merge conflict Authors: - Alex Barghi (https://github.com/alexbarghi-nv) - Joseph Nke (https://github.com/jnke2016) - Vibhu Jawa (https://github.com/VibhuJawa) - Don Acosta (https://github.com/acostadon) - Vyas Ramasubramani (https://github.com/vyasr) - Artur (https://github.com/ArturKasymov) - Naim (https://github.com/naimnv) - Lawrence Mitchell (https://github.com/wence-) - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) - Tingyu Wang (https://github.com/tingyu66) - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) - GALI PREM SAGAR (https://github.com/galipremsagar) - Ray Douglass (https://github.com/raydouglass) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/3409 --- .pre-commit-config.yaml | 2 +- .../api_docs/cugraph-dgl/cugraph_dgl.rst | 15 + .../{ => cugraph-pyg}/cugraph_pyg.rst | 2 +- .../api_docs/{ => cugraph}/centrality.rst | 12 +- .../api_docs/{ => cugraph}/community.rst | 18 +- .../api_docs/{ => cugraph}/components.rst | 4 +- .../source/api_docs/{ => cugraph}/cores.rst | 4 +- .../api_docs/{ => cugraph}/cugraph_top.rst | 0 .../api_docs/{ => cugraph}/dask-cugraph.rst | 0 .../api_docs/{ => cugraph}/generator.rst | 2 +- .../{ => cugraph}/graph_implementation.rst | 2 +- .../{ => cugraph}/helper_functions.rst | 2 +- .../source/api_docs/{ => cugraph}/layout.rst | 2 +- .../{ => cugraph}/linear_assignment.rst | 2 +- .../api_docs/{ => cugraph}/link_analysis.rst | 8 +- .../{ => cugraph}/link_prediction.rst | 6 +- .../api_docs/{ => cugraph}/property_graph.rst | 2 +- .../api_docs/{ => cugraph}/sampling.rst | 4 +- .../source/api_docs/cugraph/structure.rst | 104 +++++++ .../api_docs/{ => cugraph}/traversal.rst | 8 +- .../source/api_docs/{ => cugraph}/tree.rst | 4 +- .../api_docs/{ => cugraph_c}/c_and_cpp.rst | 0 docs/cugraph/source/api_docs/cugraph_dgl.rst | 15 - docs/cugraph/source/api_docs/index.rst | 12 +- .../api_docs/{ => plc}/pylibcugraph.rst | 2 +- .../{ => service}/cugraph_service_client.rst | 5 +- .../{ => service}/cugraph_service_server.rst | 2 +- docs/cugraph/source/api_docs/structure.rst | 1 - docs/cugraph/source/basics/index.rst | 3 + docs/cugraph/source/dev_resources/API.rst | 5 + docs/cugraph/source/dev_resources/index.rst | 10 + .../source/graph_support/DGL_support.md | 55 ++++ .../source/graph_support/PyG_support.md | 3 + .../source/graph_support/algorithms.md | 85 ++++++ .../source/graph_support/compatibility.rst | 8 + .../source/graph_support/cugraph_service.rst | 9 + .../graph_support/cugraphops_support.rst | 10 + .../source/graph_support/datastores.rst | 11 + .../source/graph_support/feature_stores.md | 0 .../source/graph_support/gnn_support.rst | 12 + .../source/graph_support/graph_algorithms.rst | 9 + docs/cugraph/source/graph_support/index.rst | 13 + .../source/graph_support/knowledge_stores.md | 0 .../source/graph_support/pg_example.png | Bin 0 -> 242398 bytes .../source/graph_support/property_graph.md | 54 ++++ .../graph_support/wholegraph_support.rst | 0 docs/cugraph/source/index.rst | 48 +--- .../source/installation/getting_cugraph.md | 55 ++++ docs/cugraph/source/installation/index.rst | 10 + .../source/installation/source_build.md | 271 ++++++++++++++++++ .../{basics => references}/cugraph_ref.rst | 0 docs/cugraph/source/references/datasets.rst | 0 docs/cugraph/source/references/index.rst | 9 + docs/cugraph/source/references/licenses.rst | 0 docs/cugraph/source/releases/index.rst | 5 + .../source/tutorials/community_resources.md | 2 + .../{basics => tutorials}/cugraph_blogs.rst | 0 .../source/tutorials/cugraph_notebooks.md | 77 +++++ .../cugraph/source/tutorials/how_to_guides.md | 9 + docs/cugraph/source/tutorials/index.rst | 11 + 60 files changed, 916 insertions(+), 108 deletions(-) create mode 100644 docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst rename docs/cugraph/source/api_docs/{ => cugraph-pyg}/cugraph_pyg.rst (89%) rename docs/cugraph/source/api_docs/{ => cugraph}/centrality.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/community.rst (78%) rename docs/cugraph/source/api_docs/{ => cugraph}/components.rst (86%) rename docs/cugraph/source/api_docs/{ => cugraph}/cores.rst (73%) rename docs/cugraph/source/api_docs/{ => cugraph}/cugraph_top.rst (100%) rename docs/cugraph/source/api_docs/{ => cugraph}/dask-cugraph.rst (100%) rename docs/cugraph/source/api_docs/{ => cugraph}/generator.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/graph_implementation.rst (94%) rename docs/cugraph/source/api_docs/{ => cugraph}/helper_functions.rst (95%) rename docs/cugraph/source/api_docs/{ => cugraph}/layout.rst (80%) rename docs/cugraph/source/api_docs/{ => cugraph}/linear_assignment.rst (85%) rename docs/cugraph/source/api_docs/{ => cugraph}/link_analysis.rst (75%) rename docs/cugraph/source/api_docs/{ => cugraph}/link_prediction.rst (84%) rename docs/cugraph/source/api_docs/{ => cugraph}/property_graph.rst (96%) rename docs/cugraph/source/api_docs/{ => cugraph}/sampling.rst (80%) create mode 100644 docs/cugraph/source/api_docs/cugraph/structure.rst rename docs/cugraph/source/api_docs/{ => cugraph}/traversal.rst (82%) rename docs/cugraph/source/api_docs/{ => cugraph}/tree.rst (83%) rename docs/cugraph/source/api_docs/{ => cugraph_c}/c_and_cpp.rst (100%) delete mode 100644 docs/cugraph/source/api_docs/cugraph_dgl.rst rename docs/cugraph/source/api_docs/{ => plc}/pylibcugraph.rst (94%) rename docs/cugraph/source/api_docs/{ => service}/cugraph_service_client.rst (95%) rename docs/cugraph/source/api_docs/{ => service}/cugraph_service_server.rst (92%) create mode 100644 docs/cugraph/source/dev_resources/API.rst create mode 100644 docs/cugraph/source/dev_resources/index.rst create mode 100644 docs/cugraph/source/graph_support/DGL_support.md create mode 100644 docs/cugraph/source/graph_support/PyG_support.md create mode 100644 docs/cugraph/source/graph_support/algorithms.md create mode 100644 docs/cugraph/source/graph_support/compatibility.rst create mode 100644 docs/cugraph/source/graph_support/cugraph_service.rst create mode 100644 docs/cugraph/source/graph_support/cugraphops_support.rst create mode 100644 docs/cugraph/source/graph_support/datastores.rst create mode 100644 docs/cugraph/source/graph_support/feature_stores.md create mode 100644 docs/cugraph/source/graph_support/gnn_support.rst create mode 100644 docs/cugraph/source/graph_support/graph_algorithms.rst create mode 100644 docs/cugraph/source/graph_support/index.rst create mode 100644 docs/cugraph/source/graph_support/knowledge_stores.md create mode 100644 docs/cugraph/source/graph_support/pg_example.png create mode 100644 docs/cugraph/source/graph_support/property_graph.md create mode 100644 docs/cugraph/source/graph_support/wholegraph_support.rst create mode 100644 docs/cugraph/source/installation/getting_cugraph.md create mode 100644 docs/cugraph/source/installation/index.rst create mode 100644 docs/cugraph/source/installation/source_build.md rename docs/cugraph/source/{basics => references}/cugraph_ref.rst (100%) create mode 100644 docs/cugraph/source/references/datasets.rst create mode 100644 docs/cugraph/source/references/index.rst create mode 100644 docs/cugraph/source/references/licenses.rst create mode 100644 docs/cugraph/source/releases/index.rst create mode 100644 docs/cugraph/source/tutorials/community_resources.md rename docs/cugraph/source/{basics => tutorials}/cugraph_blogs.rst (100%) create mode 100644 docs/cugraph/source/tutorials/cugraph_notebooks.md create mode 100644 docs/cugraph/source/tutorials/how_to_guides.md create mode 100644 docs/cugraph/source/tutorials/index.rst diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a5d5a00ba..3c2f5fe2c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: pass_filenames: false additional_dependencies: [gitpython] - repo: https://github.com/rapidsai/dependency-file-generator - rev: v1.4.0 + rev: v1.5.1 hooks: - id: rapids-dependency-file-generator args: ["--clean"] diff --git a/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst new file mode 100644 index 000000000..4ffecd8d0 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst @@ -0,0 +1,15 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-dgl API Reference +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +cugraph-dgl + +.. currentmodule:: cugraph_dgl + +Methods +------- +.. autosummary:: + :toctree: ../api/cugraph-dgl/ + + convert.cugraph_storage_from_heterograph + cugraph_storage.CuGraphStorage diff --git a/docs/cugraph/source/api_docs/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst similarity index 89% rename from docs/cugraph/source/api_docs/cugraph_pyg.rst rename to docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst index 7e25b3547..2cd8969aa 100644 --- a/docs/cugraph/source/api_docs/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst @@ -7,7 +7,7 @@ cugraph-pyg .. currentmodule:: cugraph_pyg .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph-pyg/ cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler diff --git a/docs/cugraph/source/api_docs/centrality.rst b/docs/cugraph/source/api_docs/cugraph/centrality.rst similarity index 80% rename from docs/cugraph/source/api_docs/centrality.rst rename to docs/cugraph/source/api_docs/cugraph/centrality.rst index 9b634cb6d..c3b026597 100644 --- a/docs/cugraph/source/api_docs/centrality.rst +++ b/docs/cugraph/source/api_docs/cugraph/centrality.rst @@ -8,7 +8,7 @@ Centrality Betweenness Centrality ---------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.betweenness_centrality cugraph.edge_betweenness_centrality @@ -16,34 +16,34 @@ Betweenness Centrality Katz Centrality --------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.katz_centrality Katz Centrality (MG) -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.centrality.katz_centrality.katz_centrality Degree Centrality ----------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.degree_centrality Eigenvector Centrality ---------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.centrality.eigenvector_centrality Eigenvector Centrality (MG) --------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.centrality.eigenvector_centrality.eigenvector_centrality diff --git a/docs/cugraph/source/api_docs/community.rst b/docs/cugraph/source/api_docs/cugraph/community.rst similarity index 78% rename from docs/cugraph/source/api_docs/community.rst rename to docs/cugraph/source/api_docs/cugraph/community.rst index 94eb1a49c..acbaa086f 100644 --- a/docs/cugraph/source/api_docs/community.rst +++ b/docs/cugraph/source/api_docs/cugraph/community.rst @@ -8,7 +8,7 @@ Community EgoNet ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.batched_ego_graphs cugraph.ego_graph @@ -16,7 +16,7 @@ EgoNet Ensemble clustering for graphs (ECG) ------------------------------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.ecg @@ -24,7 +24,7 @@ Ensemble clustering for graphs (ECG) K-Truss ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.k_truss cugraph.ktruss_subgraph @@ -32,7 +32,7 @@ K-Truss Leiden ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.leiden @@ -40,7 +40,7 @@ Leiden Louvain ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.louvain @@ -48,14 +48,14 @@ Louvain Louvain (MG) ------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.community.louvain.louvain Spectral Clustering ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.analyzeClustering_edge_cut cugraph.analyzeClustering_modularity @@ -67,7 +67,7 @@ Spectral Clustering Subgraph Extraction ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.subgraph @@ -75,6 +75,6 @@ Subgraph Extraction Triangle Counting ----------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.triangle_count diff --git a/docs/cugraph/source/api_docs/components.rst b/docs/cugraph/source/api_docs/cugraph/components.rst similarity index 86% rename from docs/cugraph/source/api_docs/components.rst rename to docs/cugraph/source/api_docs/cugraph/components.rst index 8616c8742..5835972cd 100644 --- a/docs/cugraph/source/api_docs/components.rst +++ b/docs/cugraph/source/api_docs/cugraph/components.rst @@ -8,7 +8,7 @@ Components Connected Components -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.connected_components cugraph.strongly_connected_components @@ -18,7 +18,7 @@ Connected Components Connected Components (MG) ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.components.connectivity.weakly_connected_components diff --git a/docs/cugraph/source/api_docs/cores.rst b/docs/cugraph/source/api_docs/cugraph/cores.rst similarity index 73% rename from docs/cugraph/source/api_docs/cores.rst rename to docs/cugraph/source/api_docs/cugraph/cores.rst index 0e48c584b..9d274d1c4 100644 --- a/docs/cugraph/source/api_docs/cores.rst +++ b/docs/cugraph/source/api_docs/cugraph/cores.rst @@ -8,7 +8,7 @@ Cores Core Number ----------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.core_number @@ -16,6 +16,6 @@ Core Number K-Core ------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.k_core diff --git a/docs/cugraph/source/api_docs/cugraph_top.rst b/docs/cugraph/source/api_docs/cugraph/cugraph_top.rst similarity index 100% rename from docs/cugraph/source/api_docs/cugraph_top.rst rename to docs/cugraph/source/api_docs/cugraph/cugraph_top.rst diff --git a/docs/cugraph/source/api_docs/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst similarity index 100% rename from docs/cugraph/source/api_docs/dask-cugraph.rst rename to docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/generator.rst b/docs/cugraph/source/api_docs/cugraph/generator.rst similarity index 80% rename from docs/cugraph/source/api_docs/generator.rst rename to docs/cugraph/source/api_docs/cugraph/generator.rst index e89fe25e8..9b4ebbcf7 100644 --- a/docs/cugraph/source/api_docs/generator.rst +++ b/docs/cugraph/source/api_docs/cugraph/generator.rst @@ -8,7 +8,7 @@ Generator RMAT ---- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.generators.rmat diff --git a/docs/cugraph/source/api_docs/graph_implementation.rst b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst similarity index 94% rename from docs/cugraph/source/api_docs/graph_implementation.rst rename to docs/cugraph/source/api_docs/cugraph/graph_implementation.rst index f6dc38a27..91c16c242 100644 --- a/docs/cugraph/source/api_docs/graph_implementation.rst +++ b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst @@ -7,7 +7,7 @@ Graph Implementation Graph Implementation -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ view_edge_list delete_edge_list diff --git a/docs/cugraph/source/api_docs/helper_functions.rst b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst similarity index 95% rename from docs/cugraph/source/api_docs/helper_functions.rst rename to docs/cugraph/source/api_docs/cugraph/helper_functions.rst index 08585d264..ec3248bfa 100644 --- a/docs/cugraph/source/api_docs/helper_functions.rst +++ b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst @@ -8,7 +8,7 @@ DASK MG Helper functions Methods ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.comms.comms.initialize cugraph.dask.comms.comms.destroy diff --git a/docs/cugraph/source/api_docs/layout.rst b/docs/cugraph/source/api_docs/cugraph/layout.rst similarity index 80% rename from docs/cugraph/source/api_docs/layout.rst rename to docs/cugraph/source/api_docs/cugraph/layout.rst index b3943e4d3..1c097346b 100644 --- a/docs/cugraph/source/api_docs/layout.rst +++ b/docs/cugraph/source/api_docs/cugraph/layout.rst @@ -8,7 +8,7 @@ Layout Force Atlas 2 ------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.force_atlas2 diff --git a/docs/cugraph/source/api_docs/linear_assignment.rst b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst similarity index 85% rename from docs/cugraph/source/api_docs/linear_assignment.rst rename to docs/cugraph/source/api_docs/cugraph/linear_assignment.rst index 383bb4d43..dfdf6da96 100644 --- a/docs/cugraph/source/api_docs/linear_assignment.rst +++ b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst @@ -8,7 +8,7 @@ Linear Assignment Hungarian --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.hungarian cugraph.dense_hungarian diff --git a/docs/cugraph/source/api_docs/link_analysis.rst b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst similarity index 75% rename from docs/cugraph/source/api_docs/link_analysis.rst rename to docs/cugraph/source/api_docs/cugraph/link_analysis.rst index b84dd2ccb..5f977b477 100644 --- a/docs/cugraph/source/api_docs/link_analysis.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst @@ -8,14 +8,14 @@ Link Analysis HITS ---- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.hits HITS (MG) --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.link_analysis.hits.hits @@ -23,14 +23,14 @@ HITS (MG) Pagerank -------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.pagerank Pagerank (MG) ------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.link_analysis.pagerank.pagerank diff --git a/docs/cugraph/source/api_docs/link_prediction.rst b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst similarity index 84% rename from docs/cugraph/source/api_docs/link_prediction.rst rename to docs/cugraph/source/api_docs/cugraph/link_prediction.rst index 7c7b34f2f..b2134fba9 100644 --- a/docs/cugraph/source/api_docs/link_prediction.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst @@ -8,7 +8,7 @@ Link Prediction Jaccard Coefficient ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.jaccard cugraph.jaccard_coefficient @@ -18,7 +18,7 @@ Jaccard Coefficient Overlap Coefficient ------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.overlap cugraph.overlap_coefficient @@ -28,7 +28,7 @@ Overlap Coefficient Sorensen Coefficient -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.sorensen cugraph.sorensen_coefficient diff --git a/docs/cugraph/source/api_docs/property_graph.rst b/docs/cugraph/source/api_docs/cugraph/property_graph.rst similarity index 96% rename from docs/cugraph/source/api_docs/property_graph.rst rename to docs/cugraph/source/api_docs/cugraph/property_graph.rst index f3653c085..672aa7dae 100644 --- a/docs/cugraph/source/api_docs/property_graph.rst +++ b/docs/cugraph/source/api_docs/cugraph/property_graph.rst @@ -7,7 +7,7 @@ Property Graph Property Graph ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ PropertySelection PropertyGraph diff --git a/docs/cugraph/source/api_docs/sampling.rst b/docs/cugraph/source/api_docs/cugraph/sampling.rst similarity index 80% rename from docs/cugraph/source/api_docs/sampling.rst rename to docs/cugraph/source/api_docs/cugraph/sampling.rst index bab8aee6b..52004a5b1 100644 --- a/docs/cugraph/source/api_docs/sampling.rst +++ b/docs/cugraph/source/api_docs/cugraph/sampling.rst @@ -8,7 +8,7 @@ Sampling Random Walks ------------ .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.random_walks cugraph.ego_graph @@ -17,6 +17,6 @@ Random Walks Node2Vec --------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.node2vec diff --git a/docs/cugraph/source/api_docs/cugraph/structure.rst b/docs/cugraph/source/api_docs/cugraph/structure.rst new file mode 100644 index 000000000..5114cb57b --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph/structure.rst @@ -0,0 +1,104 @@ +============= +Graph Classes +============= +.. currentmodule:: cugraph + +Constructors +------------ +.. autosummary:: + :toctree: ../api/cugraph/ + + Graph + MultiGraph + BiPartiteGraph + + + +Adding Data +----------- +.. autosummary:: + :toctree: ../api/cugraph/ + + + Graph.from_cudf_adjlist + Graph.from_cudf_edgelist + Graph.from_dask_cudf_edgelist + Graph.from_pandas_adjacency + Graph.from_pandas_edgelist + Graph.from_numpy_array + Graph.from_numpy_matrix + Graph.add_internal_vertex_id + Graph.add_nodes_from + Graph.clear + Graph.unrenumber + +Checks +------ +.. autosummary:: + :toctree: ../api/cugraph/ + + Graph.has_isolated_vertices + Graph.is_bipartite + Graph.is_directed + Graph.is_multigraph + Graph.is_multipartite + Graph.is_renumbered + Graph.is_weighted + Graph.lookup_internal_vertex_id + Graph.to_directed + Graph.to_undirected + + +Symmetrize +---------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.symmetrize + cugraph.symmetrize_ddf + cugraph.symmetrize_df + + +Conversion from Other Formats +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.from_adjlist + cugraph.from_cudf_edgelist + cugraph.from_edgelist + cugraph.from_numpy_array + cugraph.from_numpy_matrix + cugraph.from_pandas_adjacency + cugraph.from_pandas_edgelist + cugraph.to_numpy_array + cugraph.to_numpy_matrix + cugraph.to_pandas_adjacency + cugraph.to_pandas_edgelist + +NumberMap +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.structure.NumberMap + cugraph.structure.NumberMap.MultiGPU + cugraph.structure.NumberMap.SingleGPU + cugraph.structure.NumberMap.from_internal_vertex_id + cugraph.structure.NumberMap.to_internal_vertex_id + cugraph.structure.NumberMap.add_internal_vertex_id + cugraph.structure.NumberMap.compute_vals + cugraph.structure.NumberMap.compute_vals_types + cugraph.structure.NumberMap.generate_unused_column_name + cugraph.structure.NumberMap.renumber + cugraph.structure.NumberMap.renumber_and_segment + cugraph.structure.NumberMap.set_renumbered_col_names + cugraph.structure.NumberMap.unrenumber + cugraph.structure.NumberMap.vertex_column_size + +Other +----------------------------- +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.hypergraph diff --git a/docs/cugraph/source/api_docs/traversal.rst b/docs/cugraph/source/api_docs/cugraph/traversal.rst similarity index 82% rename from docs/cugraph/source/api_docs/traversal.rst rename to docs/cugraph/source/api_docs/cugraph/traversal.rst index 675bf89f3..c8fcc6b72 100644 --- a/docs/cugraph/source/api_docs/traversal.rst +++ b/docs/cugraph/source/api_docs/cugraph/traversal.rst @@ -8,7 +8,7 @@ Traversal Breadth-first-search -------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.bfs cugraph.bfs_edges @@ -16,14 +16,14 @@ Breadth-first-search Breadth-first-search (MG) ------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.traversal.bfs.bfs Single-source-shortest-path --------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.filter_unreachable cugraph.shortest_path @@ -33,6 +33,6 @@ Single-source-shortest-path Single-source-shortest-path (MG) -------------------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.dask.traversal.sssp.sssp diff --git a/docs/cugraph/source/api_docs/tree.rst b/docs/cugraph/source/api_docs/cugraph/tree.rst similarity index 83% rename from docs/cugraph/source/api_docs/tree.rst rename to docs/cugraph/source/api_docs/cugraph/tree.rst index 7952c4fa3..38bfbad7d 100644 --- a/docs/cugraph/source/api_docs/tree.rst +++ b/docs/cugraph/source/api_docs/cugraph/tree.rst @@ -8,7 +8,7 @@ Tree Minimum Spanning Tree --------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.tree.minimum_spanning_tree.minimum_spanning_tree @@ -16,7 +16,7 @@ Minimum Spanning Tree Maximum Spanning Tree --------------------- .. autosummary:: - :toctree: api/ + :toctree: ../api/cugraph/ cugraph.tree.minimum_spanning_tree.maximum_spanning_tree diff --git a/docs/cugraph/source/api_docs/c_and_cpp.rst b/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst similarity index 100% rename from docs/cugraph/source/api_docs/c_and_cpp.rst rename to docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst diff --git a/docs/cugraph/source/api_docs/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph_dgl.rst deleted file mode 100644 index 9a8b3ba6c..000000000 --- a/docs/cugraph/source/api_docs/cugraph_dgl.rst +++ /dev/null @@ -1,15 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-dgl API Refrerence -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -cugraph-dgl - -.. currentmodule:: cugraph_dgl - -Methods -------- -.. autosummary:: - :toctree: api/ - - cugraph_dgl.cugraph_storage_from_heterograph - cugraph_dgl.cugraph_storage.CuGraphStorage diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 0e7598af0..f6307d5ac 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -8,9 +8,9 @@ This page provides a list of all publicly accessible modules, methods and classe :maxdepth: 2 :caption: Python API Documentation - cugraph_top.rst - pylibcugraph.rst - cugraph_dgl.rst - cugraph_pyg.rst - cugraph_service_client.rst - cugraph_service_server.rst + cugraph/cugraph_top.rst + plc/pylibcugraph.rst + cugraph-dgl/cugraph_dgl.rst + cugraph-pyg/cugraph_pyg.rst + service/cugraph_service_client.rst + service/cugraph_service_server.rst diff --git a/docs/cugraph/source/api_docs/pylibcugraph.rst b/docs/cugraph/source/api_docs/plc/pylibcugraph.rst similarity index 94% rename from docs/cugraph/source/api_docs/pylibcugraph.rst rename to docs/cugraph/source/api_docs/plc/pylibcugraph.rst index 7b63cd7dc..7ebdd67e9 100644 --- a/docs/cugraph/source/api_docs/pylibcugraph.rst +++ b/docs/cugraph/source/api_docs/plc/pylibcugraph.rst @@ -9,7 +9,7 @@ pylibcugraph Methods ------- .. autosummary:: - :toctree: api/ + :toctree: ../api/plc/ pylibcugraph.eigenvector_centrality pylibcugraph.katz_centrality diff --git a/docs/cugraph/source/api_docs/cugraph_service_client.rst b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst similarity index 95% rename from docs/cugraph/source/api_docs/cugraph_service_client.rst rename to docs/cugraph/source/api_docs/service/cugraph_service_client.rst index 1ea727bd3..383b31d26 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_client.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst @@ -7,7 +7,7 @@ cugraph-service .. currentmodule:: cugraph-service .. autosummary:: - :toctree: api/ + :toctree: ../api/service/ cugraph_service_client.client.RunAsyncioThread cugraph_service_client.client.run_async @@ -18,6 +18,3 @@ cugraph-service cugraph_service_client.types.UnionWrapper cugraph_service_client.types.ValueWrapper cugraph_service_client.types.GraphVertexEdgeIDWrapper - - - diff --git a/docs/cugraph/source/api_docs/cugraph_service_server.rst b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst similarity index 92% rename from docs/cugraph/source/api_docs/cugraph_service_server.rst rename to docs/cugraph/source/api_docs/service/cugraph_service_server.rst index 5f4c6aa5e..a7e8b5475 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_server.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst @@ -7,7 +7,7 @@ cugraph-service .. currentmodule:: cugraph-service .. autosummary:: - :toctree: api/ + :toctree: ../api/service/ cugraph_service_server.cugraph_handler.call_algo cugraph_service_server.cugraph_handler.ExtensionServerFacade diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst index ab097156c..0d6e28792 100644 --- a/docs/cugraph/source/api_docs/structure.rst +++ b/docs/cugraph/source/api_docs/structure.rst @@ -102,4 +102,3 @@ Other :toctree: api/ cugraph.hypergraph - cugraph.structure.shuffle diff --git a/docs/cugraph/source/basics/index.rst b/docs/cugraph/source/basics/index.rst index 46331fc6c..1875ac22b 100644 --- a/docs/cugraph/source/basics/index.rst +++ b/docs/cugraph/source/basics/index.rst @@ -6,4 +6,7 @@ Basics .. toctree:: :maxdepth: 2 + cugraph_intro cugraph_toc.md + nx_transition + cugraph_cascading diff --git a/docs/cugraph/source/dev_resources/API.rst b/docs/cugraph/source/dev_resources/API.rst new file mode 100644 index 000000000..409e307fd --- /dev/null +++ b/docs/cugraph/source/dev_resources/API.rst @@ -0,0 +1,5 @@ +=== +API +=== + +https://docs.rapids.ai/api/cugraph/nightly/api_docs/index.html \ No newline at end of file diff --git a/docs/cugraph/source/dev_resources/index.rst b/docs/cugraph/source/dev_resources/index.rst new file mode 100644 index 000000000..8568772b3 --- /dev/null +++ b/docs/cugraph/source/dev_resources/index.rst @@ -0,0 +1,10 @@ +=================== +Developer Resources +=================== + + +.. toctree:: + :maxdepth: 3 + + https://docs.rapids.ai/maintainers + API.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md new file mode 100644 index 000000000..4db2a4d77 --- /dev/null +++ b/docs/cugraph/source/graph_support/DGL_support.md @@ -0,0 +1,55 @@ +# 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 +``` +mamba env create -n cugraph_dgl_dev --file conda/cugraph_dgl_dev_11.6.yml +``` + +### 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( +- dgl_g, ++ cugraph_g, +train_idx, +sampler, +device=device, +batch_size=1024, +shuffle=True, +drop_last=False, +num_workers=0) +``` + diff --git a/docs/cugraph/source/graph_support/PyG_support.md b/docs/cugraph/source/graph_support/PyG_support.md new file mode 100644 index 000000000..42d4d1c55 --- /dev/null +++ b/docs/cugraph/source/graph_support/PyG_support.md @@ -0,0 +1,3 @@ +# 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. \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md new file mode 100644 index 000000000..fa2e7cc95 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -0,0 +1,85 @@ +# 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 | Algorithm | Scale | Notes | +| ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | +| Centrality | | | | +| | Katz | __Multi-GPU__ | | +| | Betweenness Centrality | Single-GPU | MG planned for 23.02 | +| | Edge Betweenness Centrality | Single-GPU | MG planned for 23.02 | +| | Eigenvector Centrality | __Multi-GPU__ | | +| | Degree Centrality | __Multi-GPU__ | Python only | +| Community | | | | +| | Leiden | Single-GPU | MG planned for 23.02 | +| | Louvain | __Multi-GPU__ | | +| | Ensemble Clustering for Graphs | Single-GPU | | +| | Spectral-Clustering - Balanced Cut | Single-GPU | | +| | Spectral-Clustering - Modularity | Single-GPU | | +| | Subgraph Extraction | Single-GPU | | +| | Triangle Counting | __Multi-GPU__ | | +| | K-Truss | Single-GPU | | +| Components | | | | +| | Weakly Connected Components | __Multi-GPU__ | | +| | Strongly Connected Components | Single-GPU | | +| Core | | | | +| | K-Core | **Multi-GPU** | | +| | Core Number | **Multi-GPU** | | +| _Flow_ | | | | +| | _MaxFlow_ | --- | | +| _Influence_ | | | | +| | _Influence Maximization_ | --- | | +| Layout | | | | +| | Force Atlas 2 | Single-GPU | | +| Linear Assignment | | | | +| | Hungarian | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | +| Link Analysis | | | | +| | Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | +| | Personal Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | +| | HITS | __Multi-GPU__ | | +| Link Prediction | | | | +| | Jaccard Similarity | **Multi-GPU** | MG as of 22.12
Directed graph only | +| | Weighted Jaccard Similarity | Single-GPU | | +| | Overlap Similarity | **Multi-GPU** | MG as of 22.12 | +| | Sorensen Coefficient | **Multi-GPU** | MG as of 22.12 | +| | _Local Clustering Coefficient_ | --- | | +| Sampling | | | | +| | Uniform Random Walks (RW) | **Multi-GPU** | | +| | *Biased Random Walks (RW)* | --- | | +| | Egonet | **Multi-GPU** | | +| | Node2Vec | Single-GPU | MG planned for 23.02 | +| | Uniform Neighborhood sampling | __Multi-GPU__ | | +| Traversal | | | | +| | Breadth First Search (BFS) | __Multi-GPU__ | with cutoff support``[C++ README](cpp/src/traversal/README.md#BFS) | +| | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](cpp/src/traversal/README.md#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_ | --- | | +| | | | | diff --git a/docs/cugraph/source/graph_support/compatibility.rst b/docs/cugraph/source/graph_support/compatibility.rst new file mode 100644 index 000000000..be0cc21c2 --- /dev/null +++ b/docs/cugraph/source/graph_support/compatibility.rst @@ -0,0 +1,8 @@ +Compatibility +============= + + +.. toctree:: + :maxdepth: 3 + +Compatibility document coming soon \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/cugraph_service.rst b/docs/cugraph/source/graph_support/cugraph_service.rst new file mode 100644 index 000000000..620b22d1e --- /dev/null +++ b/docs/cugraph/source/graph_support/cugraph_service.rst @@ -0,0 +1,9 @@ +=============== +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) \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/cugraphops_support.rst b/docs/cugraph/source/graph_support/cugraphops_support.rst new file mode 100644 index 000000000..08ae3b218 --- /dev/null +++ b/docs/cugraph/source/graph_support/cugraphops_support.rst @@ -0,0 +1,10 @@ +================== +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-ops/blob/branch-23.04/README.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/datastores.rst b/docs/cugraph/source/graph_support/datastores.rst new file mode 100644 index 000000000..82db2c0e1 --- /dev/null +++ b/docs/cugraph/source/graph_support/datastores.rst @@ -0,0 +1,11 @@ +=========== +Data Stores +=========== + + +.. toctree:: + :maxdepth: 3 + + property_graph.md + feature_stores.md + knowledge_stores.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/feature_stores.md b/docs/cugraph/source/graph_support/feature_stores.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/graph_support/gnn_support.rst b/docs/cugraph/source/graph_support/gnn_support.rst new file mode 100644 index 000000000..2acb2254a --- /dev/null +++ b/docs/cugraph/source/graph_support/gnn_support.rst @@ -0,0 +1,12 @@ +============================ +Graph Neural Network Support +============================ + + +.. toctree:: + :maxdepth: 3 + + PyG_support.md + DGL_support.md + cugraphops_support.rst + wholegraph_support.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/graph_algorithms.rst b/docs/cugraph/source/graph_support/graph_algorithms.rst new file mode 100644 index 000000000..885be03bf --- /dev/null +++ b/docs/cugraph/source/graph_support/graph_algorithms.rst @@ -0,0 +1,9 @@ +========== +Algorithms +========== + + +.. toctree:: + :maxdepth: 3 + + algorithms.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/index.rst b/docs/cugraph/source/graph_support/index.rst new file mode 100644 index 000000000..9526fae7e --- /dev/null +++ b/docs/cugraph/source/graph_support/index.rst @@ -0,0 +1,13 @@ +============= +Graph Support +============= + + +.. toctree:: + :maxdepth: 3 + + graph_algorithms.rst + compatibility.rst + gnn_support.rst + datastores.rst + cugraph_service.rst \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/knowledge_stores.md b/docs/cugraph/source/graph_support/knowledge_stores.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/graph_support/pg_example.png b/docs/cugraph/source/graph_support/pg_example.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce8a0f20549deaa34b968787f0b711ed8bc71fb GIT binary patch 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? literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/cugraph/source/graph_support/property_graph.md new file mode 100644 index 000000000..4610cb7c3 --- /dev/null +++ b/docs/cugraph/source/graph_support/property_graph.md @@ -0,0 +1,54 @@ +

+
+ cuGraph +

+

+
+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. + +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.experimental.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)) +``` \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/wholegraph_support.rst b/docs/cugraph/source/graph_support/wholegraph_support.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index f1012c0fb..12bc74aea 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -1,53 +1,25 @@ -Welcome to cugraph's documentation! +Welcome to cuGraph's documentation! =================================== 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 GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. -.. image:: images/Stack2.png - :width: 600 - :alt: Alternative text - -Basics -###### -.. toctree:: - :maxdepth: 2 - :caption: Basic cuGraph Information: - -General CuGraph Information - - `CuGraph Intro <./basics/cugraph_intro.md>`_ - - `Blogs and Presentation <./basics/cugraph_blogs.rst>`_ - - `How-to Guides <./basics/coming_soon.md>`_ - - `Performance <./basics/coming_soon.md>`_ - - `References <./basics/cugraph_ref.rst>`_ - -CuGraph Development and Contributing - - `Getting cuGraph Packages <./basics/coming_soon.md>`_ - - `Contributing to cuGraph <./basics/coming_soon.md>`_ - - `CuGraph Development Guide <./basics/coming_soon.md>`_ - -Algorithms - - `Current list of algorithms <./basics/coming_soon.md>`_ - - - -API -### -.. toctree:: - :maxdepth: 2 - - api_docs/index.rst - - .. toctree:: :maxdepth: 2 + :caption: Contents: - api_docs/c_and_cpp.rst + basics/index + installation/index + tutorials/index + graph_support/index + references/index + dev_resources/index + releases/index + api_docs/index Indices and tables ================== * :ref:`genindex` -* :ref:`modindex` * :ref:`search` diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md new file mode 100644 index 000000000..005938f47 --- /dev/null +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -0,0 +1,55 @@ + +# Getting cuGraph Packages + +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) + +Or checkout the [RAPIDS install selector](https://rapids.ai/start.html) for a pick list of install options. + +
+ +## Docker +The RAPIDS Docker containers contain all RAPIDS packages, including all from cuGraph, as well as all required supporting packages. To download a container, please see the [Docker Repository](https://hub.docker.com/r/rapidsai/rapidsai/), choosing a tag based on the NVIDIA CUDA version you’re running. This 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 [Miniconda](https://conda.io/miniconda.html) or get the full installation with [Anaconda](https://www.anaconda.com/download). + +cuGraph Conda packages + * cugraph - this will also import: + * pylibcugraph + * libcugraph + * cugraph-service-client + * cugraph-service-server + * cugraph-dgl + * cugraph-pyg + +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 numba -c conda-forge -c nvidia cugraph cudatoolkit=11.8 +``` + +Note: This conda installation only applies to Linux and Python versions 3.8/3.10. + +
+ +## PIP +cuGraph, and all of RAPIDS, is available via pip. + +``` +pip install cugraph-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +``` + +pip packages for other packages are being worked and should be available in early 2023 + +
+ diff --git a/docs/cugraph/source/installation/index.rst b/docs/cugraph/source/installation/index.rst new file mode 100644 index 000000000..27858b770 --- /dev/null +++ b/docs/cugraph/source/installation/index.rst @@ -0,0 +1,10 @@ +============ +Installation +============ + + +.. toctree:: + :maxdepth: 3 + + getting_cugraph + source_build diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md new file mode 100644 index 000000000..cd9297abc --- /dev/null +++ b/docs/cugraph/source/installation/source_build.md @@ -0,0 +1,271 @@ +# Building from Source + +The following instructions are for users wishing to build cuGraph from source code. These instructions are tested on supported distributions of Linux, CUDA, and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) for list of supported environments. Other operating systems _might be_ compatible, but are not currently tested. + +The cuGraph package include both a C/C++ CUDA portion and a python portion. Both libraries need to be installed in order for cuGraph to operate correctly. + +## Prerequisites + +__Compiler__: +* `gcc` version 9.3+ +* `nvcc` version 11.0+ +* `cmake` version 3.20.1+ + +__CUDA:__ +* CUDA 11.0+ +* NVIDIA driver 450.80.02+ +* Pascal architecture or better + +You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). + + +## Building cuGraph +To install cuGraph from source, ensure the dependencies are met. + + +### Clone Repo and Configure Conda Environment +__GIT clone a version of the repository__ + + ```bash + # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME + export CUGRAPH_HOME=$(pwd)/cugraph + + # Download the cuGraph repo - if you have a folked version, use that path here instead + git clone https://github.com/rapidsai/cugraph.git $CUGRAPH_HOME + + cd $CUGRAPH_HOME + ``` + +__Create the conda development environment__ + +```bash +# create the conda environment (assuming in base `cugraph` directory) + +# for CUDA 11.5 +conda env create --name cugraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml + +# activate the environment +conda activate cugraph_dev + +# to deactivate an environment +conda deactivate +``` + + - The environment can be updated as development includes/changes the dependencies. To do so, run: + + +```bash + +# Where XXX is the CUDA 11 version +conda env update --name cugraph_dev --file conda/environments/cugraph_dev_cuda11.XXX.yml + +conda activate cugraph_dev +``` + + +### Build and Install Using the `build.sh` Script +Using the `build.sh` script make compiling and installing cuGraph a breeze. To build and install, simply do: + +```bash +$ cd $CUGRAPH_HOME +$ ./build.sh clean +$ ./build.sh libcugraph +$ ./build.sh cugraph +``` + +There are several other options available on the build script for advanced users. +`build.sh` options: +```bash +build.sh [ ...] [ ...] + where is: + clean - remove all existing build artifacts and configuration (start over) + uninstall - uninstall libcugraph and cugraph from a prior build/install (see also -n) + libcugraph - build libcugraph.so and SG test binaries + libcugraph_etl - build libcugraph_etl.so and SG test binaries + pylibcugraph - build the pylibcugraph Python package + cugraph - build the cugraph Python package + cugraph-service - build the cugraph-service_client and cugraph-service_server Python package + cpp-mgtests - build libcugraph and libcugraph_etl MG tests. Builds MPI communicator, adding MPI as a dependency. + cugraph-dgl - build the cugraph-dgl extensions for DGL + cugraph-pyg - build the cugraph-dgl extensions for PyG + docs - build the docs + and is: + -v - verbose build mode + -g - build for debug + -n - do not install after a successful build + --pydevelop - use setup.py develop instead of install + --allgpuarch - build for all supported GPU architectures + --skip_cpp_tests - do not build the SG test binaries as part of the libcugraph and libcugraph_etl targets + --without_cugraphops - do not build algos that require cugraph-ops + --cmake_default_generator - use the default cmake generator instead of ninja + --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) + -h - print this text + + default action (no args) is to build and install 'libcugraph' then 'libcugraph_etl' then 'pylibcugraph' then 'cugraph' then 'cugraph-service' targets + +examples: +$ ./build.sh clean # remove prior build artifacts (start over) +$ ./build.sh libcugraph -v # compile and install libcugraph with verbose output +$ ./build.sh libcugraph -g # compile and install libcugraph for debug +$ ./build.sh libcugraph -n # compile libcugraph but do not install + +# make parallelism options can also be defined: Example build jobs using 4 threads (make -j4) +$ PARALLEL_LEVEL=4 ./build.sh libcugraph + +Note that the libraries will be installed to the location set in `$PREFIX` if set (i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. +``` + + +## Building each section independently +#### Build and Install the C++/CUDA `libcugraph` Library +CMake depends on the `nvcc` executable being on your path or defined in `$CUDACXX`. + +This project uses cmake for building the C/C++ library. To configure cmake, run: + + ```bash + # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME + export CUGRAPH_HOME=$(pwd)/cugraph + + cd $CUGRAPH_HOME + cd cpp # enter cpp directory + mkdir build # create build directory + cd build # enter the build directory + cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX + + # now build the code + make -j # "-j" starts multiple threads + make install # install the libraries + ``` +The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/cugraph` respectively. + +#### 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. + +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. + +### Building and installing the Python package + +2) Install the Python packages to your Python path: + +```bash +cd $CUGRAPH_HOME +cd python +cd pylibcugraph +python setup.py build_ext --inplace +python setup.py install # install pylibcugraph +cd ../cugraph +python setup.py build_ext --inplace +python setup.py install # install cugraph python bindings + +``` + + + +## 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.8/3.10. + +### (OPTIONAL) Set environment variable on activation + +It is possible to configure the conda environment to set environmental 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/cugraph/source/basics/cugraph_ref.rst b/docs/cugraph/source/references/cugraph_ref.rst similarity index 100% rename from docs/cugraph/source/basics/cugraph_ref.rst rename to docs/cugraph/source/references/cugraph_ref.rst diff --git a/docs/cugraph/source/references/datasets.rst b/docs/cugraph/source/references/datasets.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/references/index.rst b/docs/cugraph/source/references/index.rst new file mode 100644 index 000000000..e70df627f --- /dev/null +++ b/docs/cugraph/source/references/index.rst @@ -0,0 +1,9 @@ +========== +References +========== + + +.. toctree:: + :maxdepth: 3 + + cugraph_ref \ No newline at end of file diff --git a/docs/cugraph/source/references/licenses.rst b/docs/cugraph/source/references/licenses.rst new file mode 100644 index 000000000..e69de29bb diff --git a/docs/cugraph/source/releases/index.rst b/docs/cugraph/source/releases/index.rst new file mode 100644 index 000000000..7bd4f6dfa --- /dev/null +++ b/docs/cugraph/source/releases/index.rst @@ -0,0 +1,5 @@ +======== +Releases +======== + +https://github.com/rapidsai/cugraph/blob/main/CHANGELOG.md \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/community_resources.md b/docs/cugraph/source/tutorials/community_resources.md new file mode 100644 index 000000000..572f85a01 --- /dev/null +++ b/docs/cugraph/source/tutorials/community_resources.md @@ -0,0 +1,2 @@ +# Commmunity Resources +[Rapids Community Repository](https://github.com/rapidsai-community/notebooks-contrib) \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_blogs.rst b/docs/cugraph/source/tutorials/cugraph_blogs.rst similarity index 100% rename from docs/cugraph/source/basics/cugraph_blogs.rst rename to docs/cugraph/source/tutorials/cugraph_blogs.rst diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/cugraph/source/tutorials/cugraph_notebooks.md new file mode 100644 index 000000000..1624ef10a --- /dev/null +++ b/docs/cugraph/source/tutorials/cugraph_notebooks.md @@ -0,0 +1,77 @@ +# cuGraph Notebooks + +![GraphAnalyticsFigure](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](algorithms/centrality/Centrality.ipynb) | Compute and compare multiple (currently 5) centrality scores | +| | [Katz](algorithms/centrality/Katz.ipynb) | Compute the Katz centrality for every vertex | +| | [Betweenness](algorithms/centrality/Betweenness.ipynb) | Compute both Edge and Vertex Betweenness centrality | +| | [Degree](algorithms/centrality/Degree.ipynb) | Compute Degree Centraility for each vertex | +| | [Eigenvector](algorithms/centrality/Eigenvector.ipynb) | Compute Eigenvector for every vertex | +| Community | | | +| | [Louvain](algorithms/community/Louvain.ipynb) and Leiden | Identify clusters in a graph using both the Louvain and Leiden algorithms | +| | [ECG](algorithms/community/ECG.ipynb) | Identify clusters in a graph using the Ensemble Clustering for Graph | +| | [K-Truss](algorithms/community/ktruss.ipynb) | Extracts the K-Truss cluster | +| | [Spectral-Clustering](algorithms/community/Spectral-Clustering.ipynb) | Identify clusters in a graph using Spectral Clustering with both
- Balanced Cut
- Modularity Modularity | +| | [Subgraph Extraction](algorithms/community/Subgraph-Extraction.ipynb) | Compute a subgraph of the existing graph including only the specified vertices | +| | [Triangle Counting](algorithms/community/Triangle-Counting.ipynb) | Count the number of Triangle in a graph | +| Components | | | +| | [Connected Components](algorithms/components/ConnectedComponents.ipynb) | Find weakly and strongly connected components in a graph | +| Core | | | +| | [K-Core](algorithms/cores/kcore.ipynb) | Extracts the K-core cluster | +| | [Core Number](algorithms/cores/core-number.ipynb) | Computer the Core number for each vertex in a graph | +Layout | | | +| | [Force-Atlas2](algorithms/layout/Force-Atlas2.ipynb) |A large graph visualization achieved with cuGraph. | +| Link Analysis | | | +| | [Pagerank](algorithms/link_analysis/Pagerank.ipynb) | Compute the PageRank of every vertex in a graph | +| | [HITS](algorithms/link_analysis/HITS.ipynb) | Compute the HITS' Hub and Authority scores for every vertex in a graph | +| Link Prediction | | | +| | [Jaccard Similarity](algorithms/link_prediction/Jaccard-Similarity.ipynb) | Compute vertex similarity score using both:
- Jaccard Similarity
- Weighted Jaccard | +| | [Overlap Similarity](algorithms/link_prediction/Overlap-Similarity.ipynb) | Compute vertex similarity score using the Overlap Coefficient | +| Sampling | +| | [Random Walk](algorithms/sampling/RandomWalk.ipynb) | Compute Random Walk for a various number of seeds and path lengths | +| Traversal | | | +| | [BFS](algorithms/traversal/BFS.ipynb) | Compute the Breadth First Search path from a starting vertex to every other vertex in a graph | +| | [SSSP](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/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.8+ +* A system with an NVIDIA GPU: Pascal architecture or better +* CUDA 11.4+ +* NVIDIA driver 450.51+ + +#### Copyright + +Copyright (c) 2019-2022, 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. + + + + + +![RAPIDS](img/rapids_logo.png) \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/how_to_guides.md b/docs/cugraph/source/tutorials/how_to_guides.md new file mode 100644 index 000000000..42da6ed21 --- /dev/null +++ b/docs/cugraph/source/tutorials/how_to_guides.md @@ -0,0 +1,9 @@ +# How To Guides +- Basic use of cuGraph, on the page +- 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 \ No newline at end of file diff --git a/docs/cugraph/source/tutorials/index.rst b/docs/cugraph/source/tutorials/index.rst new file mode 100644 index 000000000..cce352509 --- /dev/null +++ b/docs/cugraph/source/tutorials/index.rst @@ -0,0 +1,11 @@ +========= +Tutorials +========= + + +.. toctree:: + :maxdepth: 3 + + how_to_guides.md + cugraph_blogs.rst + community_resources.md From 9dd74c9d47b651a962e101a41e2916979ef2e2e2 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Thu, 13 Apr 2023 12:03:28 -0400 Subject: [PATCH 242/384] Sphinx updates (#3468) Spinx is very picky and looks for indentations and black lines. Also during the build, if there is an error, Spinx just ignores the function that caused the error rather to terminating the build. Some docstrings also used reserved character {* and _} which are used for formating This PR: addresses Spinx Warnings and Errors addresses issues where rst is md is not added to the output any any other issues You will see a lot of additional blank lines added and some text clean-up for readability. Seems like the PR also picked up all the the 23.06 updates - so half the files are not really for this PR Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3468 --- .../source/api_docs/cugraph/centrality.rst | 38 +++++-- .../source/api_docs/cugraph/components.rst | 1 - .../api_docs/cugraph/helper_functions.rst | 1 - .../cugraph/{cugraph_top.rst => index.rst} | 0 .../source/api_docs/cugraph/layout.rst | 1 - .../api_docs/cugraph/linear_assignment.rst | 1 - .../source/api_docs/cugraph/link_analysis.rst | 1 - .../api_docs/cugraph/link_prediction.rst | 1 - .../source/api_docs/cugraph/structure.rst | 7 +- .../source/api_docs/cugraph/traversal.rst | 1 - docs/cugraph/source/api_docs/cugraph/tree.rst | 1 - docs/cugraph/source/api_docs/index.rst | 10 +- .../cugraph/source/api_docs/service/index.rst | 10 ++ docs/cugraph/source/api_docs/structure.rst | 104 ------------------ docs/cugraph/source/basics/index.rst | 1 - docs/cugraph/source/index.rst | 3 + .../source/tutorials/cugraph_notebooks.md | 4 +- 17 files changed, 51 insertions(+), 134 deletions(-) rename docs/cugraph/source/api_docs/cugraph/{cugraph_top.rst => index.rst} (100%) create mode 100644 docs/cugraph/source/api_docs/service/index.rst delete mode 100644 docs/cugraph/source/api_docs/structure.rst diff --git a/docs/cugraph/source/api_docs/cugraph/centrality.rst b/docs/cugraph/source/api_docs/cugraph/centrality.rst index c3b026597..344c95195 100644 --- a/docs/cugraph/source/api_docs/cugraph/centrality.rst +++ b/docs/cugraph/source/api_docs/cugraph/centrality.rst @@ -7,42 +7,64 @@ Centrality Betweenness Centrality ---------------------- +single-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ - cugraph.betweenness_centrality - cugraph.edge_betweenness_centrality + cugraph.centrality.betweenness_centrality + cugraph.centrality.edge_betweenness_centrality + +multi-GPU +^^^^^^^^^^ +.. autosummary:: + :toctree: ../api/cugraph/ + + cugraph.dask.centrality.betweenness_centrality + + Katz Centrality --------------- +single-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ - cugraph.katz_centrality + cugraph.centrality.katz_centrality -Katz Centrality (MG) --------------------- +multi-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ cugraph.dask.centrality.katz_centrality.katz_centrality + Degree Centrality ----------------- +single-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ - cugraph.degree_centrality + cugraph.centrality.degree_centrality + +multi-GPU +^^^^^^^^^^ + Eigenvector Centrality ---------------------- +single-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ cugraph.centrality.eigenvector_centrality -Eigenvector Centrality (MG) ---------------------------- +multi-GPU +^^^^^^^^^^ .. autosummary:: :toctree: ../api/cugraph/ diff --git a/docs/cugraph/source/api_docs/cugraph/components.rst b/docs/cugraph/source/api_docs/cugraph/components.rst index 5835972cd..560aa1f8c 100644 --- a/docs/cugraph/source/api_docs/cugraph/components.rst +++ b/docs/cugraph/source/api_docs/cugraph/components.rst @@ -4,7 +4,6 @@ Components .. currentmodule:: cugraph - Connected Components -------------------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst index ec3248bfa..02cb599ae 100644 --- a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst +++ b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst @@ -4,7 +4,6 @@ DASK MG Helper functions .. currentmodule:: cugraph - Methods ------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/cugraph_top.rst b/docs/cugraph/source/api_docs/cugraph/index.rst similarity index 100% rename from docs/cugraph/source/api_docs/cugraph/cugraph_top.rst rename to docs/cugraph/source/api_docs/cugraph/index.rst diff --git a/docs/cugraph/source/api_docs/cugraph/layout.rst b/docs/cugraph/source/api_docs/cugraph/layout.rst index 1c097346b..ed97caf54 100644 --- a/docs/cugraph/source/api_docs/cugraph/layout.rst +++ b/docs/cugraph/source/api_docs/cugraph/layout.rst @@ -4,7 +4,6 @@ Layout .. currentmodule:: cugraph - Force Atlas 2 ------------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst index dfdf6da96..e0b0b4d11 100644 --- a/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst +++ b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst @@ -4,7 +4,6 @@ Linear Assignment .. currentmodule:: cugraph - Hungarian --------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst index 5f977b477..48b5ec117 100644 --- a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst @@ -4,7 +4,6 @@ Link Analysis .. currentmodule:: cugraph - HITS ---- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst index b2134fba9..f05dce6f7 100644 --- a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst @@ -4,7 +4,6 @@ Link Prediction .. currentmodule:: cugraph - Jaccard Coefficient ------------------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/structure.rst b/docs/cugraph/source/api_docs/cugraph/structure.rst index 5114cb57b..6369e1bb3 100644 --- a/docs/cugraph/source/api_docs/cugraph/structure.rst +++ b/docs/cugraph/source/api_docs/cugraph/structure.rst @@ -10,8 +10,6 @@ Constructors Graph MultiGraph - BiPartiteGraph - Adding Data @@ -19,7 +17,6 @@ Adding Data .. autosummary:: :toctree: ../api/cugraph/ - Graph.from_cudf_adjlist Graph.from_cudf_edgelist Graph.from_dask_cudf_edgelist @@ -35,7 +32,7 @@ Adding Data Checks ------ .. autosummary:: - :toctree: ../api/cugraph/ + :toctree: ../api/cugraph/ Graph.has_isolated_vertices Graph.is_bipartite @@ -82,8 +79,6 @@ NumberMap :toctree: ../api/cugraph/ cugraph.structure.NumberMap - cugraph.structure.NumberMap.MultiGPU - cugraph.structure.NumberMap.SingleGPU cugraph.structure.NumberMap.from_internal_vertex_id cugraph.structure.NumberMap.to_internal_vertex_id cugraph.structure.NumberMap.add_internal_vertex_id diff --git a/docs/cugraph/source/api_docs/cugraph/traversal.rst b/docs/cugraph/source/api_docs/cugraph/traversal.rst index c8fcc6b72..31296f3b8 100644 --- a/docs/cugraph/source/api_docs/cugraph/traversal.rst +++ b/docs/cugraph/source/api_docs/cugraph/traversal.rst @@ -4,7 +4,6 @@ Traversal .. currentmodule:: cugraph - Breadth-first-search -------------------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/cugraph/tree.rst b/docs/cugraph/source/api_docs/cugraph/tree.rst index 38bfbad7d..5ba2242eb 100644 --- a/docs/cugraph/source/api_docs/cugraph/tree.rst +++ b/docs/cugraph/source/api_docs/cugraph/tree.rst @@ -4,7 +4,6 @@ Tree .. currentmodule:: cugraph - Minimum Spanning Tree --------------------- .. autosummary:: diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index f6307d5ac..229bea451 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -1,16 +1,16 @@ Python API reference ==================== -This page provides a list of all publicly accessible modules, methods and classes through -``cugraph.*`` namespace. +This page provides a list of all publicly accessible Python modules, +methods and classes through ``cugraph.*`` namespace. .. toctree:: :maxdepth: 2 :caption: Python API Documentation - cugraph/cugraph_top.rst + cugraph/index.rst plc/pylibcugraph.rst cugraph-dgl/cugraph_dgl.rst cugraph-pyg/cugraph_pyg.rst - service/cugraph_service_client.rst - service/cugraph_service_server.rst + service/index.rst + diff --git a/docs/cugraph/source/api_docs/service/index.rst b/docs/cugraph/source/api_docs/service/index.rst new file mode 100644 index 000000000..a58cf2074 --- /dev/null +++ b/docs/cugraph/source/api_docs/service/index.rst @@ -0,0 +1,10 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cugraph-service API Reference +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. toctree:: + :maxdepth: 2 + :caption: cugraph-service API Documentation + + cugraph_service_client + cugraph_service_server \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/structure.rst b/docs/cugraph/source/api_docs/structure.rst deleted file mode 100644 index 0d6e28792..000000000 --- a/docs/cugraph/source/api_docs/structure.rst +++ /dev/null @@ -1,104 +0,0 @@ -============= -Graph Classes -============= -.. currentmodule:: cugraph - -Constructors ------------- -.. autosummary:: - :toctree: api/ - - Graph - MultiGraph - BiPartiteGraph - - - -Adding Data ------------ -.. autosummary:: - :toctree: api/ - - - Graph.from_cudf_adjlist - Graph.from_cudf_edgelist - Graph.from_dask_cudf_edgelist - Graph.from_pandas_adjacency - Graph.from_pandas_edgelist - Graph.from_numpy_array - Graph.from_numpy_matrix - Graph.add_internal_vertex_id - Graph.add_nodes_from - Graph.clear - Graph.unrenumber - -Checks ------- -.. autosummary:: - :toctree: api/ - - Graph.has_isolated_vertices - Graph.is_bipartite - Graph.is_directed - Graph.is_multigraph - Graph.is_multipartite - Graph.is_renumbered - Graph.is_weighted - Graph.lookup_internal_vertex_id - Graph.to_directed - Graph.to_undirected - - -Symmetrize ----------- -.. autosummary:: - :toctree: api/ - - cugraph.symmetrize - cugraph.symmetrize_ddf - cugraph.symmetrize_df - - -Conversion from Other Formats ------------------------------ -.. autosummary:: - :toctree: api/ - - cugraph.from_adjlist - cugraph.from_cudf_edgelist - cugraph.from_edgelist - cugraph.from_numpy_array - cugraph.from_numpy_matrix - cugraph.from_pandas_adjacency - cugraph.from_pandas_edgelist - cugraph.to_numpy_array - cugraph.to_numpy_matrix - cugraph.to_pandas_adjacency - cugraph.to_pandas_edgelist - -NumberMap ------------------------------ -.. autosummary:: - :toctree: api/ - - cugraph.structure.NumberMap - cugraph.structure.NumberMap.MultiGPU - cugraph.structure.NumberMap.SingleGPU - cugraph.structure.NumberMap.from_internal_vertex_id - cugraph.structure.NumberMap.to_internal_vertex_id - cugraph.structure.NumberMap.add_internal_vertex_id - cugraph.structure.NumberMap.compute_vals - cugraph.structure.NumberMap.compute_vals_types - cugraph.structure.NumberMap.generate_unused_column_name - cugraph.structure.NumberMap.renumber - cugraph.structure.NumberMap.renumber_and_segment - cugraph.structure.NumberMap.set_renumbered_col_names - cugraph.structure.NumberMap.unrenumber - cugraph.structure.NumberMap.vertex_column_size - -Other ------------------------------ -.. autosummary:: - :toctree: api/ - - cugraph.hypergraph diff --git a/docs/cugraph/source/basics/index.rst b/docs/cugraph/source/basics/index.rst index 1875ac22b..7bba301b6 100644 --- a/docs/cugraph/source/basics/index.rst +++ b/docs/cugraph/source/basics/index.rst @@ -7,6 +7,5 @@ Basics :maxdepth: 2 cugraph_intro - cugraph_toc.md nx_transition cugraph_cascading diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 12bc74aea..e6731ed51 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -5,6 +5,9 @@ into the RAPIDS data science ecosystem and allows the data scientist to easily call graph algorithms using data stored in GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. +Note: We are redoing all of our documents, please be patient as we update +the docs and links + .. toctree:: :maxdepth: 2 :caption: Contents: diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/cugraph/source/tutorials/cugraph_notebooks.md index 1624ef10a..ff9d6b199 100644 --- a/docs/cugraph/source/tutorials/cugraph_notebooks.md +++ b/docs/cugraph/source/tutorials/cugraph_notebooks.md @@ -1,6 +1,6 @@ # cuGraph Notebooks -![GraphAnalyticsFigure](img/GraphAnalyticsFigure.jpg) +![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 @@ -74,4 +74,4 @@ Unless required by applicable law or agreed to in writing, software distributed -![RAPIDS](img/rapids_logo.png) \ No newline at end of file +![RAPIDS](https://github.com/rapidsai/cugraph/tree/main/img/rapids_logo.png) \ No newline at end of file From b360a2fc0df85aa82897c5cd839f7b77762b5c30 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Mon, 17 Apr 2023 15:15:39 -0500 Subject: [PATCH 243/384] Update clang-format to 16.0.1. (#3485) This PR updates the clang-format version used by pre-commit. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3485 --- .pre-commit-config.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c2f5fe2c..0f05aedf1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,6 +2,7 @@ # # Before first use: `pre-commit install` # To run: `pre-commit run --all-files` +exclude: '^thirdparty' repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 @@ -32,13 +33,13 @@ repos: additional_dependencies: - flake8==6.0.0 - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v11.1.0 + rev: v16.0.1 hooks: - id: clang-format exclude: | (?x)^( cpp/libcugraph_etl| - cpp/tests/c_api/.* + cpp/tests/c_api ) types_or: [c, c++, cuda] args: ["-fallback-style=none", "-style=file", "-i"] From 3b1e6a93b9acc0bd24b96c19d03f25bd613857fb Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:37:38 -0400 Subject: [PATCH 244/384] adding cugraph-ops (#3488) The goal is to have a unified docs area for all graph work. This PR is the first step in getting cugraph-ops included in the main graph doc area Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Tingyu Wang (https://github.com/tingyu66) - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3488 --- .../cugraph-ops/bipartite_operators.rst | 16 ++++ .../source/api_docs/cugraph-ops/dimenet.rst | 24 ++++++ .../api_docs/cugraph-ops/fg_operators.rst | 83 +++++++++++++++++++ .../api_docs/cugraph-ops/graph_types.rst | 33 ++++++++ .../source/api_docs/cugraph-ops/index.rst | 18 ++++ .../api_docs/cugraph-ops/mfg_operators.rst | 31 +++++++ .../source/api_docs/cugraph-ops/pytorch.rst | 36 ++++++++ .../api_docs/cugraph-ops/static_operators.rst | 16 ++++ docs/cugraph/source/api_docs/index.rst | 4 +- docs/cugraph/source/index.rst | 26 ++++-- 10 files changed, 279 insertions(+), 8 deletions(-) create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/index.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst diff --git a/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst new file mode 100644 index 000000000..e172309fa --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst @@ -0,0 +1,16 @@ +============================= +Operators on Bipartite Graphs +============================= + +.. currentmodule:: pylibcugraphops + +Update Edges: Concatenation or Sum of Edge and Node Features +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + operators.update_efeat_bipartite_e2e_concat_fwd + operators.update_efeat_bipartite_e2e_concat_bwd + + operators.update_efeat_bipartite_e2e_sum_fwd + operators.update_efeat_bipartite_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst b/docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst new file mode 100644 index 000000000..b709464c7 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst @@ -0,0 +1,24 @@ +================= +Dimenet operators +================= + +.. currentmodule:: pylibcugraphops + +Radial Basis Functions +---------------------- +.. autosummary:: + :toctree: ../api/ops/ + + dimenet.radial_basis_fwd + dimenet.radial_basis_bwd + dimenet.radial_basis_bwd_bwd + +Edge-to-Edge Aggregation +------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + dimenet.agg_edge_to_edge_fwd + dimenet.agg_edge_to_edge_bwd + dimenet.agg_edge_to_edge_bwd2_grad + dimenet.agg_edge_to_edge_bwd2_main diff --git a/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst new file mode 100644 index 000000000..387844f68 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst @@ -0,0 +1,83 @@ +======================== +Operators on Full Graphs +======================== + +.. currentmodule:: pylibcugraphops + +Simple Neighborhood Aggregator (SAGEConv) +----------------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_simple_fg_n2n_fwd + operators.agg_simple_fg_n2n_bwd + operators.agg_simple_fg_e2n_fwd + operators.agg_simple_fg_e2n_bwd + operators.agg_simple_fg_n2n_e2n_fwd + operators.agg_simple_fg_n2n_e2n_bwd + + operators.agg_concat_fg_n2n_fwd + operators.agg_concat_fg_n2n_bwd + operators.agg_concat_fg_e2n_fwd + operators.agg_concat_fg_e2n_bwd + operators.agg_concat_fg_n2n_e2n_fwd + operators.agg_concat_fg_n2n_e2n_bwd + +Weighted Neighborhood Aggregation +--------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_weighted_fg_n2n_fwd + operators.agg_weighted_fg_n2n_bwd + operators.agg_concat_weighted_fg_n2n_fwd + operators.agg_concat_weighted_fg_n2n_bwd + +Heterogenous Aggregator using Basis Decomposition (RGCNConv) +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_hg_basis_fg_n2n_post_fwd + operators.agg_hg_basis_fg_n2n_post_bwd + +Graph Attention (GATConv/GATv2Conv) +----------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.mha_gat_fg_n2n_fwd + operators.mha_gat_fg_n2n_bwd + operators.mha_gat_fg_n2n_efeat_fwd + operators.mha_gat_fg_n2n_efeat_bwd + + operators.mha_gat_v2_fg_n2n_fwd + operators.mha_gat_v2_fg_n2n_bwd + operators.mha_gat_v2_fg_n2n_efeat_fwd + operators.mha_gat_v2_fg_n2n_efeat_bwd + +Transformer-like Graph Attention (TransformerConv) +-------------------------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.mha_gat_v2_fg_n2n_fwd + operators.mha_gat_v2_fg_n2n_bwd + operators.mha_gat_v2_fg_n2n_efeat_fwd + operators.mha_gat_v2_fg_n2n_efeat_bwd + +Directional Message-Passing (DMPNN) +----------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_dmpnn_fg_e2e_fwd + operators.agg_dmpnn_fg_e2e_bwd + +Graph Pooling +------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.pool_fg_n2s_fwd + operators.pool_fg_n2s_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst b/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst new file mode 100644 index 000000000..9289ce53e --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst @@ -0,0 +1,33 @@ +=========== +Graph types +=========== + +.. currentmodule:: pylibcugraphops + +Message-Flow Graph (MFG) +------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + make_mfg_csr + +Heterogenous MFG +---------------- +.. autosummary:: + :toctree: ../api/ops/ + + make_mfg_csr_hg + +"Full" Graph (FG) +----------------- +.. autosummary:: + :toctree: ../api/ops/ + + make_fg_csr + +Heterogenous FG +--------------- +.. autosummary:: + :toctree: ../api/ops/ + + make_fg_csr_hg diff --git a/docs/cugraph/source/api_docs/cugraph-ops/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/index.rst new file mode 100644 index 000000000..e2338dc18 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/index.rst @@ -0,0 +1,18 @@ +========================= +cugraph-ops API reference +========================= + +This page provides a list of all publicly accessible modules, methods and classes through `pylibcugraphops.*` namespace. + +.. toctree:: + :maxdepth: 2 + :caption: API Documentation + + graph_types + pytorch + mfg_operators + bipartite_operators + static_operators + fg_operators + dimenet + pytorch diff --git a/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst new file mode 100644 index 000000000..f3dd1faa2 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst @@ -0,0 +1,31 @@ +================================ +Operators on Message-Flow Graphs +================================ + +.. currentmodule:: pylibcugraphops + +Simple Neighborhood Aggregator (SAGEConv) +----------------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_simple_mfg_n2n_fwd + operators.agg_simple_mfg_n2n_bwd + operators.agg_concat_mfg_n2n_fwd + operators.agg_concat_mfg_n2n_bwd + +Graph Attention (GATConv) +------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + operators.mha_gat_mfg_n2n_fwd + operators.mha_gat_mfg_n2n_bwd + +Heterogenous Aggregator using Basis Decomposition (RGCNConv) +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + operators.agg_hg_basis_mfg_n2n_post_fwd + operators.agg_hg_basis_mfg_n2n_post_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst b/docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst new file mode 100644 index 000000000..83800fbc5 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst @@ -0,0 +1,36 @@ +========================== +PyTorch Autograd Wrappers +========================== + +.. currentmodule:: pylibcugraphops + +Simple Neighborhood Aggregator (SAGEConv) +----------------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + pytorch.operators.agg_concat_n2n + +Graph Attention (GATConv/GATv2Conv) +----------------------------------- +.. autosummary:: + :toctree: ../api/ops/ + + pytorch.operators.mha_gat_n2n + pytorch.operators.mha_gat_v2_n2n + +Heterogenous Aggregator using Basis Decomposition (RGCNConv) +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + pytorch.operators.agg_hg_basis_n2n_post + + +Update Edges: Concatenation or Sum of Edge and Node Features +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + pytorch.operators.update_efeat_bipartite_e2e + pytorch.operators.update_efeat_static_e2e diff --git a/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst new file mode 100644 index 000000000..f3ecc068f --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst @@ -0,0 +1,16 @@ +========================== +Operators on Static Graphs +========================== + +.. currentmodule:: pylibcugraphops + +Update Edges: Concatenation or Sum of Edge and Node Features +------------------------------------------------------------ +.. autosummary:: + :toctree: ../api/ops/ + + operators.update_efeat_static_e2e_concat_fwd + operators.update_efeat_static_e2e_concat_bwd + + operators.update_efeat_static_e2e_sum_fwd + operators.update_efeat_static_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 229bea451..45f7210f5 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -1,8 +1,7 @@ Python API reference ==================== -This page provides a list of all publicly accessible Python modules, -methods and classes through ``cugraph.*`` namespace. +This page provides a list of all publicly accessible Python modules with in the Graph collection .. toctree:: :maxdepth: 2 @@ -13,4 +12,5 @@ methods and classes through ``cugraph.*`` namespace. cugraph-dgl/cugraph_dgl.rst cugraph-pyg/cugraph_pyg.rst service/index.rst + cugraph-ops/index.rst diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index e6731ed51..f5fdadacf 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -1,13 +1,27 @@ -Welcome to cuGraph's documentation! -=================================== -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 GPU DataFrames, -NetworkX Graphs, or even CuPy or SciPy sparse Matrices. +Welcome to RAPIDS Graph documentation +===================================== +RAPIDS Graph covers a range of libraries and packages, that includes: + +__cugraph__: focuses on GPU accelerated graph algorithms. + +__cugraph-ops__: focuses on GNN aggregators and operators. + +__cugraph-pg__: focuses on providing support for Property Graph (and future Knowledge Graph). + +__cugraph-service__: focuses on wrapping graph features as a service. + +__cugraph-pyg__: focuses on exposing features under the Graph umbrella into the PyG framework. + +__cugraph-dgl__: focuses on exposing features under the Graph umbrella into the DGL framework + +__WholeGraph__: focuses on GNN training using shared memory. + +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 GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. Note: We are redoing all of our documents, please be patient as we update the docs and links + .. toctree:: :maxdepth: 2 :caption: Contents: From e16ce4b251db9218c9cbd7e34eeb1bb46813d8b9 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Fri, 21 Apr 2023 09:14:34 -0400 Subject: [PATCH 245/384] REL v23.04.01 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 4d11d4ef9..11225100e 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -78,7 +78,7 @@ # The short X.Y version. version = '23.04' # The full version, including alpha/beta/rc tags. -release = '23.04.00' +release = '23.04.01' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From a5663c9eec618225ce037687ec8299ec769e0432 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Fri, 28 Apr 2023 11:07:46 -0400 Subject: [PATCH 246/384] update docs (#3510) Addressing a number of doc issues closes #2500 closes #3141 closes #3213 Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3510 --- .../cugraph/{generator.rst => generators.rst} | 6 +- .../cugraph/source/api_docs/cugraph/index.rst | 2 +- .../source/api_docs/cugraph_c/c_and_cpp.rst | 2 +- docs/cugraph/source/basics/coming_soon.md | 6 - docs/cugraph/source/basics/cugraph_toc.md | 13 -- .../source/graph_support/datastores.rst | 8 +- .../source/graph_support/feature_stores.md | 3 + .../source/graph_support/gnn_support.rst | 4 +- .../source/graph_support/graph_algorithms.rst | 1 - .../source/graph_support/knowledge_stores.md | 3 + .../source/graph_support/property_graph.md | 12 +- .../graph_support/wholegraph_support.md | 4 + .../graph_support/wholegraph_support.rst | 0 docs/cugraph/source/images/pg_example.png | Bin 0 -> 242398 bytes docs/cugraph/source/index.rst | 23 +- .../source/installation/getting_cugraph.md | 5 +- .../source/installation/source_build.md | 2 +- .../{cugraph_ref.rst => cugraph_ref.md} | 81 ++----- docs/cugraph/source/references/datasets.md | 21 ++ docs/cugraph/source/references/datasets.rst | 0 docs/cugraph/source/references/index.rst | 4 +- docs/cugraph/source/references/licenses.md | 208 ++++++++++++++++++ docs/cugraph/source/references/licenses.rst | 0 docs/cugraph/source/tutorials/index.rst | 1 + 24 files changed, 285 insertions(+), 124 deletions(-) rename docs/cugraph/source/api_docs/cugraph/{generator.rst => generators.rst} (77%) delete mode 100644 docs/cugraph/source/basics/coming_soon.md delete mode 100644 docs/cugraph/source/basics/cugraph_toc.md create mode 100644 docs/cugraph/source/graph_support/wholegraph_support.md delete mode 100644 docs/cugraph/source/graph_support/wholegraph_support.rst create mode 100644 docs/cugraph/source/images/pg_example.png rename docs/cugraph/source/references/{cugraph_ref.rst => cugraph_ref.md} (55%) create mode 100644 docs/cugraph/source/references/datasets.md delete mode 100644 docs/cugraph/source/references/datasets.rst create mode 100644 docs/cugraph/source/references/licenses.md delete mode 100644 docs/cugraph/source/references/licenses.rst diff --git a/docs/cugraph/source/api_docs/cugraph/generator.rst b/docs/cugraph/source/api_docs/cugraph/generators.rst similarity index 77% rename from docs/cugraph/source/api_docs/cugraph/generator.rst rename to docs/cugraph/source/api_docs/cugraph/generators.rst index 9b4ebbcf7..4f93d943e 100644 --- a/docs/cugraph/source/api_docs/cugraph/generator.rst +++ b/docs/cugraph/source/api_docs/cugraph/generators.rst @@ -1,6 +1,6 @@ -========= -Generator -========= +========== +Generators +========== .. currentmodule:: cugraph diff --git a/docs/cugraph/source/api_docs/cugraph/index.rst b/docs/cugraph/source/api_docs/cugraph/index.rst index 1b920a841..20b63d50a 100644 --- a/docs/cugraph/source/api_docs/cugraph/index.rst +++ b/docs/cugraph/source/api_docs/cugraph/index.rst @@ -20,6 +20,6 @@ cugraph API Reference sampling traversal tree - generator + generators helper_functions dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst b/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst index a3a88e8f6..34b812785 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst @@ -1,4 +1,4 @@ CuGraph C and C++ API Links =========================== -`CuGraph C and C++ API <../basics/coming_soon.md>`_ \ No newline at end of file +coming soon - see https://docs.rapids.ai/api/libcugraph/nightly/ \ No newline at end of file diff --git a/docs/cugraph/source/basics/coming_soon.md b/docs/cugraph/source/basics/coming_soon.md deleted file mode 100644 index 6cf15a954..000000000 --- a/docs/cugraph/source/basics/coming_soon.md +++ /dev/null @@ -1,6 +0,0 @@ - -
- - -This part of the cuGraph documentation is currently under development. \ No newline at end of file diff --git a/docs/cugraph/source/basics/cugraph_toc.md b/docs/cugraph/source/basics/cugraph_toc.md deleted file mode 100644 index 8b71ad378..000000000 --- a/docs/cugraph/source/basics/cugraph_toc.md +++ /dev/null @@ -1,13 +0,0 @@ - -- General - - [Basic CuGraph Information]() - - [Latest News]() - - [Blogs and Presentation]() - - [How-to Guides]() - - [Performance]() -- CuGraph Development and Contributing - - [Getting cuGraph Packages]() - - [Contributing to cuGraph]() - - [CuGraph Development Guide]() -- Algorithms - - [Current list of algorithms]() diff --git a/docs/cugraph/source/graph_support/datastores.rst b/docs/cugraph/source/graph_support/datastores.rst index 82db2c0e1..f92110077 100644 --- a/docs/cugraph/source/graph_support/datastores.rst +++ b/docs/cugraph/source/graph_support/datastores.rst @@ -1,11 +1,9 @@ -=========== Data Stores =========== - - .. toctree:: :maxdepth: 3 - + property_graph.md + knowledge_stores.md feature_stores.md - knowledge_stores.md \ No newline at end of file + diff --git a/docs/cugraph/source/graph_support/feature_stores.md b/docs/cugraph/source/graph_support/feature_stores.md index e69de29bb..f40cab72e 100644 --- a/docs/cugraph/source/graph_support/feature_stores.md +++ b/docs/cugraph/source/graph_support/feature_stores.md @@ -0,0 +1,3 @@ +# Feature Store + +Coming Soon \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/gnn_support.rst b/docs/cugraph/source/graph_support/gnn_support.rst index 2acb2254a..3c92dc360 100644 --- a/docs/cugraph/source/graph_support/gnn_support.rst +++ b/docs/cugraph/source/graph_support/gnn_support.rst @@ -4,9 +4,9 @@ Graph Neural Network Support .. toctree:: - :maxdepth: 3 + :maxdepth: 2 PyG_support.md DGL_support.md cugraphops_support.rst - wholegraph_support.rst \ No newline at end of file + wholegraph_support.md \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/graph_algorithms.rst b/docs/cugraph/source/graph_support/graph_algorithms.rst index 885be03bf..a8ba01aa9 100644 --- a/docs/cugraph/source/graph_support/graph_algorithms.rst +++ b/docs/cugraph/source/graph_support/graph_algorithms.rst @@ -2,7 +2,6 @@ Algorithms ========== - .. toctree:: :maxdepth: 3 diff --git a/docs/cugraph/source/graph_support/knowledge_stores.md b/docs/cugraph/source/graph_support/knowledge_stores.md index e69de29bb..4d6028a59 100644 --- a/docs/cugraph/source/graph_support/knowledge_stores.md +++ b/docs/cugraph/source/graph_support/knowledge_stores.md @@ -0,0 +1,3 @@ +# Knowledge Store + +Coming Soon \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/cugraph/source/graph_support/property_graph.md index 4610cb7c3..614910b79 100644 --- a/docs/cugraph/source/graph_support/property_graph.md +++ b/docs/cugraph/source/graph_support/property_graph.md @@ -1,14 +1,10 @@ -

-
- cuGraph -

-

-
-Property Graph -

+# 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 diff --git a/docs/cugraph/source/graph_support/wholegraph_support.md b/docs/cugraph/source/graph_support/wholegraph_support.md new file mode 100644 index 000000000..fa26700a6 --- /dev/null +++ b/docs/cugraph/source/graph_support/wholegraph_support.md @@ -0,0 +1,4 @@ +# 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 \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/wholegraph_support.rst b/docs/cugraph/source/graph_support/wholegraph_support.rst deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/cugraph/source/images/pg_example.png b/docs/cugraph/source/images/pg_example.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce8a0f20549deaa34b968787f0b711ed8bc71fb GIT binary patch literal 242398 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

SA$se&RAg!z)vItsoyZ(+_ zu&2)=MlVMBMf=<+ z?+9WFi`AiW3dhgwME0i<=((s0`ev0yV!j)KQw0yMj)A*^6^)1Sx)5Y+(Li58PR@Cd z(azWr%WuM{^#Ry+FdKW$CSmIjPh&!+2YM2aqVn7jnq84FR3FQ}<(Cq&@Xd)Sn6tJa zLB@v#k-Do0GK8fNLW~9+>pVW^{J>rVGBh)LD^WB6*xZ|TVLXmo>w&~vKO`)@6G45R z#!F9k!;6i3;m!Jqc&kPny3`$n_{XMUa))H(kKTb@Yxbe|N5-ETu2|=sK5-l~W=zA# zF{7~a!w=0EkJC)jC$*>`B_U>lb=--b(KgL(8!Li99cq4Lodv@5xtrs z-b`BpXhQ&1gnxIX@m*TTF*rCFixw@yp+kpC%>R;#@6jXyiTPP?wFF}9b3rZD{)4|F zVQ>sV=1zi4b@WNOj}`NE=q`Zg2SHq>Cwegd^hhIwXL_M$jvspE`ZA4sA~xNfqK^T0 z#53Q;=XshBj~=v3$n{1-wz^uqjakn;p3}eBR4>G3_#-j9JQ6d@BR;(h;xjZG(2xH6 z8aF+7O>DY#ea}4RzZ`y;WH3Kx@LGPL#Ank_b>pVVE#2^%M3x0{w2x;v6HPc}rto|5 zqk>_}q2#(Ej=I7g$9p8`enxyQ(w*gEyYsqvR(?2{=gnZ=&M0N{xJ*CZ)1Oj`$E6vM zrO-Wv;YjhssMU9)-is_pdbY#>1VQ`0PkVRr4QSB5zFf|K)LlwlS&*Spy0Mm4KcDSS z9zKe$O`Dm$mb67duBQjG+}*IsofR-EdbOA&xq0IK>hndQn zw;Q%Ku8;3ucosYB*F)YNcVOxD6_8);4t)OjL)h7@A?B6$!`24(;k%a4;p>N+VEbLS z;p3Y3;@jHyVN1obSjBs&FNJx7~#Gcix7TrF;l3-uS#q6>Kb5200AJYHtsu zxe}~O`(WMOw_sD%TY2t=4gTfuUe!C1LwD(3?pRf(G&6i(FE=b7pLomNOyJs{*>i3D*i)4Ix zd?+So--AIbyy?ah-L=3T{R^Xi3WI<}g`=i{M`e3iV`OM=W;anZI9MzH3S>-+jJ7pk zh0vE@qGOf>V9dyQ=+$)*f}RwW#v?VbVXR;?epKQIDgTQ5e+ppE!6Z5IxH zUW9$$oW{(FOE7)v0(}0}cPM1yKF!E1G_iMv$J%U@@oUDus4LF_GUuFxE*0OVYlW{y zdBhfLY>gmBe#%F=)w}!qDf9d!IElKEwr$&n`1p9_2|x*RcTJ+R}q*KaIz9mzdA|B76FwF=w&NPnu;Ilc^;W+z=@&aNHCu*fhC48h%Po}6VDvcF)ii-zU^139#$ufsso~PA{qGN%I{IEA*w3qXL*F)>J zsKR$OU0PZoPmrTq^`uUi8z$jrSxlc=#HBHCt$nw-@r=-Oc^9 zc149{qc?#XV5U_qt9wGk|Y%phA9h8D;W zVvMN3unH(61RM=%+=qSJhG+`^spm)~e$o_FOi;iUMJ|2hZ8FwOX3H?}E5g|*e zVep#Qu<5{P?7=*2`8fomSf~$J?ukTxMe2*t%s^roOhL_pUSEdV5j#4w4DYF~F1w&( zIOxW-$VeDwt$7of;(-Af_aXb^q4;^v0erG)AJQjp!-T-)=<|;W=+R&}g6|uE4tMlI z>$`fPL%qT1+j21$4cLKYV|Su=$P~<-n1=noSc6du&oJ&7eA0*^kU>?JC9+&5B zBr4sF`O2Lj<4q{>VukIFcnxBAROa@UAOf0LL4(r1z=m*<$YX&_tnw}^c|nfco9<#= zznbnP{8%wF1Lc->f|)qwV~W*%%C<;O-3f|$vV zx+m=vM&(VNtNZuTy0iR_o%~>!EWh+jiZjcNT8<+b#z^IR&7#crMNh`t!0fxws3kwF z2DHI9dp_qIQrE8_#-@i$t1AvNQfBnK#BnZ=32D>}L)|sq+65a~vFCca8Tb&OsFKff z*Wz(r*yiGk9WI`P4r^~A0mo)fUsG9c@bJSbH!ng3!GIv4Yu6A&wrQ^;9t$+qy1QYM zn;W*XlGgy=E!4H>oED%{<-g6v$E?dD|Fi<|4o`2hs_y%gtrVH(5|XkASStxL%Xxh| z@0mrB|65D@o7I7JZ>>nY)}=H-s1!E4`C*$^X>9hrfzPA0Yut>#+Cyork2f;umkn1J z1IeG2YasJiQ;KQE`I!?XAY+Y@VG+s~RD9+v3)Is%Rd5(ZXSKs|0S**?j*Z`r$GF@_ z(I>aGDJa5OD5y(EV^hw948L>?$mpxbVa7ruCexE&j+(W^0z?I%3RGSbl~xMzX$`RO z^GNJEw+u%M79r=|P8hhN5yIwHN6gYEvHa`7*o9PlcWe?CZ+#MjmtTjz1eu;{8A|tH z!RyXKSBvnmu;Q0qe73%{%J5$0cwc`L7PFm!36E9SnORE=f5K{i7UtzKB)bmsz8Jx> z;-slta0EE~K@m1heIIiJSEBEelMvQy1cI85LfhIy(5mhrv~4yVFV&96(=~$8zuO#q zw00LxA1byQSybpKLJ2j{m?HLbXM`EwEGuS3brjJ2YQdx?Nfd<*ex;#4(&ycAsz5! z7k`A$s)WQ$KhvsWS~!_+f>$vArSO>PJ2Isd(|tL_=Uj)loC*XRA4I0PAz_t|0gMRd z3GF)HBabkVOSm9JB;cO(9S85eBdea+`1H0ne zJ>RNyH2mOQVvDCI)_A&`Mcq`vr&G`I^fQBg zw-O4r6FRoJd1D>jrw~e3`<69>bOkxwi&gIY`sr0{$v zfn_KC+GN&|@k16X{SEE}4_9x(hX+AJgKw?v0Y0Scps00bEg>t{i?HJ9fy`26kW;QQ zR(g1uR-z65gc=VwvjssefhtoA`q4kFQmic%a$L$Ig)pXjyiZXpkbo@Dj0gJfwZ=%C zK}P55I?K5RGFP!uOe@}5S!&@oRvfA$O~VY0m4USzwklDr$5cQ!r?3}a9Zkpd4KE`) zi3I}-gPxn+5kfswaKJ*s0vUB7*&w4<8GQ{AV$wbN)yTpuPrF^yE#XIcY>q#oR#wHx zwJ&4)FEjWZ^dWX1TZ5DjhGBGe7^ZI?j_pTsup9ZHpvD1uZ!Hm@cqqHx%pbLq&vsz;G6Tlp!BMmgvfJ1_nU`Q)13y$Pi z;rkmZ8&U);KmGI*I&|oO^z?L`IB~+532^?pAj5FmQj-51N{13c>REn3=q2wzyblQ@ zJK@>jvgp3x2K3JHVO}AO6D$%|vm#C;|3%omqXMt=AC50M;U@oDOT{-ApXcz zZe|>rT3jOq0W^yxsPxJ$kG?sTk+8BN!WMcXDwR;9R-jye#AeWslrrd%UY_nMpf~TU z{HUGs1vOf>Auhc%B2)bkxzdOE)!P7;T8gy)n&88RjXy2&#}KQagpxn;^@o~s8I`}kmGX&)^2a5dAJwXK2Hph@>} z=XEYv;!TjKcpdFMOqWv*A!Dtl57Kx)?cuc2yDXM?_+u&WvE0=MYs+1SEtPK|jCh!q z48e@LmNpWcw9>BNYE^~n@KN1H`23+qu)S7otglo7Nra_Uz63Ep4`W+y$XR0rLc(khLz}99OwI@8(J2!a{c;n9;U5riJocY%vW9*3pahWMXQ@ga8d#? zYLyYl2x2Ud(ZJrAOfMv^;a8#x8y1j~xI7<(EH8(+74@-rXC%Hlkb;x=2#3yX$G&r0 zvFF@}_z|11@z)WUvhgwWR%=YMFZ!gipmr3l;h9<&rYzya*X-qF`sxKN{L+ju;bB3^ z^Yb91FGz3nT*K#B>5qsdH(}O}R`~2_5{?xA%t&DTXt5a0OfrorJSW%`9|3;Yc@&FB ztU~kNIZR82p%lm9xvP$jSlq&pkw2Hh#@Mr&G%ZTPN=+-gDl7sk@{EBQy}G}lvRhoVFyq#(TM-@}j-5Mqn(;BV z-Cq}El))TgUZB%Uv`_hL#b-|QS&MPt@Bt)_=z^z%N+V=udBmo9u)?=M#`oIu z=2Swv37+UM$pZoN{1C8+#|vH1X{if>na2e*@f%7JH2lzcfg9eQ;DYv(-O+i9FJA8L zg4%6d@X81m1n3^iOQF*YU%WZmg;2$Oo>UnzEBw%Yx(nW(ME@3gAeP`1G^Y$&j&i}9 zV>Cvt4B`n-k?I~Ja9t8i{)AYqF%k#J=vZbBkTEbLw-43%Vt?#kYID zw_eL1NNWEBkkODutsrA9xUDd0_iGLI9pG*4nY5NLpaHNOS-A^na(uk7v|J^O_A7(0 zy0pic;REo|t1n>T4L2a`-n+5mvF6zI_8a*4sVDK%D=*{6r=CFm9aXTnTv=>s)C7Cq zc^jWT{{&KM+<}z4??7tRs>r?LF08)mZe-tE4Qrb}jQ3xA9lHVpv8Y}hEU!}o-$exC z?685@{rr>2zx4*}eXtomzPl>cl`f5B0>L6e!j}7LpeQ5^XGe`j;iQRpzi}O8m-awD zfka(P+Znc^?%i=}@F0BLqB$0oEr;=*rLnI512`5JkNqKCvG%6xkxdZOLU2#bbgE-K$`+3*_kZvWQ(-6@6DWz=WJ9k@9I5 zY&qHsJI)M5{;vs``$cOE-%yudk^YG1mtC(6S0u2|(<;6ykRr1QFj*BTrD66^qItDy|Yk&sagM4B!qmQws0Kf{X5wBD37*HFxox4cd;BvC+|lqz>s^pd}_vctcB z|9&$*X5`3``1adx&A1tR?95+N>A6Ip7YScwNmit2T_Ur|G1b092M|BJ8=eg*kI|Ry&bk?|4Ryiu{apz!rSU{h!HWwT zbacV>Pr2a6r(IC@9S?LIaRXlK>4$pnxZ<8ST+lqi1yA;K!J~a$@a#xJOu82NQFI_OA8C#wJ)%)Obu=(`I12jp0|pHS`uE1}4z2LTo3Emp$-yK-L)B!5;e)wOgDWUgkV zn6~nWGOT$aj#r^WVhn#8pK*fcXRP{^ZjYY%9^3a!!SL*QW?E)!j+gaS<0v?+77u$? zfV0@+W&|}>L2UQ+n{yV@vFVi%mvTLNCtr_2S$AOQ+8P+Nt_J$#-@`Aan-H7n!!I{$ zri2P{vlT(U1yYeY{)o)1OpqyS!lHu83`|sWHQkv)P38`3Pl9zq&DqZ-k7a#F*pI#+fQl9F-}f?$pnPm_Kwe`m`N_VV$O8Nb6Y$d~h({ zsnHv6R~vwU1``p|WER36oQ(mkmSWM+4R}9mH%|Y=>qSP2dPeR!wPBn437&XtMfh(; zKw~lxkDZj=QsFFrMP-Nk#~*)0AC{+P{g^#_N&x4t3u_9q@|tMWmP>(*B~lj11mn5j z$^@C~k(gP=j73rRl9`pGac1d+_Ec|-+I%nCPxiwTi7se2u{?UG-h*y4Zp1_3E_f>5 z4KMWZz?(x#t~)bm!f8qxqS zCEkv=2H%V(U0m=8!x1p;CPXj19k2E)i|TK!{}&M_VppiXsLe96mrK_7cc6rSn1}DS!F6C|LNzjIXnO# z4~fJ2&<@z#_Dvk>8IMmocEIj{ZYb=TfSs?tgl_^m;rM{wINrY}ehBM^?0>YtC#~Pc z3EE@!bbQjeBeEW8fe%}?qFFDT=-m&Wcj<;NLqhOlOe8kG^*TNa3BXU`fmmI)Hdfwv z12)`w2Qtf*MV^}m1^Xb^y%d(ZmBNziZo_9Ux5Vk_7`%IbW8_pUgLMqA0f({`@X3=; zp)ituHmHM*jT+zpzh0x?zonCsu0~lLI{dQ@J+S_phex z*jCA@cfe!)*~HySy^uShxyQOu^xR0}Es>7IiNP zXr#07brdEBWTdO5CZiN$)BMqWCH-6BjqqhGM3YJ*LVfr&kIhm)yjAc>R1j$~I}2p| z2r?BBneA^i8PnX}dr31XbWhEY(f~#?TZ7lf@%qGEAB4>>g{f;_$0xt05Zm^#tgz!l zaidLVix?AymJn)ApJizx;GmP!#|toH+)ON*xEPFDmT@Ar236|QNdZ9DLQBR z>D9GYY(!9L<&{e*fxut4vbU7N{=o+yAT~DEjE^~X?3ihdv7b%He?6u5@vlL~9-}6; z@6bWS4-3b$!8amg<}Cz?3WRsf^s&;eD&HRJMrGa@vgR(lHQLv-$g~_*8ga|-M9iWp zc(Ioos=eWYe?+_B?V;uH)_^kTHtu#r&#Z?Rx>v%TPq?7wOD?#-qZ=L%^TIQU{^&Tl zBKqXqhJovELri*U^vth_@D*N2%({Ue8aLzZk$wasSG4MPJvt1ohGy-VkCJak+X-HH zB$6OCsw$%9G{CF9uEUE7r3}ctI?x3JGOI95mGE?|8|t@l!2?~r@Xx5Syk}W-n^ghv z8I{etE@pFCNu~uL8i*@h=OuO&XS)(NPIlch`Qeo5YgY2^k)ictG~nO$f-Yu>*(IOx zI5_8aG$d4o_i2Y8e))!PK$%kVd%4Y0R~}^4JbSi)g>V6jAP2~tut27-w=dFMy|BsC z7aKL0moTGBIGOs&oA1Kj*k0H@b_{-8FbhAnde5!+;FZ@=5Z@aZKOXPB^A_^{`44>AxeE$=_eD|no><%L zQEYnjDIAaMiO*ZN!Pgzyk?*3gmc=sv%E+tJ z1n0WPVb=@KVfFPI_u>w%)SKhsj}6so<4iyxzIxyRY_DGrp9BWs>k&h6JZ(OX%^iZx z&oo0)>C(vZ@F67Wd9Q)Y|9NF9Y>AHTbMuxc8d=5ym*;29EGD%@9LKMPA0XwEXe2DH z#)7Rf3sgTA2!aK>a8UP>4KO;k#XhGS!Hct)FDHVI#fPkhF7t(`rqRaW`TtXaFObuU)9#1bs=Z2HeuJ$OjsWk|#YxPCvCIgZ9(qzo)o{5cf zKERJ#_Mz}+#=Sk;$p)EXja5?P%^6x1QVRIfS|e&P`fUr$#pi!Tb@b>_WMyTcM~@zO z@4fd7xH#|J{?~*wh565bOe8_(W&}^ajg@gFf($EarfsdeVnD{U%J`yx{%v@BoDcpP z=Yltf`yqDOZ3Zq{kM_U~Pr2aP1P_ExzXeZ4l}F82%b?EdmC&%2Kc0!KfG5L!Q2R|+ z)Ogba&-L;}yGf<-*4VOWHIaEP&4(aU8nNj<=#f?$U1n9pgQ32t_PPrm3vt66eQrRt z*Idx3n=e|A_rx>3T+pDCA8Nl-77qk?pv|bVXc6Ipmj*B|E-j6Ol^08(ndHG`< z!NCmprDV8!V#_^saVCBcP7fJ_{bMKK_>5`5>}fdNzc)5K@G!PhiUPV}$3xAr`H9Ey zO+W`6>eC%Z2K2z^p`CHMUw?v0Cmih(h#vxj@k2rajt&`uGrfAFFem~aHGdpmJoN$! zqI=-0*IQyw*8reTKm7FK>)3H$O?=+sVSI3JHLUjXW0*X!-m5Hj+)@qiwRjR+Tebpv zCE|x?pT=kRH^rCtRKw0P*CE@p6t-8d3v>;_4^5gN$;St?ef+Wb=3B74?VC6f)CPHk ztRzow_D5jjnNgO@tXxe zaX5xAS-l)3I1~`tSZ16#$#lw!Qv-AzEhVaC)Iy?IDj?{5v-?|w#YJH5;(6G!f4?bm zO6n<1-~J5PFz*{oj!Y-G%tBa;ap>G=DB9HShqr6?LhHJ{5c=3iObANBnrR>6ht2y< zchwnQYy9ACl~>f=C4dpgsC(-y&+STG@>ho!XSI9xZqubSV88(E+O^9(pFKXte%8O9 zQi@UHP~NhI=Xw;0td*{uKxQvNCT>^+o(Z`bLDL8_>DL*MG2I~&rf)4N&^^N)eO6UK zz&sDM8t+2b@J7${o6tMs7Q8je4R^ocf=&}l6KtxWd5AyCKjeZcPr2f;u(F6>au30x z0^!3G_qOuFbNxK=4*httuM3_UNdH;EOM0*JLG(%&ygu3mb-K8qrpCw&@IlzD+wjj= zAKcU09bIO7qQi7g)a&eu+g@_P<8k~*SXv2hk8#C26I>Cw)E)iuDxzoFb$DZ_FYX~Y z-P6hwuMKCuO!kJ>eliQ!WvYcmtN#8uiFJt8B114rFHH!f$lQR8T{c+~CowHDRUIud z0-39&MMn2liKD`o89-xXlyo#krZYiiFe~(IS9h#+wZ?O-k?!t-JZ~?2S+gPbKllvZ zt9%!dH7)wiYS`1RHGXK*5;@iH#pc?zuH*igGB)-^w_qRL7E(UA zy$aI&OW|FD%z=MCjSp|T4Y^+4Sn1}6H1D$brcML=%4gnLt^%@L+_B2d7x}JkgpF$; z^M77BB3@LnJ?^YF)K{zrZU}&J!iHd<->R+F0Y0jDdkv5Xo|DC zjhx`*aw2yZiCRyz#eiB^)McasTQCyELPj%@)HP&US@Hxjgd2fNwkOTqDblSL8(n8a z;FICc>&sEf(vAhIX{m8Fv!`N{S&%Qk1hhSja1<0QGK0eLejpN^)Lg8V0pdLPE5j*eL z`NxKri{-DbzWnk_3>`WYlO|2VfddChx{?Gkf6ZQ4_R_kR{ z8t=or*JqX1kRcGH`0<)s&^NCV`mOcnH69c{#Ao@VN2)JkSNb6#vkcLAfq(TLPrThhcY^G)cr3s^TTY zZ1iw53KU=L!Jv^i07Kpz0Is5Ea31m3;S*M^ujtm%ca2N-<4}1^Vd{*4<*7{*BTe2 z^-DDMm$k79RrPJC^46>3zhc@SIrjrTKC&DmvL8lVQblx6x7KPgg@>bnxUAR(jp=TZ zSOtqfMq3SNfjzaf#1TAtvXJh%+7t2l>Q2&BYuc$$WTC0))-eX6)GzKR1nI^SbyX2| z_*Eu%TI9>L-k1Wv9AcK;im`buu=C(396k3TdF2?2&K0n{IEkWS4RS6fl<>I)CWX{B z72BLMKA2vMice$Js(eIskH(6WG#omr6;!%-Dvjf1_YmOjg^frtM zPC@MRv(d51D7;f^INH@4MX2eIH);|PU!R7>L)PK_v>$Qk^V29i#1At0N5<4_Y_p*x zUz!ar(*L@x6&EV)a^1UkZ!BB3%s{$e3!+?wybBxg;tyWt#rniHlO(O*|eF-Ehya+BHTIarVV8cEBI`JjF$G#Cv2p-yI}>PCy&=? z4HmUxsIuPZ=8i1{oNPiv63?}up5P;mqAdcn`fi3R{qZe}RNqntGBOBGsjebZHlCclW^t-_mBI%f*DS6i=&bOySMr zy>x8~!<|>kpFn0!CC}x(^WCiVYXoT9eF-jF4~Nj9Rf@H!pPpIIaxs|vyK)U={+def zp+tx%X8jWNiI~OMSc3~>iuit1A*(_^qqR;7aq`?@?8SDZf6)ztvZ`8NU@Xw=!s1_w zDR8XyWvoHK*0j=?JbqcOErqB&Z$zkYV?o!QV#Wf{-Yl9$G2>&heOLgNVL@7k_8!)l z0s3o;3P{~c-BB7#6CpsNd6b&2Q>&uq$|gwrvO9h#%;r-+|b=VGD{+7eTv+7Z+-5jiT-x3R&?UIdy{9%THb= zDAWMnW9M+-lQY;b{~Jt=%0=umbJ4!;Sahg00f7x?qD_r)Xj5whLLZ%kQJq&Hd%_3! zY2z`R-OJabhO*NZ#9RzAlE1Rj`Z0NVdFa)v7dC9zV9o_FdOktS-yUQL&l=MyWk6;` z5S|IGh@e?F5D3be{GsLbqjUTyzGjJit+*ROF=M}!)(sH25&ktM#2fwBS3*LzHc3=# ziG=1EgnB}WAV^@;bG<)$tuM!X=!1w9`k$&*f0?J#z0B&py_g>p^9d{&1Qvl)KEWX0 z-CQ4@>5AAqAB1TJ72zt5c4mzz+6hp!5N231-DD7I)RLO+hA=`+7{N#5-IS+e>6bP3 zP36LWE(TT@9|l->Znt3B03!f2vm0|%?r2<|EBfc&jd}!`(7x^P?bS2=nu-a-lsOV5 z6e@Ksb-2F?dir@23OtcTpvWLtXyLgH1e%Q$L4ZIcpJ0$fSkYcat3BNb46fKlbFGlO zg|eBVV=Z2%Rd_eK(q4<-@z_-8uGTeL^>;mCMSC4>@bNOBqgInVSFPpZYQcn?2iAM~ znyJ(RomGB>5(1Q9X*=ENepn@%m5a4P zu=ZOLUSQxVq)eH?5G#Uq>0#RRU`s&oaFJ?~` zP3P7sq7;FQ@t5YtZ@SlJc3MD8d&Ov6j6f!gc2NYM#Eb?Ql>Q>#Ke`zE&V9n?(RdgZ zT?J=Rcv4Lsd|pCK;c0>i!R8df?lj{>ozxmXQ&dPPD8`Zni!pZi80^@%6{k-qeG@3o zXvgqVC_G1<{+y;1Fn&+6f+{$7n#Cd`Qe_gItEJ`icZK*W^B7VGeTjjurJ-}ZNoZGd zJlfqyu&F%;of-~DaP#39*lG?I^vcBt>EBpu(WvoEUj-^_^=<@RYN;`y_^n)Mz<-8J zb)mVKhAObne^BVmHZ8e~a)AS9F_u!7vbt@iHSi#c=V7?Anwv(HQ#v;obQzXix# z{0I)Sb4+VzwVegk-opZ!06ZI70l~8>mw-$}wi_Yem!bjg-h>FPVC{p1Rb|k7Z5i~W z-Xp6tL8OdXS+{3SIYcIVB8DFuz49s;pou0(Boa>ISNj?;3E_D}8uP7oh0dx-H`gI9 zU5oI^pHhe<+{EWHPnuR7FXm@&LV!2(D#2xSSu+MLEX|Xkqb(3L4#geO+PXm76r_|! zLPjO@NGpdP8o1B<$Eq7@6+c?^fx$f4Jx^nQ7@mATB(CyByvE0An-SAmd%iX0kBYjW z4anFq!*axi7@3)tSsv?yC?-eSr?@#l#uXub+nX&4^g^sAkc(f|h3blfjLEAEhsmSL z@KlG69mLx$8Y979tsAA0?csw=H&*ysJy)$VlpNCqZs7tiIFs+L=~-is-J9mjS$aXP%F{#Qy7 zuDq(1V~f?IaGI5R0W07_oGD_Zp~ctu+Dyf%mH;|arF`P-X;#pO>GB(F{&oyTXEsM{ z5}|?+(t`z6cYZB)XThhjD{56q$aO~_7I1x7X!Rpx^kLzdsDANO7BDPC!gD+j#==aq zj$*WAxyG0+fJ9;FHM0DS>`OCtC$u z+fIBv%OnCB~C(WQaCs^bN1tT+q!tOAfC#z_(3 zq(C6ULZz_y4Epu!hY1rV;`{HdSq^3pE=Aiq6fvHPn7~yn70^xyqa_B-ZcDs{fZoJE zxk-b2PyAerpLQO_h8bUDe79tDeQ+S&sveIvwR)jry#WYpG#p_Mj6uS)Q!y!kx2v_!ic($LX+K@udYL4b|tzmLpY)Pv`Wm^ zRnRB@W@|yaRJ!MfMPkDRs?$v!ZF!v7Bd!6M(-*))^7lDjkiS?E)r>;E6NR(NW$&@>pU=Ezv zi#H!_h*&H(_@ zZE&&7EO4;^!C7Qx0gK$LB}H2XT5 zONG&v%h}oD?1pgUXw}N1oaI|s#A1!2LQ=2BluMNJ znfsdhUn$cPbC#8ZDz-waf-zHlRT-Ctft|wTjpFCq`FIg3|wWG5Z%sWx=88&^{ z2b0${M*oZ(5W9k3jw~3phf?e+wXV1#D$Ug_-qo7`(=XKpeF-tW2{G|zlR1Hm7edtk z&o4F2CQ8WE;6*|Q3mT1=(ONMP5+197O33%-mm|N}2t6^{h>~A_>ZcDgfFqdUz4%4f zTVIeYq_jC?1iwCma;`_f%6rjg)m!)wYjKniql#J_W9nRr(M{bVkSXSKGDc`9I5}Nh zfRjaasbUZl$iGLE0aJ5z<*P#{r5ioixwxvfR_RPmdfU@j=w ze-^vm-HXlhKgR6XEcASN8ag%_h*s5lqxHQ5(Yekjgx@~}@lVdd_^xTloAf?*Z9j%H zS~XZVq&Mm!6VPZyX01D8rfU;sOgYH+i~@#AV^7pddX_I(`}?TtjA_AqWSB5ouigr; z^&Bci<-c*DAWN5pj%8^wF%2~?$mot^<48h~AuydiLugVQJBifx?e7_gnKy4P4jt0I z4z#165_K{CbqD+E0WGnfhtFlq_1`HH^nM&4-4@6M5oF3CbQa+vqa1qVc$)OB^xlhk zAU?~J&`=hy4s=EBcUyE5|<^O~l8XZRCtDx=l7 za;VisM*F3 zHQM>$l_6#E_SiCL5$BGUlNmmi2MKG+;Ki{Fe@}nZ?(Bnl-L$2F8-b?+@2?gb?bXH) z5_MhW30iE3QP;G@(F)9bZU*{Gx5aMxH9&J7W^6Iz=~&hb%(Yhb4eN6rWE?N)vg(S0 zj3aqi8N_5b>)`P5U+~T&_0ZF=3|6|A#~N3E2N{h1PQ9V zb*#$UHv2t0XE*2F{r|iEQf@B1{`c>3UM_XL0VKwqU`8!6xdg#XM~lp0y6w}r0rHp3 zL_wj(URYmL`eHOK<9bK-%Q7#_Nv^3YrtB!UzSspYd=tzg=Nz+>v`$J9zu*f^iv-;i zoyBQZe5Y9nX<0mNW_b2AYtA!jsyU8hCvvg=y>1w@yf$KIRY2T|(umI`V5}yjFT!p*o^A_mnJ}T5!GVSGhv!L=uV45cab8kdIeto>Qv^idw{sP?( z!MravVcmhB@I7Nf4I8G?X2d973=FVhH{(uNkeualu|Q8_; z2Y4l&(VZ=dU+22ss>W>*Xc*KmVpaCMS24{Bc$F?>b~*6raco=q73LUc~fCvc(mt}y3wqKD;#5om}pF1)j!1vuhH@rW-6B~^}w=Ip=*TpM$SLA zj!pN8J!Xi`wCJC`%W!t~D)j5$-;9${xTNgvq`!2xl8GEk_#_lQyNu0$JH8YdJhvVj z`w21$1es?;Es#lcfQ%~M_&hfx=6fO{*#&*_eesI6A87A_mlDb$W_C5S?0YM2e#`|e z0?MGv`0MaYcNaVu=z|(>d!bp73tk=Kf@gZVn8orMbnrskF=f$iJi#W$#Z1?({G2>Vj7WxuD%7clxbXAs5tX z>w@ZUx}a98Qn-siRlAJ`s7RNn(nllw*@jb#AuA&Z$ZWY3e94(v=AQMIl8=m7i98oH6UXx zh<6o%jM9V2d^#{7Q-tFueny9f>Y|@dDP+2o#U>XYGtNa~x=08yW&=r9$~w0O!dg(H z?i*Fy7wgustzYcsa&~{jjb(mmyZ`m|mvW=lDzzB7U<2b!K&URJY` zx-~YytRW-NS>c2&!Oqa zShP-_g;AewM)t2i;*)|S*u!T&&iF80Dy%rIE*Yj;R{W+5ihrt9wTyn}j-9Y<=~5gy zq_j z7%*{DA+1e!7wzFh7gfZYBRug~tczJZ@3AQ6 z$vI^)B>zr=h&SqWbU~voE@()p-p&;-4`sef_qPTJr}>#pDBl?6j#q|wAY@)?yxgCD zM7y8~;pokgUg$dAA8!n^V5trv=Y?Kg2%L619*J~AzzjdUJ=OzH3Q{KcqTlKp(R+

@Z35Lh6TK0+;yQlhT*qg$#>%N%$qXQ7IdNf&jNQFt0nFbHWJ>Bq zl_1&zpE>&Ev7gZS!MYga<&PYfGT7$gO>x0iipIXIQ_BJ?Vu=khHq5Mcb-N~)62^_j z2x;7q#`GxevfbU0<6i;&dETo@ZR9PR#;Q ztqvkVi>d4M4)`^%smA&W*O(AtC(a%Nj{gk&^f`*Zc^@Y~*@h$8DcCh&Al9{Qhfz;G zj9J~^#;2P{;=NCLU|M<;#4Prsl9tP!G#@N2L1QwMZ4=q({03;s`xv z|0H!Iv2c;7B}UD{aT#7nNcTYk3)1*BUX$jJh?U-i7(c|W@<$ZEOtlMl7_Zk14o%Ni z%T7;1O>`#jweouO%zY3OK8eAgtwZqmh>o}^@MYZEy%WlWzk>>~ZE?@wU_7&EFcRNQ z#)^ZV;p0DPVp7|u)PqgW`BW^fywCl=rDA+ ze=s^X8Hsi^hoW`0{^(M75E7r6iY1Bbux;Mg*!RI_pQ5ax4uHkAjT${Lx&Dy@ZiB_BRp-2CnFH!Dv5D*|KDYt30FQD zGFjsM@5~s{F94agV=N#Oqp2k)L)Y%Uofng7C+QH?YtbX+KD-oC1Al5ta3P6EBX>0V zvIbgxT?cQ)5R`Nez8( zT|5vzs}3R({1L-}M3)5&KP3qD2xR_3Fw*ENcLQRcRanh+Sfw_)3&e8-EswXBq{a;m z`&Y+jL$AZ@v2JKK+!LRUbjO=Ikg}&YT2HBp-~=~xOmsun6}1pDzXo3G>5k_j9cVBt z0FfMg#HLk4hz2AasKhO_C^|zRMqoz3MADf50U#qX8w^Rgj4e4o>j+0K_o0t>0MZC# zRuRZ(MUY59#zRN*;R}L`w(Nj|GdvNIp+h9u$q>YdwBkrht2->TBsZEWicWPy{CqETO7byNQE?<~ zHLhi%5es|~p6QJct>j?m7Rr%nxRe5o-(F^EYU`Q4?4X`R`k~&~ht>G;)Mj*^HXbj= z#^C0*pQBDxD|m)|3`fWta74XkauAa9CqoNZK`Q}i3@kn2Me%}DJzHbP=xbG_hny=9QsSy~^Y#tVk zK8RzR3Xyl3X~`)^HWQ;Zn8$E(7+!995xr(?6feck5FdnY&BisFtCGfyC4mv>67-Vd zGT&a(Yz@hu%gD?^IWxx8JLj@$>r3GK?^mFA?_L-)W~@11N#=5Cj6jX(zt5NqHS}wM zjHZ@sCM{`ti=uPf+r49|DIi4%|`S0ski) zxTmq3*=_foUT%0f+6^tgb;E#VHzRs(b-Wnifg9d);Lb)4{I!QCI!>)Y08^6#0e{4& z1tM&&C*J?kfmaEH8Vz;B+XO=&_Hn~=VQ%;%{jdIK2X6Y%&78UPK~GOK9a0mYkGKwx zec^$|!=yjsj(P+5o*?Hwf}O^rC1LSKL|Rq6*ux!FUvt3yX$Nj-z&Q71Uoe}Xgo7FB zxdkU$Bp~;9fsB)WH$X-WOl`i@706sTf;LY)fF3>pNOG@+|BRcd8cuZ-%6&a zMOf~!R($Z(Cxi(X#MCQw773DX&AxH zD17>-uhHmF{Sf@lNK72?1NN@XGYgf(G%X2|lX!2`T`G_XBPkMclQhP(SZk9o#agl> zOEzOA$u-Tw9+#84VABojnf_`Ok_A#kWtcu=GJ5yvi6u*xR4Db@akI_;Dv)XCoLVvx z83LGa0{qy8YCj(6_v1BaH^mIVse%4+1ba)`zPGFmx0s-gMFK%?~AW zqyV&^>WPpU-sqBg6*^9-g5W7Z2%TONEl2y~lc65;pU+e4qV3q4XfviJ;^y3rh#A)* zI-w@oPxD0B?5YT!Q4@_u5~$4OU?qbClGGr4G0hvFjq^l<;RHKhInZnj+jfFG(IyK8((O)iKk%7Bbzc5vb^JMk)15 ziPZuwTGG6NcB>p-_?|#V3|b_><9c^pB}`j$=`B7C*@FfghtU%<4_CCSY^Z_a<*xgR$gg-E91;#F<`U% zEE|kg;A%Cl&1_0@&tv_JNf`b5%NSa#CZ>7$uw1n@fx~RvnC$C=Ob=g7bNFFh<5np6 zaXkm@9I+c+sADKB{|Q@9&%~_F(deG=XGG4r7oAf6fJlOjh(rRCG&goq7J$*dFj5BY zKmgM=(+lm{xoN{YNnhfVd=NL^i}%ish+rptG2Qao!PzNArMM$v9y`QYRS`A&8uU!M zACrFg1p9KQAg6pi>)27&HAy?bX95w@!NNj(pLZOC)+OWJ(OvP!xMrvo-T>938Y3{K z2?ArAqI!H&T;Jt$yf&sUdafs^%RPqOtfYtY3ee~45g7c{H`u#d{A`Zt@( z(@)w}RsQN7-4nRj_m=~k{~n_pvFKj|G8b1Z>A=)Twvot8ce6^bBbj|fLUnXc|0BAk zU5D62f)BQXaDs&{DRmLW_dOO>LBwqB=W;DNr(cC=P1mMN%2E^IbEU85fi9WeY@1#P zo#W2|Lk)D89*8GG9SC~W0ndjVaQw-E+Z#F1a3}#(QUKyp0tsx~&`BrG&v8fWe1H01 z6>&+`*j}|fJCNWd5HSQWF^RM%nCQeoM_7UfLguLbYu9ZKbeA$M89oS}=godW1Cg4H zPYt$deyeR2j6RG7T(p&gb{95a#n}DMfsCq*1zoIBj|F5(ke_n`pFaIKf~(cRw^eVz z%%JNqw@NJ}22?{rl^{}}xhDBnLyB)rr2Et&RYR(808;(^k?L3F|D4kNElTyX;&bWq z#W-HHcYSv`+3$Z1`6I(G5DWZ*m}knnnwS+>7qe^s5uMxu(e1G(@Wa#zL@ewvOVtsp zm%IpMG*7S2TuVevW3Dv6y>a%W_U^T11r`a=Xth#75lf^v2YLIpV|(Xlq}_8TlDs?& za9!=;VUEtw(HI%tzDT>~CLHYjC2;f`Vn>LbMM}iXUR;`yqb54@ZsGSu#d{W+7=2 zJ8<2rqvHFhne6nY)j^;64`Ry32KezrZ=A|YVcY)+1;s~DsAC5hBMZosGiEyevXnf$ zkbveKemr{+6L+jZhxt?SW?P(^hfi% zzC_D=hoZwHqY(Y_clfH+bYzTJjUzwOZ>=ELsKN!v6!Bhz46FCF(js1KutWtZp_0w0 zw-qT>>UAyEVe^giI|F1)zR+HE&j6Z26c^>8cdu^f)4K-_AGY?7v5j{3wZY8)I*^G; zx3)6~CF71>s6AyY#vDDr8lvXbA%LhsfZeu0r@tGW~@Ltj-olYN< zQ3a970i+bPR4HK~>JzOD0K@z--Z zhubCYMD}xAz7yHc|1MG(ZQU3L=36t~f9~yxPs!jKx%uE3KG*-#{YaQG4uvIJ?V_?! zk1HS}HBu>?TB3Dz>leHHf1(CenqO@+vNmS}3CxfLV$2>g1f1nX=g7%O>GQDjy*H2^ z;Af^2S7~bkmUjZndmNwFzWNIC(if0}vRu{7L>g(ctW~{{qJFA(hsS~{}B3C&=q$_}S^yd0i4HSQE(uI~c0SrX zuk~C{1kVgYw}e09>x`E$Yjq2Je_#L(<|QE)n;7nK#v_-EvcN1OS4^aNk;PbLOFBbW zg}A`z=9?&=B_r8*;VfqC+>W@6`FQKw{d0~AQ>o@G5Zp>0> zfdeVpn$7BnFr0u!;KnSaHs25kFm3j7dErRAO8&kaHA z`}?EiZT;}sAN!!)qeBt#@<{Y=It#P={D`e-Cy~3KADgKs6J4txb*90Rs;JKJMlU74 zF-pN2j!1t-$B<}Elr{aN6xm>gUl@hyLiNXbrazL(C}Vz*ehh)kteMl1m6cU-zLL!4 z3cvrIMya>x*8v$zA``)@eb$n8ukNy-2D)a{MXyCyqtD`6=(&(UAjuC+M!DmQ$qsYA zQA82}1Hna9Isp(Fx4?mPPT~lN1P~&U-3Ul(@Y`F_f9W0QyYyD{$h-mF(yyW2jTpG% zcJ#=&37wL!M$bic(SP~%=$>&s`Yrtf0n^p!l3EL0)9ax3q8s@B8iJt!w&5W3S$-{g zEvbdh9Hew!IXy>|T#U>tpU)drUYL5!>V0!<|eaKtdJ z6<|fc<@XL`Oavr;)#y--qEro^KqmJLLPEa47jL|dkmp}S)N{`w`h}+u{^Aqp`0^8I z_va_k_LZke&m#Dx7ZCcwpGhwxUvdls$!{1iIA^%B~?`XX9C|126l z^*ADezrcbYGuhEgN$_HWRyS9`GRfneMCuhoLG%8fs6mzHR~y3&$sh_!OAKk(-h8uS zrGSk1Jg{#&P7dsiWlubeL;@KdvtjK_?Ld;R7rqVh#=fvNz>aNJU##M@xt17@7@d~# zn)!=UEa5$DgUhk`_(Wvx?1pLUTjHDV-(m;+I7f?rU}sy4BS$~PCa`mz>OjvqKIlB% z2a%KcoS;qiY9ToFDs=t+UiAI`DU9FH0GYdDu<6KX9L>%|ZrKjjpi^Xg+O3u#KvjzI zv6hlsvA95s98(+5@$M|6Du6ACf)#avo!xo)NZhjn{ggY{s96zH^IHbqfswu6nd=9K*Hgj*jb#*`fSx=Z767_PM8;^<`jO~N(n__kt9jc za%&@Hpqmmhc?%%$W0QBfXN;7o<(m7sNRoP3@ztG`OujJ!70JSs8UZ9@h%+wi&Bsrv z2e4q^Dty~wHafrbHQL2vr2Df@TV^$MU05CQnL*~bf!IYJh+j$|lxa=xMy7b7?Ubr$H1sOG)8ksa z(e)}c999G2Gi&3E@l{ZNaCLk-DhQ!71JG`Ab-dT77G8_5g%A7GMZ57e@!2=kQ2)zn z_<;5ehg3(4vA$?J(jV{luZcH%1>)mjo@hUtaZYF4lYJ1Hq=R7njE+o5B7sJ76(fb! zRto|iQK=S)sURmfxfIA~+Q}xDcckABkSSn86OdsCqVrNTM#wHL!kR7XvFZEov3lQBJbul(AX8cL(7ca(I+Kbka^iKC{7G|2Oo_{Wk zf0ouSrr%2zV9he-+wwH5Uy+H`3sSIQ;Xv1gmw1F|Eb5&<;Iwo~@+OtDt zqpsH?tHJ*hHK@}3>qgm2QW=zxJ7pIaBCAw~6KL%WS#dEL(@#I)Y|lPOf9PRM@b|}b zPfsLydSkx3ClcJeFvZ&!a~`=Hr@k8k96ez1T={93vB+ZDhWQ#6E18HE{hnbshX^RP z;7IX8Y`riMiw^h3>>V92aZ?jaTwf0pR{a%YQ~!)9X|G~x@?S7H{Y}hV+X&OQx5C)X zUm)>FPkev=I~*)uNMEQE ztdYNAu5=?_BG!D2@n3QLAii0%7%iraz?1zVaASOP1VuN1N92d_jH-u#PM_fBey#E9 z#6F1oJ_)mr?8N$jJcS3T+aSSo6?m_LQF7Vwxl;i_Qp8tAj*qnW0T;& zpn!n`d}Tow3(UyYvQbhih#%^}N*hSYKV^UU5#aE$6Ie206~+e7Mf9s9(dMb)`1BzH zntOYp{=MDN=#gFsd*@q>iCc>0Q}*M)y3@!$!uYEA{YDtRF?iEF&dV>0{b^cI}SA0|#O6?mhJUQX>FU31lt>GNEMl z!AUxW+8<#_-e@$^3r~eOa040fU5y?1Yj+2l4R@gaAO|{3^+fYg4m2886YqUl6HP`{ zMTc2IXf@3fU(DkB1Tyjr4`}1L#@~40`A7$D`PhM~uQ>2G+th*Q!#xRnyzokA2X5nYZMwOul>_w{C++VQ zq^4zyfBz|?3PmqW{kzhPCaz@|$5RK7V&{gfII{N;iV9p(=WG!FCr0aeUGhz_EwMXQ z4UbKSU4{ZOyKI(-G#J>`)195+&h%B9-^M6=MFjb!rNw0bf-jn4VGAifhtgd?AuFaQ zGOoK9^L*-Hs#_Jz@T-o@TkpWqJ0HNTs#jyMR~0O4R1Z0;GRXDMks*n(@@K>{VyBV~ zh?!XoP4?RA-)#49Ld+!z)Es1}+i(`^a2jh#8*rv{EeZoUoOJh7VJPNHc zCu01;jaZX&9!HqJlJXd(-V&YW%(Rz~!AnX^hF(_0dM_};_F;gB{+wj%r>Irfxyc;l zf7#dyEn%-A^wiNgs~HG=9JcyDeZjsGxXnUOhy^{*MN+@ zA)Ypl^F~CvAKJ`uBe1E0I2{a`ay335?TwcRLSBh-N3)^6_^^i$?r7-1XWw|?^-d04 z{iXwf&%5Ei&)o4wcQ?G)$qmnSaiIAmH^gREL8pb)(P3s4w4UgTj|Y0;(RL2J8t0Ds z1A_2eup90naCwwqf#%;PDTr0<`=bxqzDA2ar+aFe9B( z@=P`yl7yWXXs-o?rV**qn8VZ9yhQ4V$zaVY4)q!uPDyI20SE0W#GzLJnZ0pna&mH! zI6oP!Ten4v7A-Mr)*PI_kcHg*d^5sS<2PH8GhHHmYwUP6&&&f?fBzLSqGsjgr9Ey1 zl@ykuAioI3Me6WqXAc`W$|_*v6_61NEiu$oX!TnLPXA2oy z7VCfoRxSrI*18$b5tXs@$dQxd`Uhr zAER1yeca!-JzC8B7UTD=$GW_8IKoJtXPDX>SzU|zAx*vre2BG`6f<8q08o@owCTn* zH|_8xZL!X0QUv9~B%Wj-3`zY1+g1U~Rc+Jwr>p!{XbM%|(y8*|IItu01Sa=dh)y4U zi&oDLK=X(DqS=G}(fHoJ`1GM(X!TSdbg4fYbG}@GeJf9)=mbkHm;PxPxFTp3D9Q?1 z&bj$0%qt*9R((((bW!g|RH`fEsUj(5zq@$h67=fU8)?bu$jR0OpcP+R3S-lMw{ccJ zl2zJP_E!{w>GMeHM}G#$xNe9i9hvZSofxmxI$nrL3qa@8>(FMLrga=>_Eiv~rr(N| zU)ROc1Q0qv^5rN8-s%*HkNecc^PvPC!S48cVi1B8s~{}Z7vaf%h+9w--4ROS`<_&fB! z2V_|Ji}Ui>5ov36tK+ac4{eKWPPsK5pVh$Cftitv8jk9m`UbUk-s_zXjk}Vlz}X3F z2Kvl}Gnkt)7tOzDj*lCEjDcSd#Ks*PaWd;9@`@!)C!pgu+No9FiFALtpZ^+Jd1use(PLK zW4M~l*(~{hse2@C@+OIgHeS0pF+$S7fo)MlyukPTwt%4O_z^6Li9_dG|9~;iK8wQw zGiOhrJof_1b1o2rss5^NIjf5SD`fWqK}KhT?B9T6dMXF1pQ>J_im8qBTavjqv604B zp=lSYm*mk-A{-+rES(}AcYo9uMt!-3`<#$J8r{|MC9hu;d7IU{HR8&WYz z(;w?rZ$PmQvt--^Vk&{m-vXIv0vK)Suf0?x z$D?U#NLeG>xqV4Ew@mNa&k0EYm7vJUtHf_iJ5r6Go4KK#I zquun{=(_xRgr!wMs~KeA3I6E3pe{ZgTNQuq>_CGdUWlH1EgB98z#B1Mc)xpfJk#DA zuf{phZlXV0(cL2iN^Qs0L6^k)&~$K3bR2g-nh(7NPj_(OrC3k28eapicXQwsh95k; zCILnuf|ETFl4|Mq#4YqTipQZ$gFwbFOJy|8WKA{w4+0rBmm)IkVvV<~PC&Rtouz4D zrqWns?Q0@&v-It)My^*%i24g_O^rmOSI$rSO^Bq~pq~KCaWa|oCFzLh6oJp$e1;wa zdSKzog*cOIiEPDG)KQzgD*kQhA#*CBpVCQEwiBS}@VjCTmDL%k<1J94g*5V5ct8)W}Rj-Z3Z@!81Q>GA1okBSoW4Te5Ek|xX z{VXPE(o{`pHm^DcT57$DkGQn1cHEd|{;3|CXxdc9mO&6yRK`J%1_+F$pn*tIkereN zGUI%dO8i6jjHLN4uecZ|*~e_kJBz6YHlbtsR6IQ_4t3+3p-T8i@CmPnDpB=OJ^B;e z5Zx5d4~Rr)+GI>QycIu|UBF(Z^%T8RY;8Os@M1Rsku$oc*@#RZMzTPHT*y|y%?2_A zdIWM>K3`VC-i+=9ywt`_TciseNsz-d=M>S6(Q~0c3|LF>i_e$f{LWnbIAtG3hNdF+ zov~>3Vv^;W?;eSjX1i7LlNRx6AiU(Wj8afSQ2eT zR^hXJN(g2IWJ)vz(LQFSu^Y6wdT!Uu!B@qDZUpML9(kQsrfKY&1}la3*9!((kM zy_;qu-SKj~124w9nJJ{$c{k$I;Q@H7lNTQN)B_KHAvfM=IX)0~w{W2G$m$45sLgl> zLW;@}>E4LU&;gj*e!o4@R7%B4oCgDEKE%s3K+3ISi~??&LlB> z)mgJ@g#~XQG(m+(CrTSeB{yV#MFcid3I~A-)@?w>U*5vJtFOZhFF%a+^F{ifUqtTQ z>5R__({2@39yxmCsrxGWB1?@Rfh2={QN* zD==dN8m5{~?F6X-N%BDwSkRRom@MXp%3lfLius{{ji%j=BwFP|4;7a2hGkK3rW9xP zWn;&JlSm%28hx8h!WYlz9lTWNcvb-(^^EPBMKp z@2phlzf0k&Kvf1b7LaK}AXD{{<=3If4nsOqsAHl7v1G)pCpz#9LCbwj9C(5t;{EO( z_~M%&)a&g)+c5!nA>0l3Hgn)6GU^w?Ji{zJnI7n#Sqsr~YZ-~oLoFTVjHcETNRtU@h7znu=S7>{B~~%J`aa&yfd}aBuYDZo zFvA_6jB>+ky&Pyi`znMn{t@Xuh+5!@hy~V3_d2=WDE*pq)dWPGz(Q98LPWL#uvRi% z1SEe0Vnn|`Afrkz(W=Ev3wYH&3#O9T!yZGdJcgNTE}tVZvR#eG@<>`yVU^wp89g3*?X8#>2z!Njo>@zd6w{J=P~ zjP5TB=btBjEcvzO#Fft+1&R?AFi)jGna!)UB8DBN9gg~2=D(t<&RYz_+=z7V8n;Sw z(I{Wkk=q@gxi^0m#bNq+o1A%h@x2~+M+QdD0-Vjk**U4mtk(piuD%)HdR4&`A3sdK zswTc~_C9idNG6v)$^yzY`V59Ki9wOfU?7`*<;t&$04$=FE14kqPdX@;WYgNq)|z54 zFO7d{qndic`3u0DL@a#tNn`|7L#o3KGu<4RQmY!4eDF3(mn=m2X=?*MCBy6o$E2BQ zVU74ns!D3=8j@%NQ`_KKV1~AK9G&SfZAtZ5`J%*`e!+S#w^CHq(E<5%Y*VhDX>Sf& zq#K2=@XpeYo%uP)Jbnu>84{pPuVoh&ZQ8R5tRAFI}vPZXynn?GGy0a=6GLbe3Qy(ZWqbvIcdTNp=qC=B+ zylP6z8m#eCd1#ZoV76r)%ESJZ$FTIf%^1}o6_GE0i>7z>L*rWp;4igCSZJ7w2Q~;sxm3IUY-vEJk*=rUVrMr9gq} zO1Fv|?d|Dl3&_ZwE79Kkzes=2$hE0=h7{JNe*LZad++|SvBD#uWQJN-%dWy-rCSAJ z(5b#~0-64j$W%xBv9-)5b=In-i%dH_*&Wf^jE+E}?Zm2RHM$nsjJ*aSldnPatg8_- zyB0#HR>7ZR9e9OQe^4MgPOFQE#9H`bnh(C1>w%6bZivXx6ps%g=lddLUKNDS^FuWK zj-y?CN>zl+sE(Fnsvu;hb_4b_M~ZZu>xS4=hCSa4T{1k-cB%tkObj5<2_%To&b^-K zFvpGHs4BuzY7#I6Fbu7@(sFMCj&uveM4J6#bgwkI01yL0XeR)|?{qGku9D6u4-6o= zoSgQWeluXk_+g!(Z~V}E``gQbOvVj(h(M-ew`SOX`(Q?)Em3? z8=|FJH5zFm=2krwB(;>!-cq7ZmJb@UXzU;aI&jGux|vGM2> z(-~7IPR9Pd2h2&nu5OLag2@*Vt&~0L0M+a1*|t+yhUm`pjIkTA@5hto zJL8}2H?R5mc^LK0H|XA@8@6uSib4V#OW|JwqI{H=sLU9DCS2uel!Qr^gh}>Jk4ToJ zM`eAn*q8(6zeN}CWN+0()ew;+cJ{seROVQYE#M?DrSSCL@>xdtbqP7&TtfUOQd3dQ zw-nzkIibj|p~jK&*iI77sdHx#*Dn}vw!aD;#?&RCAdu0asAAF!$e7bT5tZSC@Dv|J zBv&z;*>z643SAdmV{~1j={`QA8X{AC(P*?AK9#a~CE%7r; zy2G_W9f3>S0)KQ~sMSzj2%SqNpX80s8G-1wFo^#8A&%cf6AZ*=xTD*$0E7|LXlLLE zUVAOCj_ymU@!r!&k2)`|g3gO-5kv&he}XWAi3qckuN%WB2ut@tEP~W!0UFsx7Vq|LX=9w)| zoue}!U5%bBQgfwSXWVSkv$@qjIds|^sx*IVlu?EukyVzG%UC_68OVuwiga%}L@^;U z4{i6M8KeSoK5au_=5S6P!m$b8Va3zWV2*zP#(H?*n`%Lr_|W}W6CQ%{bwBb0f}Ij} z^87~3x}u0pp^4N13lz{lF(6ZbdjB)zG^_#qU2JQj3J1KXP6;rV9Xf*Ss3q7J0a1frmGyIlM5b=2bWn5rf<{YfzTOc#0b{X#&srCD~*Z+ArGFI1`4&fE1SE zEV9C@Altaw*-<0e@pSr7;hT({*v9@$?^Oii-O3r2%jWznjM}jpty8Dq$q}7#eXlPN z(4{Fn;v2vb^AX%5KSGVzCU|T}6oS*HV)mZxSWmEdlm)1%EBT|bgr!%+kemS-fXVVG zVO=O zcnqg7s|Z8-4Z)y+gR%F(ep)#}g%p*`ve|D*ie@o=L0_ZXO|rlYhnZU9Z9rNP%Ux19 zK?J+nTP1HL$cnW7TcmQde6>J~RILS?L{7A2>No$Cw+5^dfCylj5R_3)C&rD-{bi&! zBht81Kuj=L3gtFg;K>=Dyj6aSXil9KkO{+E?dqb#=xYgNsv9691|6m;CNkzwGUni9 zEyorp2|#d?7eeNfVQ2W6gIU`qk)dlUCzAkx0HkBG2ZH%sINgWq1bKp>m~=mc5oGA- zf|v|nBT0$UW_#)0Wbp2Yk$W?RMSDqak}U~_079olz6O98;6X4Dvp{>oc$?Kp+F&m> zgFq)ye){t}PhKTiA&^Lx-iy2OQ^yrV=^QnNW&EPwQ34|7D(Q<3nWgwjnk)7A;%0M6X`GFmvWiY}&L5=g*&Kho}b2w#ClQ-XdJa zjH-EW&sA#&PWxS@`41S=;j!a0Oo^SK%7=F964f1RHHxr}=?uj^*{kRCs?!6c<541T za{M69&zXT~_uqp_e*TzDkTBZE3o{BN3gf)r^u{T6KS3fEFmo;pviQ&V-A7LC{JIEx%)n>>)9Ix zdk-+K{Fv3;T79TJYQzM^s1)Jf-dH1di~h#2jI?5lId4wh-pM%4J+TWR=~MCI$nLnK zUq{sK*$P2jo5MG{A$&sXp=NkP{HbRsTFxAU@3ySL%Co1ix2O;&Sr}O?2sKX?fyzbz z#^|^(Y>|#DC^F2~0yx&Rj0I}M!bJiDIx4_OG3W;`R`JnqzH*svvq<9`1ENR@(`2iN z-AU02V8i@VnAT$>x;LDI&!71U%^&HH&mJCtW)Jj6)BAg%$pc-{r@>^T4A_L-ndgvm zumC4EpT)4=qcLmBd>lJ=n(<(K2u{kh#9o`~u^c4{lQhO`r00yQ(xkytnfBr-As`^A zx60iraf_5r-3ci0BmKFMsnhaDQkHVH9vjf8J}YyTcsaJyYGs5aoe??9+J#)}fK3<6 zz>2#8GfF4J5U9Bn$QTD!X46;_nGg%ee0Lq<2xN5HwUIiAnG+C5S0*CO2c4EyL)_vZ zGd&bRfD*fiz(y;A=)S!HGi2nM){zD}Xfk*{frO+hnL*~L03F~Mp2F`I_%jS|gwS6d z&KSQ$XCO%u!ti9raAW9~bXufzEW6l6ZiriAferaD@DP>ZPSE9ruoMrplMW8SQS3qj z3F*ct&Z*kF#*_B$=$N21I2acn0wga28(+j__#>8S(b-ZuZz)y>S~C8TI{8`vgkcz| zjEK+X3^sun=e+?kPB#X~7>SI4j4z46j&=sf@EZeUm_9SLWPnT~>^p94%&21dN2U_U z{0B^KZZ7ikInq#LVh1PSVK=h8Jc-(YBS(&4)TmKt-MTe`gM%?<%owa+zuqVfyKWV3 ze*|-tHm-KA_Lb(}W0a*fsXNqWf;sGfwY{9tFHt`zjNt?_hS90BWQSjNcsI@s zAA;oD@5T(@089_6fv9z)SECE1J*7==GmjzS6YM%WaPQ>i)E`7mSTqjv0Bhj zz=4NRCNLcuQ|IxuY+-yfX#kqnBY+Y%;oa7=e{( zTakTMWkx>~GXj{h@_ZDQ<|DtP0EGq!I>Tpp8kbq&(!wZ5@qzhaO*sj`ND^mq#7T4~ zzwNY=3{KH=MJA}hs8lSnzNfvuvq_Kkw+vgWGX+u&U3_sV*=>XIH+d_kx|*N;o@Bq2 zbW>Xh(44e&WZKt3yD`_8sUq#bDG_?~&FcPVAp7>s%ByK5z5rKeoZ6X&D=^cecV#(FwD608t9zLw9c!I$T&uu$l-|Gn>gMI0c!w!c{WCZ0d`)1w z>iJg~eXanq@{qUu2aI|0d5o=H7jvsrL4t=QF%Beo`{4Tr?#JP<5F8#d7-thwP;%(F zC2~?E#p#NjE0g{mar!6C<#qn@dap+_WmdrU!!&9StNaTrvHW5KNOlm=Ox?2)t>=%& zLxUqxyGwI;M}3T-&dpFQrZK9t{Q%d8Ho>0Gm>~%lT7-n zsH&t2oFPw@F!NG1oPHS)W1yb(olSbQN%1o`^2iyXzajZ0KlNVe;l+GQa{ewxNS1u5 zQ_gjE72lmacM`E*wkD9NiMHR>VYyc|Kt>=&r%1<&NzZqnbA~@c2uNOvap2Yl4&2e$ zfj7H(A#6rX#LTOU-ivM}-9ms+2c1%CqHB6BbV{v(*yL*HLf|9t({*uOyv%Q&iguvM zSTA&5R1-Z{UW2YnYcQ+;bm28Fvl==rtU(Y&K$TjR_caL&suM+||f|C)+si z`AA=MOSuIdCRM@5gB@t}HPf3|1zj?#ASOkC%pz;0(&gj|WNa`a9T`c1_+CKJ1<1q@ z$n;IW9*=0%QnycV;Mh)#^UDmpkPka4~0$ow;B&KNzKVZ(-@ zRjXEL*RGwJcDisuliTd1T#nV3vHi1+{rq!OX?~qi4yx}}|1Fa0pw@$FOEv8mD{-~v zmM-H(+jEo0T|=(K;qNSc0dsjhznqjdGm2N?Z3+fL)4CMikbv9HKRYlANsVz zo6`oO&(@__Qg#+BJ)>Nl!}2b+HF&l4u{NkvxZ;s~6d*90;W0ebA4N@Z6DCkpq$Q%0 zl0*VKMnk2<0$)Z7V)1!PBBLy~8MCH$N~POE25!qhE{CXe+%z5CrFl(#dZtNEKORKbu5Yr0?x-l`lr<;|!ZtPIvlPfJdaMEwvdt z!iucGi$1#OufnOwFGH^HY~r`JMCSY{7a&ucj5yGehKNZMz(ggup<8-Qbe>-qZ+COY zJp?e?0PpokFMQawCK~m<3U5aH;+DU<&d54X=0iqQn1|w`T;vqw8ivQNxq?)K)YqEuourOlUHU)K z-v6kgn8K2yfNlqTN~ebJ23g~TX1yTFyQn-#+m73 z9WN;&oGaC?ymno){QLEh`u{gSSN}yOqYP&xiP;+@%J}9NqqK+sjE`nN8amv;a#(Qo zD2D7FYkx%o51u}#q=#j9pbWKnq zKq;alyJ85?uxjO68=GXy}gbkyD?aSwfm$y)5b(GI4>t6| z$6c;P{ceB2o$osE>}NiBtce595ac}G%z+nMJMea-J6;KP#|!QJ@u#NVc)E=n9+Vpb zlD~vI@KUe`o@?iW=i61~)dTNzs)CPuRYmLL6)R#YWqHV1nT`!D8X@uex|ro~V4lMbbF0y10gm#&KXVM@cKnDA z$>Z_dSFyN0wz*lh?H%zU{3AX>?YJhmqepAJ{B>u9Bu&KBUF)&6I15_wEPqrsh676i z#LO{*0+H&Eu6(8FDa%yeV$He=46A0D11-&RbooI?a_FpkIvci-ewP+k>}@6V(BIKQ_O!+4ZyiY|+>WSa8M=HmF_)5ytU=`$RG7?r;P9nQ3As>p(B ztS{OaM@Lvlf?~&wWXgqZ#;miJoYIA4PjpHN zLeB*^;^P4xxVxbPPqYfcXM^uX#JES%pvMjP(lBzOF!gAdvbzX>6uZovx#J|A@n#Je$mc!|K|jSyeF z8|{myKXc&b*W7T+>pr;sErJh%fIq(Oz#m@s#*Hs~;rc%-3}1ZEDG2v69`AJZLgci% z=sN!z#3xoq{CsO8y}0@Q=$a9PhQl0qzgKlU+cwaEs`t7PxJ?0ZVMMJFgZ=4@Od%7_ER}9@(psES(wcQ{zLbf`}A9vn1Up|MD80QU$RI z0qC1@FCKZ<1HoOI;qX!C#<40F7SG=^l|be0(woO`JHwSdW)MWPQ1PjuYV$W}M5jaBC#*t=WD80$yy}*n* zZo3aQ;W+PQXLs!4FM9QB3~LCPg~AlaA_I`8IlRv%Q=U8q3!nNEMlu~E>(<2FX7y3F zX$|8~c5eWTwzAYlbpi#<0)6`*G?a?fJw&b5e6pN7{*_Q2ge+u^FnPf$Iw0jh-8gI9-lQ7fh~o*WT}&(p@^ zn;omL^wc37E!UQS&T6835ebaQQdd3mrQ&6WXP2q@hH*BEtB5|&B3}=dtfihlwhMG z$|L~`17eKK$~uqAoCd4}nlxGNw1nF_^d*PUJWD#qvdQ9?`khBs`B_{jKSer9+rzXw zL>O~`b?*?r(Q%@u=-oL|HdCz{DJ?cDAFO5L%qQAfQ&P-`%Yh6*xlRw4IeG33flPb6 z(e7%r9diSs=UGS?qCX+)Chb*E?;+THVx2cG@38rpnyJ(~BghDVyZ;W5Uq=@5TJOs$H@nE~jO3oP&nBfR!Au}2fD}X^QytOss-jQI{dnX(PlRY{>DVrofL(b= zf5%h;ng4*fyo1$MAm;xU$k>t=+pJo(3WEj>LVSEYdiLyzY15{erQ3%N9Wnq)M(*wJ zT>W!>zMNc*zPz7{_=YKW55RN#CTN6z$<-`Rt0fffM)jWHz|$SWnJF&(Xw7!SK) zn`n?+nI0d1m7%Znvj_zx`Mk2TH*+oYy`TU^i!!j`{dX|c&kqx-Rl~&Ro<;G(Os3Vwk9PkttJc5m@&NGnS7>WWv&4R`bG>^ z<9tg>v!7ol?c0XFOOsG*YJ? zT50N2QbMwBCPKnOCcy$Dyp|jQwk94x^1$ygtmRz9zWg29JvIbQ?(2#M_eJC52g1?p z>3DQ&{4HkmS&oefM{sT%>!voGJ^_sDm4MIRkH)a>)3AHvG0ShIgK5wnTBckWSXsH2 zb?ZP)UA2-^QWGnU0vVFM6f=j52uQNA9jA(xVSi3CHlLq@wP(lUhm)hQ{O~X=Junzc z_YcIfLxZvM@KF44WH>gS8i%c?r(xIGL>$gphI1uboZ#l90Yk;~Q760G2WILjvLrT) zpUE`cvu4np5^&<&NyHE8fVVqdhqm9{h?wMS5s^wDK<2D7mc*<>=JT53i+V!|9$GqZ zM>7W=@8G~Iog8?-j{_g{B>)(~_x&7b@|6QEM>@>?%aIN|M|XFB=)ip+5x@up1v~J< z7rg)6fj<*SXe#QCcO7^;$`d_i--FM-^uvP<2rxPj0F1dFZHCpss~si9ap2?5{s;)-#hSnh$ou%t$}vKug1Hb-0>X!d#bGiZ*_6tBZlAfYl4dz9_W%rK$A>Blje(d zQyFi*e}Hj#q&?$5KvPB6qU8in{J9&y8AGs=;)du2ZYJ#lbT(O1my0CuQn3_U&jd1I zseYsY>zd}nt3_IR9+T{k-syMZPXuZmy4A;llbcuumTc1M;eOdv0-663V;Y(oI~$r9 zs;k+tV+Y2K8)tNAA|fI%dh}>WLUZE838R}M_m=~bpL=$lma?z1yWIZr@PCiS&KH~P zd@#?-3+-@M#Lljy5Cw%g`$zf74-5J3@F`?ZpNI9YypGvbs$jO4J4Tbn{o#774sDIX zHQ$pXva@8{6k`$Za`F?64^5L5V-mA6!*}D5ZzS$6)4kyk6>$?&R*5Khe(@^}{WQL5 z3Y2NFr!oo{{?6?<91@JwYPB%K!yglGx(#Q)9*Od!hZ!|O0<$Tf;zjrJLJ86RuaDHf z#V8tL=4=g&n)B)eF4mRx+m7!qkkTeMN}9?`vV}Egk74)^nP@U`Fdpq6ifg-mih$0I z;1ORRjwphfsCu}rM@zgmu^+nqn1ZAuyRbbc3#UrNwCSfjlX7qY^P6DCoLWsPD`YGM zJXoU=;H=@wdQ?{8Mq+^{Ap=DE_(;I8y@jLcpnjq^sWPqio>h zx;!i$xe24&%|+xJ1JU~V?r8Q@C)9f&5+6PgjYg04MATo$V{-I*tQ&V8Kh4TQuSS#6 z;L&h=`f@ZT_f5yCt&AljA|PByz;Egj>u#}txmH*4UQ?Lb4cMAI(#d*fkz2kGXA4*3 zVE%k;I6EAvyF)Qy?Ryxp@-Ylvb{G0B`~$kDUXLz`*P!dX>(DLXX7oi6-)qb+^$ zRvf{_F z$=y&`y0sZ#SUSOsAwJ6u^D$Ub9DWm%>W03HZo~s0IMBYw2RL|o70ci(tEPqys+_-U zDuK*@iLsfMO=7AQ5(1~$zkk1x%Jk^b1I?Q^H&PmHxR;ZYW2U48YGm|{6p3B+bzDge zT6#CG{$K9Krr)En)28%ap2y0YqM~9H7jgVv!Va%Amz^+~iAJ6I|70SF*16-wMn4Ha6fS) zO&VBWhB4sp*BSXBmS`W^Xr?e2l+nFlJvupzqv7js#WaT}rdGQaN5f)Kwr?+^!BLYL z-Rc{9WJOILT66^%MZ*R$A~9DJSs_q+4n%QQ{Pl{DcJ$4?$oWpvl7b?scU!8Z(uLVr zbOF;3Y({A2G(0sT4p(<=j;s2#gm34D@QkcybZTyh{}j&*j6&NvV=!g+2J9pNJj?QB z&N07Pj>UvpBy05#!{ar-pa{8iBT1bBGlsN;Thgy$0|xZ1z>LA1Bwei<;;a{ZXGpp> zBHgQORljxRvm{l;d1U08F3RDzd&;pfVK0V9O-F}!`x2zEUwNi4nm_&}KDloI>fiY# z+CDx8-QG+<=riA;)nfzD_})0gy*U(%hHpT@ZYwfMhpKUrR&VjXgkct#eRTw0a+t0Y z$SK>66Q#?r@$^_EZH>gJCGVkc(qrg6^N)y`S=%U;YI&}i#z-b<#ZVHT6WtL*1{|B< zkGOd?5IwUFBB$Pf*eQ3S%Zx|SFY#4;yQ~S4_jJO#^W$-MI^vLI4b#L#Wr!T@w4#iTP0X@2OEDFxdAf*KEe{FMXEza_(;RRi4@ z+<wrq>wA4aWVhzM6UxU8OZbj$x z8t6el(m9RsNc88mI{GXn=*wW9BnF||BDzlrKvb$TPK$zg4MgMue`uFsYiDADnw8fg zc2OOKBnKceqdH=j)IeyOrvV*Ni``9{mG(=33n@gzcNP(_Wq2SY-G|?Kk(fp!l_3eh z=$nPsHyv1}vTHxvfj$dw!b2Yu-1M!FgJ;*V?w(`4R0~sW{$*1MWd2Kx80s$p51VXv z=gytOx^?T&uU|jB{r1~v-@ZMTELmdqt&ws4MvPhh+N-McY(^$7ZZ7{ubUB0nJsG9z z=kh>C_N8Uo?5vc`M9QrNC@SNqP5|S;F`OLoEf(DO1ZFw>kVFtOmLMkiq5E*CUk{Y* z+^zzmA8eNNQy@m9CTcMqhAq-Rp&YZKgKvHo$dH_0TCxShuFUtp#>fY;d8>1`4r4R| zARX7to2CysK zBR@u9RDD#7Z-kni8spk7pW?m&A$WasPkg<78J6cC$3fPq)Aaj1D@dMzmBJHql@c%g zHcRnYAM#iSbkz>E7H}kxp`Cz;YQ)8wp|}g=vUZrVDQ0pD44HGgNM?Ga%&A91zf3Js zrOaj6IlLG6$S=p?O?j9)cp1X$k1$~7v&X(dt3Q2<&+q*fZSNV2c6Wb=j`xg0^Ba4i z#jQQj=k3W@F?t6|PtqS%S>~(KqD+)NPa(rCC_l%1+mGDx_1JXbJ52ncDZ0;m5K)t^ zL(KH65I?6j;^);w^t=FsCwW1KGe&Cf60>!`&IoejJ;96s4#7=ik~r zY{fNAJLmeL!)#A{HpzijGv&sYfFgj5-X9?;z6eeA;kUHQq(6%UBHYk=t^*CnInb2f zv}Za)Q~U@({18vjWPpOe1Dob36YVsdRt+KZ`E9a4)8<3+w9>Z3mmtm^9TiV_omtkaCUn4zX< zj7QEyIq3>8R#XJ}RCgIU*5SVaGIqA|R%K!3utjuXl@Cex0x?FXiDjfs3#A(*9HeQV zGX#ByN{X=|`vOL6Ux|+<55he?+MrfcL->V%2yc>KOnuZKsJX4@7kGI@XO4DfAua1L z4$}|m(TMVynFhcR%t&G&W@}A>DGe+U19XcB5?Bum12)k!@l%a3(!z=#0T6+=NRwJp z&Msy->seR57brIES{|tC5!B?IFGMN9Oi@-bj&Cc(((wl|?282meQrG3+&3C+ZXb={ zyCxy#{^^K&a4N#@{1)x+9E_gtkH-%QdysdEabm_4vYD8@5(%pEa1zJLR^$7l-{QNa zjW8hXX>^)*GvWw7x}?+~V5o{NX;lbJd=NHID`314L5d^@(5|wPWZd?WUbDSDDTWMD z%c8Z!S1XF5$#8Y*a(I#(!V`HvuR7vq-i0A4?;&AxCv3Yg3t8A`b>_kubpI+8@3gOpkTC>SWa^z4IuNIwaWgy+lS#0V?qiM{2uYH%E5l*jq&E|6 zo-OdAGmsQFNt9v<7CJAeg7|a-mt+sLquYo@9tdCPiC}$8pcF!&){bDIE#Gxyx*`_S zuO;+rA^l&5v}c}33KC3eOFL0V zO%Z7q;AQ-l{s;3rO&@hkWIi*Fu?wpZED=O9EVJr}>C=j>iqpSU4z$zp2Pz|r{8$DS zN%|9&s8m910AmK?R$Y4xs`-QO2FEGCM+z>0GjdR$79QuE#~+HS7U>qOLRhf@wk3F#qv~adzAY;P5VH zY!S-H49aro4>_Q)i1a%}Vv=I8M(%DiSfPOmQtv9JMH2I}$v_L6#ChoUR~n|8zLkNqug2+EEfVE*W|YcY4}Zm90)i+@kN z{w;>lxVZX9L<@D20stf_%gRbRONRJ~VsBEwXBCZ|-I6Y7lR8Oeq?E10K(*q@+5<*p zYKD>494jfnRx-pHKdnV*@&r6TGzQmqYL0-|`tXf!0JpIBc>f7*>e&j<42?tUIb$%9 zZg;YxNK-?#Ol4rNPAW3(kZqJ?P9s%i68AL#*UEPzsbS1{N4P>DM3OSIrQB@oPoo`= zEcjwAbe7_+^qi!-BE6hq=8@4KVtD-2$_Pd#|3n$iY|6vh?+#(W`$=eb-$(@CI}Rat zjzjp}6A^Lec(l8HI9feC2))}(!_L)A1*29%uvl7}$1o3LXKo^9Z4ANSg|8rH&W(te z7idmvj^e1^fRFj^2usxRW)H-Zp+D66j|#0aJ=6iJ&Ic3vp!V+7rcI%@ZT0uW2yGN4o$^awLjN z_C}nx`%m^{Jlznp$U0HlK0?5xL+K;M5@6_A(j6TqAp2-108l@{R9}G(;eVc_VORh|iLgXx|qBwKzUY;$=V>!;DZ^0%yGbEHNxs zs+a)sqpN&iJ1W)jHE55VBehw;QmUT7OvAG;51VF|E}5vW_0@0U#_ zkohk$Vx+Fj)HVVY0v9%^)3Jeup7o84p0!)BRyqm9^zPl;99B7E#0ay4u)vOO?CY^9|GgWf)iobvbTxTGKv8CPGR;Ntnq}A)6N$-p-HS0kftc;4%gP4Vwj%lpomLfe?U=)5MqI<>1{^{8w`#as!{jV_c zS3pLqkJNn#nB?$AK*p4MVHOU}8;6OH++mcMr+9kcr>GDV@7_TN`i_i_OteHRKg^R7 z@+%|t?=p&pBrqZaWUMSx)(XHVwi06NDi9;Gv)FvAq&UmO=&;Za0U#;cO7T|HOEw8S zl<>n+NqY1h%{cBuQ7r z(UQRk?pWWKm8s8Q4Pe}hSZB32kXECa)jewWw$zG|*`Jz?ZtqS&i+lSa^pP2v7TzZ2@UyBqQ29>dUu zPh!y0JJE094W#SQf8llba>-4!`vV3oxfT5u-GDxs*YJ8R1}wP_0~TL{J`1lxzr}Si zVCl8!OZ(mnu0@{(H=%FlAL#aG^jUlpdM~>k-RZ9D!dmFL^eR4Ig`P{ULa!zCYvm2- zlwJ#8{%{NWuDlW57S={DzW?&a8!_Pfo9OOZ^k6u>>3{cyb#|f59qPzI?}cLmho754XG}AEx(H2)-w7tJr~zOpXGJYe?=X9xuO>OEv=583#+5g zqT2Y9_WhRXsD(P{&u|PeZWrll^yl|B^)uJ2P5K9zYaNS}FN?3^yX(-8aqPF`dh}by zJXrV#^h>`LBbWRcPkj)Gu&&K<v??sD*-~ZgM#J_i=bSlku zJ{I%dNTckuXI(()ie=c^@-xi2`4&v|4K&9Mj0p@v#v8BU*o?^>&RLyznNbX8ev$!| z6_;=jO@?9oCJWJfjiAX+ETaDkQ^7dNJUXpZDk9y>-bBy5q>Zk6{uM?*MoPX?AQi8d z5U5BCP{c2d-=#RVHVw1?`V{8+xnZt{8@_-4UF3ehiX2iSd3HVg$n3)*(UT-c&OH1- zH_9F+!t5iXt24XoJhi1Ux|%H2OOw&oy?M`P8wXYR;NRgx1h%h-x)DwB*uWSxnEEvaZd{7F zhj(Ig;RUk;i~JIv(79eES}L!VK&(fCB^FtIfYNBk-C#FEjH8GzB~dbZP38;!bkBFf z#YRG9HfW^(#Zqi%s48G)*4e!|n9*+unm!hb5C0f}#&`Eb<2!qz!EIg9;=%rC^W+dT zf4nyuJ{^ybUTljw6XxLL$xYaF=sS#E@;*V#t%ykqAV4Ab$n-E%8k#~8Nh%PYAqj&8 zRx~xEgApZ7ke-PSQjAEqraA;@%nBIV=|pKGp)jXRTdQKsL5d{lbwn(XG>71Z*VqMK zh?rLeVbiWb&v{Q{>gtZzczgzOOLq~{9Yt}uN~sJdPoGD8k1lxpwHxqU!#enDXkEM= zQ4?>31>x=RK)f9ifVV;e@lI$}-Us2;_Eqp|J3qY9(I0Pz@m;VVUhU{Z_r7#r1+Rxx z!E1c?hQ14_iq|^^(ro}<5BA6Fp>pSmx59i3y&gj9=tuVfc)5)i-jA-1_oA!v*&DA0 z`_O-WYr^!$JCT9L?>EBy@Fv50J(%%mPdk45c34&XHM|=B(vI&#{pmO37D9I+zWknH z1$*M{j$TZgAO5QEY4=8m7ya{OocJ!>8-I;pnnHc?S_dDzDL+VW%Kate`?tif4B5|& z=vxe^|T+&H{X1N%*;%)0!rV=*peO@ zeXsEU<3>?&C70Vv>F?RN*eh-Jt!Qa@6we#U~Ho zo6RfmMZ!2dGb9c-bZUvf$VTvvYyjWrMyL|m5V!XW#v9}MB4)`Pb6Dl(tTQ-H5F>q@ zeAc5vDF8DZ`72@!F0C7~sF*Wzk^mPkB6SN!@!WZDWsn~DAq!Re1WBpbAR+!8+;SY> zbeV<7`h(Hyvx(^4dR5^<54k1qiLrY0-;W+)et@FTEtAg3uBjlf}c)} zLtgnRCVvNW_B^t4^DutObkzU+9lZ3>BY3sh!+7OWQnLr~#-|VA^`?KqYfYTg_+h-- z_)%UT!|P2*O&=jWhQBm<6mPY7g7g?(ZTc{uAHf^VAI0mEn2t&u=z*l-I}b7U|Xc594jVd;OD#@mfRr+2}F8e;ltjq~9Nl9>Iq#=|AJ}*Uuip zJB*j^-}vMaULU2u^o#L&v(XdAZ*%_%{b=~O@#me!PvYGsPxJZ=-umPTywUh^#*5)H zZi?fZ&6p9x}>qI)a-E~IqQ{cDY%re9AnAD+a^ zO`gCDjL)l#x9E-Lf5P)`Jc@yXhvLMMldNlOB}Uq)O8LvC63G0Q7#ozxsAJTMX=&)(xidcd>@$oSH41Citikc)#|@CNjlPo~b~qxL zpS%Ah`u{fiM5JVhcz>ytVgF9je*pshtgHRb`p*32xLL$Pa$hz23CFgDJBHfL4s!>l1Ou^)xx@ZAEF>*K0P_he9}sYQt~zWp{!0x}FThGI=QDKA|>j3EVRqGm{+D^9K?JNv!)z?FWLp$E#F62?m#{gJbY ze`(eNnigZHQha7F_KoO+)N5)Z*~=ZH0{n2YUti$B3FFS_pa`H92*~i>MDqXMC>EFJ zrO8K9Mc%1G$x>uhE@Q7p)eV6Vff2LHMQJmPo>zf417w&1(il~KF#y#g)geJuS&59- z^i$blvWm~rh1pe_kD2>7BQ$L)p8cjPuIc_c0^%FPKfV#%LqC9D@CUddrYT4qqR zkH}O4l2n4A6rH3j`yyhGyDm3vl zh#k8(@w$by4O@3?!S&ttPD{t)ty$#&tX6yqWJ9?(VJF#BVq4 z+Cme6VtwF_iECQB*xoZX}4=LHZrV@yS8HkuNxTF+CA&BYR3v}IIxV* zEAi8wpK$&HTN&%4sl;kus>^@JR05g*F=IMbC$N!mmD1>)mT2pc%FjRl98H=uL7zT- z@WT&37#$jWib?KlFr;s7Kka+_y{o>NP0t%sJv5MImQ?1 z7Y-qI#az7bZFk(%>kCwk{RDyWpCBl%5rQHcqITpbxT||R)SEH{gUP_Y&&$R^=6N>r zTYeZ}in5-5+N5|{x;<={tos^}*aIDFI!W*7NYd95whz-@Ex)uJUn`r6RVU~~GfaxV zR^S;&wnK(f#s*YUtQww;v*nwx>g+cdvGijCn0pa1>ng-12cXjeZv!ecU1XLfi_$zu zUIwICD`5yaXm3tVc9IlCBUAW3*_WhqdI)&v&XB-Ksyj&v!vsObAA%dLa!S+c8cQ)Z z#%!<8XZfcvQshq%0ZmPWPrn+YSG|QD7rtfux3Or>BVW>}ibB0;q(xT10gGuEOt|#I zq+etD8UELmupc>jSxCu9M#iFaoIH1eHqyb7g01R3N6u zaiO1ce>u4tJ^#}8KWALui(J1|oRmNI^QFf6!unZpms_WC_3|H>N+9z;W^8a_8&@!5 z0}ufg+3nf0$84_m-h1yMGBVOkIcc|GO-aefz4UGLZ2M~i96j5srfk1$`u{fi#BK*7 zKFdl~-Xe7gR<~g*F1nK5SU`q90+_NwLKXoTltwW?vRj~^!a*TC4TZ^owPt&qQbIftTW==XUP73o}HsVSd)~Up4eZK!*7vAd|~H$flL}oBBugzeIb* z$Xl@rt6qBz(}Vmm!N-C1Z@-AV^i&SR1r+JVFg12!DsRyhVic2~BV&H3U-~t!UM;(WPb`*D7+{gQIabCFkGVzm#FRyGw7@KhW%K!=)1R9zA1IbXg5Yw|~6 z%+~sdn|}`?=3R@J)anEs-Uv-{AS~HomP{KkAu`}YQWXLa0+OEvGFs*<;2|KRE8W`f ztTTVK^jcs>k{kIU0CO>nXr0iU>~8>#{5BwppebCEoD@Gq&8vn!8TTV$XItzqOeAYP z%=Bin=}IESd}6}wJ#mz8R-ebbQ@dtn*(6;f84Un+E}j-uXyxc7dwEs<{?1RC@Y;G z&$_pPj&1)>8M`toioEJG-MRu9{n*V|g884vsz6|aJXTTcU4Tf{XQJ*)CEQB*8^wIFvBj; zj~w!*Lg*~s3-m?ZANxDww-s4FsKYm4&yJt%692+?TIF)4z$1q3wVUl%)B<)Hw%4$t(7Ba8Q=6WP^&K604 zS`xzZ%*;cjh1gb{gSmS)Au3@aUL6>RJEB{lc1QyRbo>bZ5e-l^t|_WUHpJciJED2Y zSd2Nm3F}yLTJ3a>1)wlk)r2qzMj5ctePS8s5=cvrOXbDzt^H|O$OJK3y=2s+^cici zBo5YlXEl*~wPS)FGes&erihcVm*6D!=ci-*hUVy;_5j*Xy9(htZFxZufs7Y|6D=SU zzlh+20K<}~NRr}3(lTs<5hn-{*oa8?CD^D!vJM&)=rGer0zP~nsU^k+06Fc9M90nS zcVeVH@}C)GgI%xlpv`Dvu>?1Ix+&9on9dL&;Zh%4ZK z=AZJ?fI#MfNC3s|&+_u5d|hf*iRwV#!Gi~5!-frJfM^>@!d#y#&95_+K<0nksPWkV z!`7eCvn^$jk)2M~-n@A;CQX`T^k}+v?P`ud&`I0^Jg!FH$uD~v%9ZS}Y#?J_|Dll+ zlAP*RK;|OR4=1sAp@oR9?5p|6`cSV;KTZ2Q#-pH=9l1uuV$hN{ux~ME-AEs%gdpbV zE^O--i_FKLz}%qPnBu5{slIhE|K2BXwATQXY}iO{LlBcg5R*%`Q>-Hkq=acHUs^f` z^w$XhOc)hfl}@q~btM?Z!x=B#+EOZ&li_M&f=bKbQ^@;rAZFZpBc@gL#&=bHuroRa z*n5~2#&WN`l^>!?^S4I%qAH=2WKJ_v&$4oeU7Bjbx|y3(fTDa!?W`<6TT+BwIa$a& zwjYDmF2qNZ2IG&NTcTQ612g61-=zrxyEjLjUM+F&z%YC`WiSS=TZkX>Pk}Ym021lJ zRMbBKYFe1-B-TNNo6j;U(v)Bc+XdUNHssU9il#^uGb6DP6F1+IR97?&C1qzL{!swg z$S&E4rTYhsz70$DM`)__ zU3BkF@{+8jGjHBJa|D78s+1nh!i5Wwm8CA(GPYkf zpt1e6uddm&;0!#XFt(oX@L~g|QBo z6cIc~ftXod#QfA0s3s;(kTw-%BlYBdjNG;gU(ERqkMs$_RZ)!)5b-hmBR@t!bOT%! z-xRm^ZHG6<^+o6937BeJOOWQW~l7}q_k}GXlPf+_!O~T zYbmyXkEz3IFJ>EDU0ES?FMGNv!2$eqZYsvEtdFQUHy}EtIVKCVpz7{_Oos5cYn|5t-esxS8Q~Z zojx<4+9XFd$&o9$+AA5ZBr&@HjC6mrI!V(>Ti0P%muSqn^(M@&5`d{5J_Ip=NPG4r zoE$X{IK(tchd@iRO+H%8UgCJBh@LV^0!e1%%Li9-#z|nIA`MrNvEyV`b1_ZY=FY6? z(()xSGUZuz5sH3XgUovGVQP@SIa6xsb1&fRtVC9hT$JW%(|0SWS6K3{7^8f#z@ijI zr7cxrK(ILk(nv|HawsV*Cax$UR?wl5WjIf_XZcb)og62vK64Bc)~!Ux#0hxu>rS{K zt~mlj>mi6>#wYq?c!s@?8+x|H%j0?=V##bw+Pwj*vn?r&0F4%-NiRqGP)7QuumxE8 zCs1Wd-#OJ}kdJ9Ie5uupst;!VNsg7GESxG{fs~z*=$>>xA`=K=2p(cGBsC#mAaIc+ zBudMwd6i`5QXnG`BeJA22FTEzIUi_|lL$V{Sv|5hd(C*02xcT%5irpzD7vpWk=cMB ze*&KX0v=z6>26Ia@%zhxOvL;Ebk3-O*u-iGpHdxzQlG|#bHfNWw-Q83ZdSk~6NoS` z?EXx~?$dPqi!F&+wrp8NpXu6ns^7JNjcZ?6Y5sLn31t2Ujokp%pzOwE+lg#D&HLJJ z?8c|-5JxfW?Bu6ybniMkv9Ev6=&d?bjb25%H{a-m zNPWRSNdgZ_f^>bYktL~smSh$v$piAvpltmL?2hP&*|*$;sh)nA;PAwRYPFE@>gzZ$ zZVY>?qYPi2nI-l&q!Bb3fLX4pWy|zWo1vMdtaKpBjKXGe>6RpGCn*V{E5Rrp7X?}@ zAG5-WU=4Xpv%m}!qCPpFBliObus$LbGo>d(AT$4#KjL8TFA4IFqLcv7=+-#>tTaDw zRF8EefPk=at4x4F$5|Bds&>N4s{M;}9D+97Gv_(6B58(Chg2(%C8ZH*`L_0$37$`l0Kmr=C@DJb<@d4^|YKlj{jzNp`@%U!X8Z0_}1UpN_qOF~SjkLy; zJL|KN(rB{)YuZU<+8^t$0Wg|UQhg^lH^lho;tj>2+b4`mk~ z6jKF=v4IRpQ%jM_RS=h61u-c;2%YYM_?g#W?)J}dxM%^>c8uxICB|cU2-MTq{h5rU z)w5^MHXvrvqD7Y|_R84%ajDOf(bc}MG{4SN0-66YqekUQ0wy+C(X+0$ooy~}e0nFh zuJ$t0m07T0fdMp93?4FMh&gq8_wLi zc9)QxIq%g8OZYJAlk#qmlo ziibdq2H6HMni%FW{y9vC^rmR5s=>6DoqFxmXB9aUU7+$tf)Gl zA}u|B0KL=a;Dc{^xUu`^@QeN!j>r$-i24wo@eOc8|2BAY<{dgpC z@|}S(k3i89}L45R&GH;4}|&+Om!_&^0WD z{wGyMWMVBuB?njlNPd$n-51MkXu3Cv;6&#&F-(ySU<}bsgbq4P2|#$VBtnc^BI7mF z4?{AZ#F`V|A-ilZQ+S?LpXFiz{>1^GB-9BB2^cV709LG6Q2}mD+ou~{wQxeZhjyQ5 zQ>FR!rV_~fj~O*8S25?$88t4su^X8UI`pio-AI4QXi94N^5tfy;I?hsnsc3!l9J3+ zl$LAT{_5&VuEy0~Aix}6$4*v1bs*|J&8h(rIj{PE8^rKpNU^j@&xZfiGOm0CiR+^2X(kzZzbuu(Z zu=L!Psu<2<1C3V_x0q@uan(#HswFN?ooB93V=J3RpcRmD`uOu&4dabOuQqp!M8s;#6 ztjp3rk@Qk+Q@TjXWVSUU0W-v0yoBh4)^@#DCKnPo=d(VmUaDT5C#}mlgAr>Mqw&JqqT-}p^rfU;;cl`vOaUa1y`Xk)jr3K#pt~YwGOh($tz1Utvz`{0fOKCI(weG@6 z%-FOV^LDJm_UtnTq!to*nZXR}iS&H4X}dNn8DIVI9>Nj=j3Td@I$B_nk)DvurgToS zm3}RSU4alA#L&*^K8$w3Nj1?i;cA5N8lGGg(W!xmNv(>Q`E?LI?^Z<4xe?Jx)e)WS zg(&SUW2U7Das+5dQVI?eh>?E`_i`X(;^hP~p~;K`?R0QrWTG3Qr(cKU?Ok!Ucnec_ zf_a-`rd-t)WHf-2L|P!mb@7AxN|E|Q*Zxg?>p$v4E6x9(sRT0rW5xytf6v%%YZ>rnyb`9ox1EKfDwR@V&&QLJmg8jP|7a3@B(tv6Y=B6?_)}>>X_!? zi5cGhm{6k*)_mFu1uK6fV#%TBWHcrGM$1jri95p+BQbrN37ijF!BHk4Sj0GK`>SGT z71Kp3p`Day>6GN;Lsx`RJd}?TE?opN8i8^o$$N9ar8C0jh=r{iu=<1dG0QK|OfUWT z$YaR)?mKcd42 zpg#ZTPl#JI8!wLNjJk1+;UDq=YISLfI$fHfYG^%N7u^KUd=-mUb4Fv_uC>_45cpEdJJ#aQJtOhK*WEF7?|QRoUrt#GvJ3M~7&)vPXK@nq4-7;11&<&y!PD&PVgnKz zlo-I^LKct_=x_xx&b?op?xnlZeoigKCf|?#%U;L0EiI66AQCA@FPFNAOnG1STxtG2rV_|h zn%~q2tVr}KJsPcS($ejE_3EKhr%q2jkEK%IdNazxs@qL{#-piEo)6OK4L`3fBr z{^jKrBCoK>th&gi9~u+s9GW~biM)!HM4BkkoWE99tm(o%u$r6E#ex^JukYf(JJbetiL&K1E(;qO? z;fW=;`~k*c3Sakjf25nl5dQ%4Bwk|DEwd4B;3i}Y%q8p%EL<3wC*%*)Y2|?p2 zU!mv9M9j(BkG2bE;g*=sQ8%;!KAJHQ2`7It5}VUSs@s}uEyB+7^%%P)3_a8DM)x#d z#HKh1A})fK3NqkDU`3J_R{$frD2=hm4G}3-5S4fbChls1wYej3xGaf~X%T4&j$POKf#Sd|bUWiW$Kx|SKL??M6I>p^68EcA45*bTTSW3dy)Rh$7@!UH6rqh)Jr3$T1IM-O0&p!v|1QuGN|4ICJ{6*^WYo?&>%f*J&dS!tABk zmFBlMl|ZJ_{6~x$w*bwtW5=*+)hY}cGzd+bHbro7uo=nNig7Xqybv&4RF)%vAe9<% zE?KNbsOm6E=&n#pRHd&|2JObHDWhx=I~pC^m`^HUk1qL#*?qKBij=uP_9+fw&*1p9 z?~wND3j{G$G16CJ*oT>A#>i-K24EQ=!+c}DvlNWI-U}28 z5SHg>V_)xHNWSL*%<%9*QuP}6sbx#xryX>tvJzLlLK1hS8D)#|M&)nnfJLVM^QCH> z;IIXWFOu+yfTmp*wm0@vt1Ol65)Mi!*ywQ4O&%Qy;AioRgT;CH@!T;?-L)PalP2Kd z-W^aQxSj=QBI~1i_{X>|x-lN?+Yv8(*Aulme~xP1K1V>8#<;d;Gqgw=g>`vn&D4|H z+6DgKn4gB>KQuz;d3Dist^=LsISiPI)HF{85v&-p6?$FC31TjzsO0Jx^8Gtlk@q$B zVhY0@gv7len7-i)r0(j0odu~lhZR_KG#Epd-OF%;5IfHoaq~S9o$O}7l$L!UT8T3?||A?ssGL_~xHHI0gV|HoOYUF$O?lqeI+Pb@a`}Ssoy^M?uvwYE> zKep$W&5~v(h%vj4>b;~Q>bTikODa=bT87-xVr0{;=I^r!e9o8T5pP&set8kQ@PZr? zuhR5AdjdO#_QUk2AHvkDYh#+PKPI^OV*VfQ!=cEoC|6YBNtUSHUu!Ah@naFMNCJZ5ZqDz$_nM{P@-zC|S0Ic}*ayvXVcQ=5LM3=*x(9 z$}ZhnQ=t|K(%YnGmP!SfkvArboqm|_NoMn2KIE|Ma!LB8i1n?6;91TkFE~Pwy8gmx z%-XX9(Tiu{#c#UchR&bDKlpukwtX9QIyFP>?w`XE(+D0tTfn1RL%2u1gFAb-MVAGM z*qobVbZE}t6qcPDgTagcg18xh=sMGZZixaiIx@iCZ2K#EX55FUskfoWtiK>(<1p+mScaV?BQa&eYv__t8?kde z5Kj;lLqB6OEWfmYUT8Wg!@7n$!IN=gz>J=~4ZsQ03aJGSbfh0q$$p5ObR%YO?1)2! zD{$!4PRyJ$1A~VQHaao(fXnXV%yhUUvz6vQW-5V9rTI;b7`z&_8o5X!SJ%_D1zfaw zltwn)yLZQzUw&z{{{?hx(X1_zQCD1MkOUd4fJ}h^3Ofvjp>tpIXqUsQ>G0`3zf{Vp zWVuEHbB>e+?q2{+`U^6zhn+xpV}9H__95!5!Cp^HGy02)^PN02}jok zaPRsNf?^uuu^v$v^usdzL}+!IKqhH-5A;rb2%TpKqGzHfx)TJ%rU;b<1j7ZJAD1kP%K$`=@M(ZkCV~0Qla-hXDWeArTI;b-JtDJirvt4ujPog z(H;zQ=gvj9ZrzM@M!RBarPKE9J8+&1vDhp_m7WT_XQGKxt?rCF*)Zg5Oew*N;ho9fqq|N?rryAVwIYh?q3TNe5xYpzDIGq{}5o$0e+(m z$%+V$q^wIwBHf%4iHa2tnFu?r0&;Z=#8`rV!54uRD~3*DTr7oIek4v~bZAVSgG1zD z_x5YD?b>Xcn{C@ouFbYJVX}?QuFbW1HyfM1Y18KRo#*+z`WNP&bG`@HxjynX80Z9C z#<5=-5Ur?`Ea_QjQ4(2r6J?oECK$F})UwA!g!)|gD@R63?o1vnf$BQScdo-1c@5(o z4JM&waua^cVN>ixNAU%l4ZzKR3jxbcB!_D>=2}05*o$5Mmd=0vkM|v%VwdrvW)ux$ zZvrZVB~&S(L#Z_c_44oB@>FX8W)~lf4|;NhoH4{ya(3@j>i05XVIT1jeFvulY)G_T z^xvVSVUj;u>#E9|_~EAZKBXR-I-Uv-G9nTZZQu#SI(>RgvtNCyNR|u1M1$D{LA11B z>@N;p(&gGxG3)4&*ySS?zLa0SIFG0X!D{tiC%#)NHDQ=>qtBKqr8XJ}k;y^fNKxRZ zEG+zPIusAb6{Al9?_9-FhQ@iMmUAI*Dzjoe!B+WENxv@81aN=Wvoim&NXU19g8JTo zfX_ZFUBWk8u2EzIlM@eztXjkKj|eiQVw!ewXxr*?9PS89{A}1<30yKUlC6a*$E~x% z_&z+GNM!ej*OaWS!bghSi`brd5{O$;9O>S<~5*}#WKK633H>3$sx2aohK$?*KM)VFc|XcukAC3MHI7o1nisX{lxz6zoj_C6d9#;{Y!WgrEn zCbYJv7aVU0!pPc{r=(XrzeFs?cQ_VAi2J87X5Lw}Dp4Ec+|tBGENR49%Jr)gqi#X+ z7=P`xOkgR0DWbO}Z0Tvyy_4i=mbkLK(EFq-e6Fo>0)MC2X=QS~#`5@;!JpycxaNwPK}k8l*m(_@^$LmL9NVQ3?-P}FiSz?KEMBM%kNVO&~Z#?qkuWBCUMXzu~H!5cRxQ-)dGR=#@7dlTOX_D z_a09DyDMS&ulS*EAN}${54`5h_dxBH8B`4_c2gEBF~Zk`fuE*=&cPwaw>%%zTw}|U zqkDDYsZcGnO`eE-1|dpthf3?{+G4yiU#pezN;ilVtQi;jem96P0t2ROKZ{9-Rg$fN zs`FP0Uc2RRcgEI6{3Lw9g!|s=CIQ3Bhwn>r9+Wpr~QX`_xk?aLX|p0 zw!jZ(?)HQ$_Aos93NzV`zCrXbX<&RKG#6G*VXXeC_`M|{DasU4seCKHo3QXN+VF}xNl?KJtcTwGeIGpbmgIYS5{nLeS-4u-vB5{@ckq&-`R-Om@NlQgFv zB_BEqi#5@JDPc6V6Ppe*Rp_)lo9Ulm+MfNWgL;M&oO46p;2+x_`gJwF)L4yC`+q~< z@*-GwS5kXqjP*0V)oh56#7aKZ&lpMXrrgd>;gwV_x1gVgM~As-K&^$7GLx7U-^adA zPP@6RV{^Vu4DOv-Fc4Z8FKVbT@-!Nir-){9`W8=ry&En1*9$_R4lkxv#M=#Cj`P^& zb*TU&nSh%_DQUXRQ7I37jN8)M%7g_-z*IQzcMVok4)Vemw^SZuc%T!0-96E*Fvs>XZFk%+%IarlOOzpHC0l|)tlW_y)gP(PtsD@WBRyCnjgOiLU zKq@W#T1tlNG;xSwD3^)-@pk?ElD3c&0XTN^n@Ldt5N@3aKa`a2uY@O{+Q`(Sl=7`k ztZKE4`u?oIw=x(B#V1L|n{Mhzw*}RHWcp0p6PhjNw-g|TG*DY^YJcODV+ZH*L}<=O zMn_s1apbly2&@+zE2uNY(tiJb0i7c+3)B9iV)dWF|73m3CBYg4B|Oz!4o#t@F$2r6 z=qfBc!qhEm;JxC-c22SMW*Y&4iMaP)&N_oW(t>X9@0$N=~Dy=BF1>lUtUW6;h z{3Q$93~_p`{5cbOKj4nL^X-JjmJ9U^2YjbNne*nlkYPSDH8p~@sIC89_+-OmkDt|X zm5DItqRwe5PY|I`*lTo#JOq|4fBa)R2<*DZ`m{0~meXmRJiKKYCe?FVO#}0$`YkrJ zxhbU>9E`Y>Q^)N`Eu4qMt@l({d?Dg)vva+{5cDq=F9vD&d`4-@|Y(Z=%o7(b@i4!H&+I)IQ|dZsb)Pr48+%Q9kU;5?;_VlS+;eQxCf zC*l=+n|#a|<}g+hr!8*<)?2x*+}FS97RFZg1oVCR_PkA=YV5#_3u{%RLH$L!0cl97 z|G&#SP;PT}MkwfS!<>#4E;nIYfZ9pluQ&sw*c98_LNaJ!ZLdZf)#2U@jAsU>nX!_C zm?q0hCQlL$C>6s_iCK08N=jZBgyejlB0{xWMK?Y#&IMwg(Q@H0!yqQp>{D0sTQ9HX z7H33v?o24#8AZmJZLa9iC=f~xzl2tphI$40trECZVZNmADHN`wuINbLGsi9HX#bF) zt`V^eQp_Uy5+mh?Dx1cwJF&)i^Q8y|AM*5n5+S9IMjf6E3Q+kdAQt|VlPnU~yuF>R zD~x!ay8;uuF}QE_;b15QRhhyP8m!Rm!I%O@m3Wa~xK{s2P%y5;8AGaG5J==Y;A&xG zd(b304SZ}pv~*$)qkx|5Z2{!7&J5>#w>-R!vhO+W(~fBuPOFTscR>b6l~pKlIv>QG z=4+B!Kpb`$!w{D(l5B>Bp|ME@5!WV?9{J2CpNLv^h$yI$;%A&{!gmG3Vzb>)WZ7K8 zylm6l2!A#o%G12Ce?uxb^Qn@7B}EazEL6tK(2UrD!y5E0lWKt(nrvIG^r`NLW&IRu zBOr7>ng2M_)Fxp{D52_Wh#95~;T&c0Omw}(iC1o3I5t~`ga9|i#}4Hyy09T4g#Ucc zn}uXJ1F>DCb8k46m1q!tBR&*%;-@g$R(-`P5z?xX8a`v;DANHv1GBjRLOqXHW8Xn= zgrfJ3BV!{LyP;wF0_<1_nQY^GIUbz1^}$}-e!F;; zF0=0ho1ItEtKYt4j|a{SxE4NZfm%SQPH(%^%5}PE2k#;&e-5P>OuJGFk5bZCVd+r^ zMN?}^*<$s_vH(PkHM)?^S(`>rs`1oDzlN61%->1CTxFWIwG;ah>_3Mz{~<{h#@X*@ zEjrnK6-eC`rirmM1t0T=l18wWcgi!6E-%A6;~1Iazr#1avE$oH0?$+lUK;eH zw$-TiohUfNsd$v(A9VrmsIOdCJX_MD`o{5ZRE(S(pMErIlCJe3B%IJ&Z8TXB;t_>m zJ)Bz{4kw$7tMj7X{26jp6N6mJqhG`(NuDJ;hTZ{t0UTXIV%2k@gk*pmda7YIE(^n< zyeG(9~8g!9d_!^t^$GQnwueu zGf-b**?cCKRtJEq!df$O)@HqWt7#45&vN7^5Q8TFYa4${>x=A2pqVtLI4nI51!5#2 z1vPedbJ$cxm9ZYwr>@S)=frZV(j<@fIlqsC>_;sEQiiRoH=kkI?8kxo~@6m7? zmwOyRYJq(8<-lrP?(_+5GEpawc{;=VzwNCv=v&gaWPfpIP6vNU+gZ7$;v{iPhh|yM z#so~+rZIqEWfcuSj?|*=xn(Il0-hVtOj@@#h%|nbV$}O=GrC>gWgVaq1|91vFqgKp zvxx&~Oi+7-AH?UoStX?o7d+J{v`kZ`v23u)bd|?UKu%l-#$(gsG|^J*tWZ{I;EK)g z0KunsB3grIC)s_)h9M9OxP|MGyXgMo57>(E{Zat+LJT(Mk&MgF?#JGe#swJEFaC;$*lwQaUpVNhv!ivY!I243tfOmDxJ>JMt=3j45 ztzfNfXbAVU(s84}jncj%6ojs3y^dSG#M9M=bJnvzM}71~n&z3>ArF)<4qM$!B?}d~OQWl$3Cp@?7+;U4-Mf0#2kvGOij-Mo?{zy`VVRKb+aWW^~ z@oY150G*d*Y)*mZ_&(HU0b2{~&_o_1;0r`xTld#Gfvg$#NpXzg!?`c{c>B^UCr0B2Gs&WQSQaE+!$7n+AZ_33kZlX)5en&Vs;EjqMC&}4_w4i z$(7X_CNP0Fqu1>?S}hqs6do>en#_5JEG{m7mAm=6&2L0E1>KYuGl7R@b8VzQ+ZbZ3 z1EFJVlqEN~)hwe!Fl}I$zb`zJl-fPWQok>xdJnCT`ZLCX7>!cr1^3lh=4)W6l>SQ& zIZ31`7W%3~TdEVe;UW9_Q(vGzUWNaM<}B z$WLjWk4*%_V65QXu&7D{NQzAtkDO{qV9)AL#G|*}gGIOWSy7xaAxU;Q4haQUyI4qX zm~n6&prK9%5^rfX$UGTiM9z57Bi_g4+_)@^ZAUNO~BCr<= ztnk>jdhD;U=wSZ#<7LfDH0pg+@EAm~bKQ#Z=PB>R9L3nnd( z1YR2K!*W>zjby8%ce*)*p@~|5D@^Hl(~dH9yJAm>p^&~I1-$+pyx4RZm*&Tyfrq!W z^a_~@dZ8r!#EV#AD5y1<#9wqXL68FeUfM26mz@4H)LmYPaTA^^I)NCSSu+s#tE>e+ zQ8k!5Zh*e*o?+7fn;;BS&d4IxH_gm2*!#?gmaT*rd7AKL(Y{gwKK22&$cQ(9TGR_}+Nn7LyyfMS#ZG``>#Tx30 zl+r~yMfhhwfM`;cVi?Iz^Ng>HXN@;{0b2j5s2XOpRZc*3wGU2{47zVbOp-!&b2lrwFFTq+zh4zlKx;pRBt= zK?br+6!bDCWbO*B9*m2&uIsfC%>`wEY+q7J(|EiLrcLe2yXP^h#w5EP@WWK}1?+q;$kvwKrYR~3Q%$Eu8grN2)aCYybwWpCM9%RWw zEy9WU-;Mu+c-_4XVgJ5$LExpccw&w&)!AD`lPCLmt_3t{S8~C1vT0n%_gkq5*Aie% z^^h)miJ^gg1ML59xke(T_ajnE<->G$hjPal_xs>%oQPtfx$r1t$>(w0Irfmi&{Vlu z{DU!H5(JrkeS@yu@EI&W|1ww?%9MR{op`hS4!-&A!Jv>EcFVm{{|Ewa$D$?p;d8L1 zUQEz~S)=9!w3?fHE+Muy08W~&rr-e=iZZIXei{Ii4Gu5XVm`Pqdac2PgIy4>OK^&} zpPeEFONx0lNy7H;-coFd{J?|gl&khItegrk#tV+G9wB~)gwRpZWCsrueIY<$lPMH5 zSeM?#4#U;^zIF6~=a_z7cQ+~{Lo+$M#I(kyPoX)&#$8Vrb41NS-BoD_gr2b=ICi;? zGquN{5E@-z=Ny#Ldo=~Z;3^ogL38t^%rDK#6y(IFGa;%yQB$3Kj#oueD|>yjo%8s> zIpw?#_RRAm@So}??>iBTWV`z!S5;1enWl-eH~A4uAycJ8ow677d-P8T(S#j=c^HvT zE4T>SlJUza&j37pWiM#@gpRT?P^^c6%);^kH{3_i#scJ$klT%5NYH{4*3L<{$F_e&W~_auG;Y3kkvgT(rJDURpgMjX>+ z$Tq$&7T!P~nk`AWH{z#@t@i&&XkGi-RqTI4qU1^5Kz(@N@&wYI@HLIyF+ShouI zGEVVMzW1asRH968#Re!Y%{iOG^urU&g{Pa?-?+(%o8E*&anM}W6%hZO++wL4dm!!X za7~rj5NV@O_PGfGiJ2ccTmpU*2XCLY_@m4O#64ZQYsx@NPFoZ|rTNU|KT919BAbpM z%R(x7))t1b!TuEiL%~K&S|C99FUd?3=$ZW(>a?5XQa#LqT}Qs$gy|*iq+vrzR@cGT zIoxxHFye4L7@NR+im^gN_uq{v<&h+*+60tHtJEyb@KiW3ry)?5$GS38b;PlSIt23` zzp+nYsYE6TEEo$BtH}2tOG?(NzuyS^Gu=p1sQ$4R7-G9N4}$XGEOCRW8o3=T7HVc) z+gv%%&p0b{Akw^=>Vk}8#sBjt1%-quynE)CSGBcJi8K_^Za22#Fhqu3p8B^m_9fK8 zb!7;*GKV(sJn1&AI~1XUA&7pAarz5QST<%M2sZx9Be*f-m8%U2%hM!#-%DZPJ%2?O zm!Ti_QBi$PqEbMAlD)w`%b@i775zkm?Fz;{#-^|u)pG+!C+@p=T@0|7-KTR%wb>U4 zzDS6x4~E-pzO)mr4Pf*`s5nVQqE@8LJ)RCN-hj-RG{tW72V|$lRoJ_l?O4B0UQN46 zF<@>F;uNpQqC=c}+#K$pDOBu%rcl&jE5CQ_l=+9p%vHTQ4cR=@)x>2()It7oTV72x zq_tEeV7$QooM%0-zGsGYEWMp|PVk0Un#NAg*g44-8oLbY0v5G9*A|+XItMG%EtNH~ zL>L+qI$>^!BGnuDZ%bw1lZjIcg5}981s@|K=N$}Y#&@4;&mu~W{V$nnj^sr3h1lwG zn6b^1P(h$8$V^P%OKioRlmeDnq`ZWX)>`;kF;^C z%RCngU30XlyP9yuPyN~c(+_KeSaGH8wPC*i_1Jtbr5ng*0mk}2V~8knD%VwYw;7FB z1yWpyzc|4V=0QRois-|s>Q+*ZR_;E4yE0oJzd||0UXUpB2PHd+)a!$6QQ=mT?LX54 zRloWRPJOT$UZ&&s6!GIj3t*5idh4}6A$M<$Wv?DZu*1$LnR7kp=aXj(tN~UDiT=NC z{fMsZhpVynP84Nw8=IpK0aNG93u}0JK-~Uid;{baY(M%?y*v)3=5<{^vk`Y@u0^Gj zCVF8!t<~W8CxcEZt`Z^1lK^ZWW;rIq>71N`D6FM)t_@f55jKaFf)#2L#coP}Je0B= zAX{CN@H$aD`WnurG*Nmyp;-QBRUeXhpaQHq)g_V@U)Nn|Wg3m!vkXOQ_02)b-~FG*-@=GK1!t3}qop0eeDnfdzjSYetduyXehK8kPNyq z_Ia7JEX|X@WQ$sh%;bw%b!qU$Jy9^tyBmAm`VqKV>`Bt}{;{1x{2J%>MO6Q0wG*6? z36(EA$u&W5%4h?&FP+JGzg2r?*@A(w@tw{38(=z_M+^#2uN3i0<_|43?)(R@= zcQkZ&o9!^OMVJDcPlG3k?kCdlM*QCBuYRl4B8;(6CGpTq7L%%fs3@q;;s>SRQd}XF z!~pJgnn5XK{FFVN!7)gUj*6LTW+)1w@zO3)0f=EN>msNsb{#`Oi)O;c9vdADI^}&f zknVyo^2sk`=rc&`7p7qYTjMa11g!l@qdRe+J$ zkyhZSDrbT@wb|yca~U^u$Re8kmE{M<#qgesEamfh7H6}e3Fs01ySxjza@RZG#RYN1 ztw|n|cZ+&ypT+4wWojKxUV(G~u7ZYs_a|VIEYFBJq>I9%hz4t(OcC&f?rkQFgz&w8 zO3WB@w?P`;pb5a~y_OA19C{D1noed`*Dueo@*HR3)+7?#>%*1$se}Ynyi1XC?P{{O zQm!>1!RZT3dHPf2>OR#u*gVV;za``TbM_Qm6SWr3yRBD2A^1~qw9KdbL$&qo2X|$7 zt$4lBQ6C(zZrPuS`ylcki?w;}7I6t3N;?$28;1)Pc84^j%}gJnT3tl!p#v-mw9Sj$ zBEOA;yc|4c_8TjtXiC)ziTW!`Wu;^VYY8$!2|QhLP_TxK`&v`Wai|x5Qzv}4Z>(lL zs4C}I9dO13s;G4dPr`5lOgtRR)P8g8d)jfRT5#{J`&AkRAxeN=sud|bWO5WKwCsba zhfSw>Jn0=YV(6=5P-5pDEn@3Zu@5s1;@dE(m+pt776*sk1)i7nvOm_eo;HLr(|T(y zEgxz*ZW?-An?lr*uIfKqDk8T`f8vHO!|Y8znlB23r(jg(%(3ZOo_A<-!S%Ps{hUV= z#5v-!B=Js0;c+&6J7+N>*;nBW!D)=g; zbjs&`vo7A<2b!yphWuoC^Fo=F`w<>wxD3^U%$1#~1#2r)Ib#I#$(D@w|LfBxn&w+e zjB1+w0+-~Y6V1${2{^?#IW8|#f1*n^D8dOLvqAZtgcb<9epS*_?z=PvVSJ6s(W$ZO zb-|c{-S#rl6FCiPGNVtrvp6OwYT#S6-uw zk6yA*z~y|l=yn{|XO=#rdS8rKZWU%#7@)RForqLiH&mEnXB_NK6f5<)Zph|#WSS|Y z^etyDqaNzz0I;CYw{Sd*hlaOErkegw9L1BL z3!&pVnOKgxb9ym_+@ZN{x7i{T?~F)n;rN}ytan-R1~7n#$`z;6L!l6KcCGb+{yau@ z00${durECL&PCeS5>2}Ni7FpTTCqP@x21wPGd+@GjAa<#Kykp|We_C4KnNhLSB+O_ z2+w|oC7tY#&5)K^l)OFp*Zhd*>W`=Qdfx9w`Ay4CDIvW>{#B=1{9z|pJJb^Fl^A0V z9ZpMmb=9&?bN*%hTThQ|+C$Jz#>qbskDVR^$zq;A^HDp(Jtuv9K3BiGY-jwAr*eo! zSA*aY4a`Rc;1Y0S#49lFD8v_M`!h@L!{vidJE@@9tGtJ@b;KmMCp!@>yo=+nZ8BLo z+3B$lQbFRbF)NtA#E+SAwVm0jlHm)$6fI{5oVcRTAIy>XSnV1$ndYrupIiE*TKHbl ztcT&bU>R?Nz{hE+mXZ#A_L%gIr7H#z(cOv%X7f#cFy1uxV{gL!aYPaY9Gi_~bO`Md zlLrIR({*QdLjJMtt?`oS;ThjY@FCN`2x6UxGBO&K{winQI|>W!X%V}A6vpx7LkQKi zt}_+6GYnL$@1gL!${N~Oan})Niup!PH;4Ec|7I$3(h3P^I{c&5cxlCM35-knGwuc? zBa7w^1N1eIj=zb#qx!vqNA-S^Y~dZlM|ggcz^nF#&Z~4tF9l^d`^p;+vd{KZ#(weF z?absUU2X>&{Jtmi-1tFp)-rdyP{HuhK2Wc+lF?{o_k5-IFO!9uAeM7SoTN~vzFBwp z_|bfS;jEIRv(T#>{E!LEq{I@--sF9~6wUWxliX;?`s4j0h_LM*9#wySh1f*;k3}>P zCm&IHO?+(X-I8wXj{Ae@9T7rz<~zONNxMXvK-J$)I*Td}sX37g1ugS>P5xeRYPZN2 zt%en-?mk`*bcP!GIf&=XVQye_Z?N=<{BS4v`$3RfLv@PlMO_X+Qe^#tSWE4b-qyDl zN$(hTfp1~Tj))zHU6P}AehPrm%1r+yst-OTtUSYQ3roW8+jsJcW3uxV{2yZgaw?+` zg|8<5ph7DnZdevzDqd`JAiX*}tsI=}E+uBEpf#|=>qlI}u?Q*iT~nVP2Ft)6It%J) z>{($+_Cf~E_J#IxnBJeL?yq0rc)+N_#EJU8$T!qbM&pB z`5<1qINI0Tux3AAXo>uDtkkIC|4ZKy~o^C(FpB3>UJZoTi=L7UwNZ zJJg}GNZ|>p8F@_@8tYgsvKSGu*SM8-GuMLh@2qL-_jF$~Ue`Gc;&S8HCz$-;uV?tg5|fY7n`7CzL1*=M70OTDh?7F6%d$-}Ez+-} z#Gy$2aafr46}z;+y$XRNAVz-bAD>9byjE+q;}v21QyIaGS1kO-A5JpS7G3;ezGyup z$~v^9soqXw!u@+io~+QGj_kZwhIO%JQuGna!EZO7W|V5)+DKiRiveXSkaPl(Mc@28 zR08~WyhKUt*y@9h%4kW6VLsjsiE~Qs_T0s+WepBIYjS~r<_o@GoVlqVuMdSthYd*YY4KEzj;!Qa8wtS<$)e z+3@8!@|c0BbE0AL1ImDSCzlbN!I3Kek{x%o-pq@z)hwe`RxtvCY|cHZ zEc68{42aVHv-(+rFDHOCs?tQqC=B0-EE`&aW>UyQtjNM}uI_>SMvF4Vo+8Cwn^|@X z$qSalONef8Ua>pTX*vUEq?~PNBjkh-y^0L<2bJsAY>e1Vr!W> z8|R>ld)(OlI469n@$PD4$vf6+u)2H6O1oO-T`hW^v5~bk#ZB28_}l(h(>X%6Zuww; zD2Rbn6rfaio>V#@n!K#`#@-Tguf+1cEv0`m7a{NWrzhLzk)Px0c$4FFOf?(tmAP*6 zJki>*aM%bk5&WV-Ps4^b0_8<+zl|RrA8E`!a_CRRlprpZi3iAEMYM^=96_AO#%o6c zI&pn)l#3Ft9LDUL|6q>o?MF+ zdi72xB*l<_!c)#W(5-JUoMk2m%DtC-b-$NUREX9GpHX__Y7)O|Bd;jXGFULn&@MF3 z^b8Y_s1^uCb?yX{l*uM?y&?lZrI6!2%;iWLBOj_0jF9gabLPsof5d0lgQM@5GhuXK zn{IhI@QDC;Oo%nAFqW|CiAA9FXlM?;SS+)fUdqoA<@J3#sTX%yX$?VS5!*^Z6b>fe z3<=>=Zrgt6R=dPk`m+8UrYr1pU_bAQ@aoWALHyKQmxpMRdzjIPVMPjjdj3m3^qZ30 z^6gS=P&?VNd8CXiRV2Lm7dPh5z`&-7Rg}fR_nR;?deolt%{9Rfvf?_}lXK0K=4-s( zqDPW@Q%@4?%#Pu~I`M;v&4eZDahN^0PqECmgM%XMy^6(m?k#VYJRn1<&h~Z|*1!22 zEp2wsVFG|G-!RgvM=PNq`Hjv&)B`uM%+Rm=64Rkm6!$7u@!KA-mXMAZ2gh|DwN-Rz zRYWbPDvA>hsPE1SXU|vXrF4s(#45p@CQjt((Lqd`mF`===U=pv|72 z5MK0wtF+-YCizcY`3_?&J(f6lJwVdX%T<3_H8)3d>h@Va|{4#9e@`J0>S_11pFg~+L zqZGP?a$yYl?dRTa58^`h{mJZ=#vTM6qrITYM3T_lgTOhBe0%-GU({tBOeZeBem6m< ztzS|6*&pRRGwG=iE&ajY-9KY8nzw+`rPWjM#WBm`F6D{(%aw*}(bTa*HCDlYz08oq z&=gch|CR>?wIYV<`j-5=X9Qy`0%owQV__2EmsnPSo6Vs}xzf?yv_;wtK)DjxKs(8l~T*s-D zY&Xjf`;&~RT&skx4vTbVbz*da1FfV2&()YfHkxD$$TzveE0ZsZ9A($e{TLD|L9E0_ zBj;av@Y|ywHr;-A*&Q0+p&i0|Nk$iu>-ri|&?UBU&_Gp-1(C`t!l>q3mz9Hd+ryLD zE9tkUghamA|T+*{9|FSqO| z-FLjCjx5r6Lpro<#hKR(39Z&3T?2hmdoS;9Nd1idh2l;J$@}OTR`WeI_n$z@yg3kw zUxK(A>A}qr?Kjh^F3S75`51OMfITY|WM~86{B7P1NWuE%3QZI*ti;D8)?Kjaj<6|! zi@ajYscR=N+kt*PR8I6!5mWnm)D`fD85+2$mYHq z%A9jvDiNJd_9;n+!ae=t>w2IX4$cRMA9;X&(=S=@>EZqkw=a-;G6H z{twr_2j1N02s_`wxFVxO-!y|xt^EO(lZC!^g5?h#l0z7w8$HV8Xl?YblI8zoWw@aR z0@i9lVvFk5F?s1Ca;S@|b z%R0*nsZ3?tX4X?Cn^9wQ%UW7=G$6t-?W21|9@+M(hpUc3vm)91i zn={#$WTDSak-#VTvbkY$!B3+4`S2UiqY&Eb=QnnD$S77pCXCruA|WZoEDCY=Y*8fCD(;u+e-e@u&Z=SRv2jZTR}> zv$wD;Yo4r^6s9lF)plHj3x>??=bbT@9jNk`&LL9d!6kChc&RkHvKvAPP(*c&*tSH8 zv6-61&rBmN+Ngp+p1LownYz#h$iHU#&78iu?g8A!EblKj3I1~jSv%Gd4nS zoiCWU)$AtU_1Ax@V&P}^gDPprC2!fT6C4#SbFjvVd>J&Yc0Ow;Xw*nit52wG9&P;Uw8TF-UXA?KuE4SRR=2oWc8+ET0j(NBMy= z@{2yk^kKB&aak{_S8YO**Tnh6>kWI##)m)4U-Tg-_7LTVduhea27SM~OMNnT)-Yv+ z)(yWO2VzpzKd_7USIs=i2?iUjQ1B2N5lVhs8 zxxDQ5Y6RJ1vA9m|;84BHousU^Mwx%*N%F>P@Hck=EV0$nZ4aq=ThjnYwM=HJ)Q#uD z_KGhmA3~Ux@GrDt)4%lTuy)PQjU{Q7t_=Bg!YY#-l;-EgxAG^0@p8fg4b9#4_>~yy zlt~INiIE~fyD-}K6uq7vG8|z>tijD%&QcOClCDfu(D;TM9gDPfKmQ~$&vMAZRj-q( z+^49Ru{go5iKZZ#WI2}4|9x7fd)$G5zc`gj!bA^}PwD=#HOZ&C%g@OOs60pAyF1-2bxh6bf43uFF$i0A=rg$sV_AWDoa)dSE9`&^BLLc?$b{B<(!^__>35&oiNd#;AkT?3YDf3ay_ zW+34u9(@eKPzro&=4m5adAnpZ-(jm9Zku3_?i(>^A$5=s{%rK8r7qUXsHt&+kB@MS zmq0;ty91{CZ$@#~m$a+qr$u0r#5Ki>;gde&x%&t&bMIZ~@=Pzck5{}ijNPtA{WF~| zLOwB5i}Pe=nPEMf9k)t2B>;qCJ-Fc|Amj~D{CMGK`S$#U< zbMk|^^FBA5Q%tA8i`DG2Exgw2UW|a~WC}h(D=09rmTK?`6Cf5@5zpBX(Uf$?{a6Ey zIkiJ%HiqkbdwS@;L6w5b*)~ zWmFhK8G?Nc18sa0M{c=AhGD?MZH2q=T>p+Jo~c{T69hZdI%ts1HxJiI6~=4yr^{b# zN4sFP+u9q9&RnUv+*rG=4?9#xJOG?Jzq0f-@br2!@eGsom{sxf5=1DQv}9yXQlj?+ zxuw^&P+*{-{@p7`OK2Mo^F9Q6DWn%fSXpy=%S2H>znpXY9EO<;{?K14fw?VuV};Dm z2Jv^`w(JL!{Xmn<yE!*yjCH=8t84{ zM6wD5C+)2?MeC2qpaBLnciEb#u&?tTJ^IQ%2kr#>qXkE{z{Q8w9 z18XY%MxpLe1rH>yVAWmy;CxTEw8hFiEx3TRK$$=8pKr%9%4rLYj=g(Pt2n&BQ}UwkrR`p=K@^*hd^Q1vDrp09J)w^D=xX zdky<*G@T~@mYJAxQAv5t$5j@GISHh_jq2_5mY z=?96NX?yn(It02`rO9#nHS?8Tbr1}WH(?izk=bHE{QS9zV~`xB+goz}x+s#HIuWhu z4m2ym#I9_#@~Is?F%&D76GIpNiNohfGJG!&AK7H+Z-k)tMYh|Yp!51pkaeZ?ub&cw zRd6PFMX_?q5ckxzr=?c?8jHWMt<3#i7(WPRj~>O8Y!3KW>9aC96;=M|_p|@D;SxB3 z=shycM?DSPnNO5&RLOX)BW66z9*V=T&LR=LUFf>&UH5nDXG=7`FPO*g$6c7Y0 zhnq^Q^BoPxFNtH$54yM4VkAVz8y}TE9t7lF@h|JGwALW=-d!^QW1h zRJlJlr`K@a0a^O$)|cPvX$HSi#=7NJrl1J4eLY!`O%-3!PjpYskUjVc8$5Gcr&}gE zbm^9Q93(g@P&LgvT780ZXiNKC`G{X_3=*Iuisqt!P_|b85dIO*8z?9UZ=?xO}?&| zpyd;0i7(SF%tdMbOPZmR;g&j{3F%2`c$*T%G)KiEu^=d(GcziWsRY31Bd1B7)TI+t z1ULy=Bi`JLizz_?hP95jGc|dL3ZWIrvhvB-eB;4H<92^>kho*){BVwWsOE9uj>aC8 z7}EuwmWz+^rW<>*RaxGAtfS>r zoT9RD`rHt~FQ?d`*Y2kBsucMk$neHkgfS$Kj_GS9-ExBBSSp|e3iPh}_jU7L2la)R z$q`yEg8YfNMf^0a`bo#etKI8seXVtSt$2`^APR`HR-dj)t?X=si048y^7D0I?7dt_ zI9x%ud5I5HstBOVImX_($KuRNY`DbYy2SpGPIMO_hNBQn+j98TQGStD+k}SCT$N|u zf;WyFf@0ax@WbYrx5RbdcHt=2DfgdEc=5p+z;tPswY2Y}rpK9|;63kI0V5_nnUH|W z8f^CPbcj`jnB&FKJ8{s3KykvQGnL1x+N_EJ)&@ZX4a@aEyiofBuQy z(VNW33XND{$vDSAutFX<;A4*&MjB78?BNeNtL6 z@%&!Y^i9i_X~D>$eFZ3uCkdQ&TQ*L#ok`H{n%`! zL2=5jJrB4Wb)_R#In&J?J&Vay+S9Ebenlmv>1MKP_X?MYTs34xl{ZEKrlxo%gd~;h z=x}n8a6eJg>}5K{sM$BPwc@x1!ZeL3pyR`#+-*_+=dPdS79aV_)utw@`&c)1vZoyQ zO=xt+?!JUkBS6w{Ey^I|B_gbAJAI)XgVw!HittdUr_GYLO1+Qw>sDy+f<+Wd~O; zV*77&%ilnZILJTUBs@|mcWvPXuJCc;vaeWvfStvZfv*qghX^?en0-7eS<{E&mBfME+^5gxL zGx*In@M$kb!1qtFpikGeywXdX`AxNTBtLc51QnkBv;ISjn7MZ-h7GL0)wj>idX8u>;T`drW}37=jZOL;b`kaM#tg0Mtp&eR)}9IS2_!*P zSL;7Ee#-WE-^xDN#8Y~291Z7NH8&pb$o71!*C$ve^Xjs<6Z%FV;F0h3Ml}@K?F>t0 zpbJ3wjYFrSZj*jzz{_N%l~vEhzqP?+^s0quCI1zXAhwNt!AmxEvGe$QHJwfh?9~4v z>MeufY`U&dAcMQRTY$k`0)xA|Ymi_eKyY^$oZ!J7g1ftG&;)l44DRsF{k&D@{G6)m z*L3&p-D@wIY+1Oq{#|$5G|`QHzKJg9 zr@2ddFPLTE|GV7FS?IL!)m_)yz?m#8nDlF(jn#8q(OE2bXLMaEmtwH@(h?W-EwxRF zm))zbtL~J7qM-JQcxPt7Ujapel#{h`Oq@+Vu~Wru%=V@*1Az$&uv8m`1RERV0^HVk zT$BN1xU24ic<)r;+neDepYy&qj}58Ub4Mi*jP$Q6893_h;NsT6V=`mF(+S0b4cK?RO~8jkmVE8a-|*pF?5E8EuK6mdcjWomMXS3lXs929!%58u45g%*HdQ! zP8+x{9?n+2a74ULD{>W#L?ERx%c1zEtiWAf3;m{5K;B&O3qBwYw6_w~njNG=_RgC~Pn^H-RA=rmKm9oF}ooDD&*FN;S^%Hc*nN6zJmi1Bes zc`;usM48U`@O9w_s^XzThC!a3$T`1erJD>XRM{Gh1xY&~xR!6~y_Lm0uSJ^Q3-G8;E+r{jAq`{jtPJ zB+$hk!|d#2fJl<0C!c0V{kL*fbyoWyoG#4)$kt z6x?`-jRdJns<-*me?3WnWiPWV*VWA^mN?N{UaZsVi)Q+|LN&-#G#dPayZJbguU?`z zh;iYEW#sc@S{+ypA%SPMS1;O2#d!Vdu_2J*QDrc43Ck`=(>sYjypi1k4qWQdBELDk zV;JNV;{X|tNcNnp$F8*iCYu^_J%0aZNGGc1Tg?7eo4ZJpB;1$@t@x%OEJahA*S|^^ zG!%w3>lF$#!rlH##V$jfeciTl*dNpNs82tBJ#A$-2Wp(UE{7>tIjzQxJ<=1^Qjw}E zPYxy*x#6Z?{33j1l-EBnY;w@Q8&C3TLyN6Ae$H;WeXli0oj(}_G zDq&M+1Rs7jC%hfv&rds0In(9+J z+D0v^bBI?k>(RezdY{JMiL|mD&~!>LF*ia4CMDmY!zM9lryfc_O;DyPCc!3&MoYe^ zweklQ)!gWp2&id>cuqPoNnn!L8|H;(If zvfiw=Vx-*MxE>X`;a%F)t?d@V?YCvZ?V#l(mv{S#%ihWfh@?}%(|3}b2P)imB2(~S zk+P?l4U0w#`A85~DJ+z4=dg6;x9~bH+ZxPvGFp+CmP{_{ZPL>oG1!>N-m1czeA?-! zf3L5~(A0SWMdgHAC47H!xqhszf)_Zo|06mZXp?F}+mf}k-MbP6ya+J+b9-N#KZorq z63jUwOoY1{PP1QkVR3KBS;m|#Thtm6btxKaTS0GUA);)1T((Qg6WSgG3TNuDl4t-` zxP02ogQI9Liaj&yf`ai<8bc;V1&O^{e0s{ev%RV{r|l8<+{6Ri7TmDrt~~+=GuJRg9}o>ySN&K^pCT?rnWfz`XV*{ z=1QdR4M0X+-etdF@4w%X-FZ46n5%xK3%yAX+cIguTCnG{qkxkO>N=n;J2d)D7J8Q+ z)x2I>;Cdg`%4#E z-SnC8uKSLGKos%`OdpwnhZU*sxJrG2DAwC%e(^!}{+a@r!rexW@5;nbU`$x^7!v%{ zyuZdYP$Rb!t;!`auICE|S^0WA81)fc-T86|>3jqN2T7efgQQ~!cn$5yFfNPm-;-!+ zkHp}(Bx;9G<|4-@t*Rb(RXG}dVOl@KQ|$*`6tXeKAU%m>o(xjGEObf}3|lH$T7Kpw zIR6x!cKv-T*H!WI$Vbsdam};w;*$E&lSg8JF?qRkpk@T^;VvEB^r|J`-V5nOG;R5i zrs!EIv|9k*xc^}5psdaFstb5y+DUGS5>NAL2H$+Ct$L*o2g#I_uX5ZsjMluJ+mXxy z&!j2~9n_4TNX-i;-M}?-@pWzlE75?5C)Qfeo9IH?WEt^C7|5@0ifv8|N4XeI8E_kO zi+S|Zq)NIMu7|!n=pcUIJ*%f*`P(I|ao$GA?JLPSFo5amE5XrV%m{p&?)rHAhBi*1 zY8m9b?Prso(4GgNCPqV|ADdX(OX`i+n!0yOKV*rE`G|>@ULTeL-@I@p&+WNFa*O`4-60nitwv^2E*q6=@vPDJaL+1Nx@XS6&gu(vx`J8U z;{n(3EJ@^Z|2M3xL}ty%G}MOE_K7Aqzn1%z+=hY)R7r+`tomeCUcd*cZye6%&kNZ*I7Yd>|hgv(AgYR>;+3v zxc=0BF=kZ%Ij^Zb(x0lo`65zKd&3A0tIg1*+E2d5Q?5`ggwP?kuVXFuE;DM(KXGoE%mi|Q8vq94iK$8vV9*E4LLSmHS1RWn7Zah$fiVH zlP%Pb$)1O%Rj+bZ1{_)Qd&W-I4t7S*klDxqIA67@K5#wA{0a9@leAB@%hk&~x#W7;V?hqO6{dsP(=wS5V4^maH<4-eg8OKW&9vbe*vZ*NmyMV7 zB)Wtz>R1B(;^VYKpG=gN1%MNObP8QhG7Mp*n7j`r0)aBibRn^f@r6lSH+w8KG}j%Q z0}kw_z}uT49Cl|Q5=L*Quv71EF|oKVO))D=OTr5eLAA<08Y-*h<%v;mn;4~8ub+5K zD=zqx{u4+9#Ka?}KYrew-MB5TeJM5Htl&w>jURN7*CjL%9cJ)&_=3Qn(3VLR*K&$= zPcKVXxc9q6CoEA5j*|}>kpYtNd!hWm^$pDJYOGh{``=*^I?aR2)fM-VL@>?hUyZqOA8JK3y9Ut-l`Z24oIm922g_gZ0zlHo+Dt zxbm!q*|?;KM6(>U!FftqQPWuX$POI1r!p0$0rf(#R*901zKe<^Q=53rqGlUyc%{(U;n~I#hp)nb|d&1`Z z05XBEz4)iD2!7uNHg{Z^SmAC^AbQgB9uAE@q}qK zJV505t{xI+JQL8HK4M(0s1Db~m2?Bcd;^TcujJchCJyoa2}?@{Dq{>QG;D`-s+mlLJ?Ew>%OqkJ6IO|bZ3H;?Q}hQ(!~#1@ie#aQG^$9KQDVLN z$g$JasI@-wZW<^=Qq547RN3Dl2a>rO=V^7I2Ia0mdLI#vHS7JFi(=M1M4;HJ#qI`b`6!(TZ~qTo|#lSG_H7 zZW(C?OGd=+{`?&FFjuMR;`bsIDitSdwg3POPY0il_U;D=3J#;@2IUsztcDksz>BTHWQe)Y{j10B!B$5e$) zw|g~|l_CaZZUN3B0UShvK=nddV;=ADx}w&-NDUXrGD#ETz4f23_Fl$YkzUvhE63pb_q=b^EO0AY&>yh8{;z~ z4oe+DcO~B(CiG(9XWmdPFFFYtgr3dCh1r4K-7FZLv*e?!GRYvcP5pxhh3>{?oUQX& z@8DlX|D5Qj$Z2CHpKecM!-hrQ+k%ZT^_X}P^@%eI{w@R}80j?;zz4hqq@P>_>5~U@ zJRZJ>&|jdBK%b6VK3%f?_hH+BKd4C4npi|FWRB0)1N?D$t1ubyA5vx%;JDs6y#TVr z5KL9>^;+>g_nsq%ha01~ySa(WSkbW~PD@;<>^5^wJv;#3N~$WE*WJCWn)|!%>8lYP zm1SF{L6NC___j=P_+GHw^w77W>Fgxhj?^AlXRVWB83+1KKip-uF?t}Hi3xlBP zs##$sReALN7nw0`8y6vWVx8_AOuBVHT!K&pnlVPCm`{?N>$G_CExv@LCgA>R%n`H8 z4rf~DN1O$%G1Mrpq(!ZXsL>W_;uNLd!pF~TA;P}W(6_OXvKqbaXOBcs)Jabt>sqPN zH}cjy!Ib2RI3rNnSru#MkA+ccSG*7$TwD zr}na__8w&>P}V}!*Te)do?^m9(HG_I(M0r#0W7oT;UC=M)Co@s1+4C3e|{AZ#Zjgo z>h)@BC1rAB9g)vC;?*U1U(f#m2*O(>p*2k(A6K|JUB=|LndUhKzB0NF`F@#|)#W-- zF(>C}XsEDIGhF_+9^%e^-^9=IbD`#*faeh7Kq02M*PeoB zXNu$oW4sJD7%9>eHqZAvGlRfPut$v+VB`R2FyXN9dYf1}5KmT(vIQrnODE5M0Y`+_ zoHzBnVo+b_uMj#qKMPM~-5e+hf9TeqkC>`Ze1-sot!5s}pdVLNKaceGF}1{}!N{5y zo2oDBvb1hbTr!y|!N`o4JUf#|LE1xqtD!s<-hlNKIoB&6Wt6G^FGLUMy+u7~iyJNN zpQE?68zfIbkv^Btz4W$E+1mP*iL3(?#)jQYvQGi*AAonDWEeT#u*h(sykCDaI=*-H z;kWDBk0tVMiT~AWBZfh(<1A=O2y110jv3i-LmwEBGzo(qs}y zn&pH`Vye7E`eB%i6*$kKF~a=7<8M8i)(>>m5gs#cM(;ahBA06)rQYfZEu5c4Wqhyw z&;HevPbdb(IP@&3uV{WeCFh<03LjQKdBltXh2g~s2xIj$X1`Bm^2#YGNqzs`49klW zE+*!zhEqZ5jrV7*R`^Ga-D|E`?7+m~?vD{l@q1bSz|FV2T+gF6-LIC=dOXAyDl5Te zM=P@Py z*DD>PcZXpqRA#%RuWJx2(i|VxkQylK&q4A-OaH^+)6~k_f$-?VaScb$1bX@fA^3Ap zkhO9{+rJRCo73Fgqftz?V*KHm?E0KO;IhslH6uMG?FLy4{`GH{^HHx;(#uQ|a{OBi zEz&~=kFOCmD$og4C33~SOoDn@ z;UfBMY>r)8M z{n_E-J&uMacFS|H=}B7hh-i^h%5UxMY2j2lE%&^QSxe7Jf}b$~O6dn*5>KO)^bx92 z=1ylm<-FJ zDp$Ny5*Uvn84?m9+G!eO;wpH3N(*05eDocW%rcJ)``2JH1~qn9?6Vos6PSwB2+Qi^ z3iEtvQLxf$F(|rLEYMjP%JgHJu~}TEVvbu6hr%B8Yl!6xje{DJ`W)!_gzP`MRhH4Q z=T)cv5_!bq!Q9>R>5!~M(kS`9Ja;@_icLUZO%S~>N)KhU5fGQ;AKHFwsX{V9E7zI% z)%PcpR^sO4#1ARy7k8o_l344No;@g%_|5E zRtfJ^DTQqJ5iQuAGMM2)FPOw#m>z4C&MDL;m$k~LN^yo&dL-xiGG6|)&cPI2rJjOx zHw;K{rLV3}GMay-@snW8#guLW6*jV>lkId-8V3Uo56%sagG9n{ropn>SRp#z+%V$s z%THU8uUIykI%bASz~9||lqJyAqKfR|uC9c&ZdRQ&cf@b+kHEMo>)jm)b;*zn{AuC( zr_V-Uc&$a=A-c*LT`GQF+(OxSaRqM#l^o%b5tc%DQ-xYHtTOtgiE|J8dH6;!r zP1Mb=^*U)B1aSD1uiEx;UNS-$Y%=4=&mx3zOo3h@~as%OJ;$ zDSDo!n?NR{9~r{F`hATr?6krw&sXvKO<(X$Jh$PiOuE|JI*w!9@Al(8O;`+cjko;a z*#uP0{-hd-2wO9sA2$FfW>^_8t+7E^d5j77NFPNCbqCT!F7V|c8=3?uw*VoyW6J&g z_Y|}QdAcK2E5B&V^(dMP+0O&)LLXqQDM%I(^{tmU-eewbEIZH3Z8t4Ny{G=f^=o2e z+sp~X#wUhow_|@hXo87>H=88mlAuDbIs}d!JgIU$cRHlvB>V{byirvBIfo}zQQu+@ zWFtd=NfFdDFrwb%O^(rZN1{RLMYJ3I!Z|ko;W{LQgM|ml)#)gDF~AGwP!=8WjzUek zF=yz;iWCQ|&Yxxko(hfzsK#OhGy3O!k>yP-Vz7kF@~btr(9*a+{R!-~zmD&! zG0SyD^sr_9?;d6@!$GZ=dr;hoqysKgvT|6$l8mt{CUADEpQUn?JC_x0Rmdo7W)Nqo zee)LEAz<(Q6mqdyx(x?Auqkp&yC4hI$+ApB)+m=n{b94RU@N=#`?c6jVt%BAsV zJ^tj##fhNAi(eL;VW4jj?5r!%BPFQ{BO79_2WT6<*UAmRpo2JdkL2DdLM~#8kemY9 zsBH9a9-pLD#G=<;A3gnd5L-Vz`MIUQb112t?3l;AgDD9gr@0m0O!n-Qk*T(-z2eX= zOrlD~NHY!x>r{p&-eqE8;2w_105YYCX_{DgKdj?EkKIIWN|`mmcfWe{?hfG}t-10c zlu!&kxq<{w8#CG5tJdHk=x{V}$itxp-qVh(mSyJ+0*)NC*m*hhQ!DErsDxh>5X=KG zMCH8Vaz3niF&}5^ZSz89-VC5*p?t?bXtod0r=ZZ=I*syjeBsz_kJE$fURW;A>IOR6 z!@^1bl5or^{>E=M{D!mxJI3hs&z8uSw_?(ioQ+S%a-&|_(_@e$rP?TL{EFF6bO4hz zt;|*sw^8|g3*#4kYtW=Nytah`+6SvD^NhbOPowbGK+wP!=Qpqx=j#s6cRYqzZ3lX7 z5|{dpJK)CnRKKO>Y&pHX!X+!W{QXl4R6FD| zA{3t{Be6ucp9;IUqc9l)#j;a-N*Q{kr`#XcyMq-V-D#Q?G5UF0)FVCY^+a zmD#?uOstBj%VTMC^u6m`7Zb>=KPG!Lc@QxvcnW{;cua<&YGtzG{bJ#nkz;^{v?iqNiR8ka%^vlH0!!YE*RdVj@)zV+}P$-C#LN4u9w>cgSTt)2E z6}?)@q3%pH!yfuHS!5!IaQIyHqa$q^58+h96vT8aV9iQ-ep>|dpgfXbY@O^vL>Kcr zCA^no%=E=#76N#9TKbPjiZ3r5W1Fbg-R>;k(Ia7(2tU}w!yLwC42O)t=hE|&YC>>S zX`(1gOh?4fk3=I-vc(0Nk$bJ`=7=iBG)s5ZJw$seew?b6o-?k?h+?IyW0~4+Qe56$ zJWN0f@&uX_m8-V+kCp#C2Kf@|`oJ<|dWCoZ8wV`fLz9dma^)tx&>wh=D!`2<;vNc4 zbn=3cez7kYF9n+0l{#erXOVLLdt5p_c!TIILTxYzF2+m)6w2^0UYam{=#K3D*nyOw z_BDV8dDK@ZW68MyMj1OuDG`>de%Nzd!HO&n*$T&%>4Z($R}1CfOgI7;r+{wk zdYnWtaMjr191=iTmXepzNt9(1l)j;#s(s-4fmkEE7wu73 zhY*gKyG6;301nwqqCkg=hZ!Dr?hhndcOcM=G5cl12lqNHCeWsI+ZmUi>e?+?Kes&T z!X0^3jbe00+SpA+-x7e-HWAFh;+1?B#=(wtW>i&49az_%p0!dN)IcWShqOOIV6lI# zYB|lyZ(;HkiR&e#ZgK$e`Zc6>YuK=MyZBH&rw%Q)6q9?-_2me-EfbtF&g^8gbzEo> zwcIv=YCxZx@MDkT*}&!R9}tJ;P)nI}Z&lm%<#a8kx|&vS#R?Q_vTJ59KT!4aBW>Ovbsv(~RL1Q% zSlkt^Y|PC;;6nra3281SJ2!0li@6*e*SBfUb#!FYz@ckJlari%8v}J)K7u>dSYzW|Py23pKE?M`#~Xl31(%r#E6< zfi_=1KH4+?J>DgzlbzA1+Uo2z6-IU&n(b{3*J(Zwp3!D`HmC6SFKwo%^K3HIkw*Kk zVns8x_v6R4KZp2$`*a1089ERZI@Tza8ACjLcnwX0en{XbPO!J~tXvKsRCq@r*cN~d z3b!MwEc|0IvN8AQ0J6%chLYP~3c0p$E9ZRd^$C}V-y5i=7H?|2T3KD-P1r@k*L@kM z-V7x9Z$3 z+4g1tq>0Sf-4609!YA)ApKyMU=le(2@uMG|LWnl(A!J1=BBL#c=o&ke$dj|*CVae~*%+rNuU)pj2@+SLg|(LAp^qioWjz-{Gqwdyti29oB^#e@P2#j3M1^6Y zx=UP5{@elTasFQuQt~4Ovt>XgnU>jSE(t|=%ZnI;V4^T|QogOGWs`wmc+^QO2jk=d z4OAnA(-@-gUr+gcBa2#1h-GCXRa1kz0~@j}WtiKP%_%R^ZxjhA@!~s%R}ME{JY|2; zn?Vs5W}33uozgvVeUi`lFL1tAKrs&YA(R(fq6{{z%AmZqAHEjfwh5EbFGd|arT6<( zZ&f54eD-P8>@&hj2ksx?ABK+H^}ZRg%uT3-8_2}un$!a$@kmIm^d@wJGz$9=#506!S!7knKCFGSZ z?zL;iv)V~yN0S$jOuk;6$S}ACZ@C9})!#lI1~Yo=HI{};IkM=O^8TsoMmYMm~JKE3W27eP6_WM6-3dT4e? z(O93y;v$XrhLvySyIH8zlv!nb@ZSftqJCjMczn#LYZ=f)h%HmTh+ z&Zr361iH9vHW_|7-p5)onOy8qz00d@WvqQ-#^i3G#AFs(RJko$I_H~kac9YPr6450 zMbrr+H>3>Sur`UE@f}u^qDds->teUCuU(%GUs|$+zCLj(yQveI-|{cR<+C;W5Te4+ z;$u;pyb9X;<$M%EHQ#Tj?W$SfJ~$EintMQiOuOgvXSfW1I`{l9p*f&$XkG?7y=6*C zJI5q_q5nSIwaI~?#7uZAPY3*W>TtX|8`0KrxD#t% zurTVbCU!Jrxr{6RUX5UV7XSHTio`{N1mrQ0tJILBDmfz~;dknt8^cw*sUOGNd2QHV4L6V4n)s2he?u=sGlUA zDw7K$k>RnGbs;h>nwfG83E{N2lHaKd&A>JmqB0Tkhl?R#>pz++R9-Gb|6Vhw`d^Pk z{a*`ifu3@cWQr9&gkpZlbFbZ7J zsV?OwZ4@~vDX^=rWzv&(tTN{6LeCV2nW$@-Xz)4ECuC(@Equ8WupxHxx^P^XUsd}} zewm|upQkzCMz)@`WpyyE&p+Lb5|I` z9n#x;@G^4>`cXcGK$u1?Nt>ltdb0R@TS&743;2hGQUDIGnrQ!}@q$11PhxSt>| z`1$0p5%0KOu*@g@bvY%Ir3|59dco%_ed}1pr1qxRG>U6;8D$a<%k}xuhg(4Ht;#Tz zdThWTJ%g3tuAJ#{vL|m@=kxrprOxZxdSSsf=OfEB;Seo!DNVKhgPxEohWlCJIIoVO zvw*4(+{CFcU|7yC`04^!ok-A7)u47Ew26tKdxYB|UY8Io68;bV)*98k08Rou&Ti)L z6$3C`hC12FQvR%JQK0gcU?JdYn^Zrtm*bJxmM$447RXGpFU29DR-jV?6HNfViMCMG zLx(5r;!Fnpw4lkMb+dnrw z1@H*MED!^H21n&p1a@C^hHtbZ{K15^&e7EeGz=I_&s&DV4XBl zHU$B%O+sZ)a9+QhsarZ_68=ffR#ysn$g%l1Gq^1*2?dPx)9lpkB#daY z51uNFK|B!h9>cpP(tj_@q?o)phLhLptnM=XUHDPLPnbDXu zc1QXQ)CnSf>?1lwo2c1Hp~mlK=t!n7sYX#|RL$e!CyYSo34a;!56^HEwhWJ8PZE)= z1?JHv32%l5Z@ysLjDQip|J(L6Fi6^rrDql+d+Zkg#K|G7AgLV*^G=X&^h-W&M?PrL z=30er+xZL0B#>#40JP%_+L&?AYxC7Lb*Fqz)h9ZI^lg4*2WR*5o?aKpC)Zkz#92p} z4$y`Zc6;}w41M0iFn#^swG0$@6vzK#v>>*jkte68R}f0KyPRtk@O_}!4WOof_%j;J8C&Mi9_db~FzYvd+S)LK6e`0Wrt2vbq{!e4zXWgA&yTBx z%M;nct5NMt(E=dY^KuTpx8_=sByC0VJ#5&p#UOh8JsPi=XAByK*P6V6l?Esa`Z@^- z$p9rsAXZB;ZddHN)OpZMy;1y4JxiXNScZJMGV_6cS+g?XQ!OJ=xW;OIJ&aBt>#g$* zCQnv7TnwE)Xjbx6eG)rZ6JtKJTsL*JU7;W-`RmyVnA=iRYPcpKD$2OsqCgeP+AG2$ zCxCI%*@HIe!XJqc0S$J^5q`YV%k-DLWLz7`eo?jU?t)^T`fAxZ?c-*fjN&nA;z?A& z-s)+RQ22r^P6E_Nl`fS;n`;c>e=xIMWga4l`#ctBiK%KEShz7}U(b2jHOf5@fjLq% zmOSMvc?;m00*&9E#V6z}e(S+cDsol);x!eT$|xH9f7;x(=sad->H=PEDItp~M|JL- z-OT+|dutnc|viMl(h70-jQsK9Z7i}}ZANE~}$jjxOMzWNGbgLIX;MykYRw1Iu1 z9W{&Tq+&spq!!r+`6wocpPh*R(-ICHWm%tBccnqacc_vQe*frNjRkE|2bWhrnK(!S z1K(xY40RwG>Q{%z>Afe{$$g`oEl}<5>G@j^we81-hHjV}2XEdQ3(#yZtN5jnAweJ3 z0NV&#IjvmLt^=SVLShH$^5MO40V(Ni^h@>6*Zxa=hH#-I* zTDK1K)B7s6Ia>3yjC-K<-$N60TsxQWMsVDO@cX%3Y;pdbPE^_gtNV2){e|IXDaR zqE^YXGa*KJQ!w-`>m*TLT627938A_BdYqgn$u#QOWJ1R5!Phgqw2xZ>qq7pp;tKsy zBSA6oL8>~0e++7i%VJpJK%7O7`=k*>XVu&BthFZgRa6ux7#-s4IF&_hKKFFe`OPZk z-$YC9cV$C$=qAj87ip!%+NFy?afS#JeYYB&m>8JNcedQ__xf0awXi2mO#n;GyJ@^4 z)s-Kf83eZG?*!$!2D?Q*%MxciqnCPN^0qZZKX;0|JaRDU#p?Vu^uTc@oF0~xe9D)6 zk$V^}?pHJ}#Whi2fo0Ka!y(zuWq>bF+y;o-dL zcMmQ3EdE|HbQ+xW{_~rk6HQ%Sq%SV!@2~&5zG`^+yMjT9)q`eLJwEALMQK_r=-sac zrbP-U^OgNTI#t!(ZU|@8wo&Va8DL92266bX(^a5|R^x-b(7}*@lj8cRPf1RXq??}u zeV$)u2b|Jv7D49KBw(pe%*@4=c)jDA{<`jL_Dwf99mW|*m!OY@6}Wfm+*k7Mhp~t{ zuNF`Nr~EkuH?tw|J&86ANCJloRQ3mZJ3iu}cI)*B)#u01$KTk%CQZn%*%y26i#?07 zP&D*A+l3@oWPZ`o(KR0&#pLwg0i3OM#Q+CvE)9Naq7Lw7w65jFZ4K)cd-gyZITL#- z{2Do~F$T@Ow7C%#Uz|3{O630mRNAILw0oG^YQWY=UTRzM;w=k>$ohEEr`p zb340=32F|1n7^4Ye!p^|KdiXCiBwu6N&E0lSbw>N7;!nyV7A0$cGJ!bW)%urBn%?g zGIF*e8@@LklYnl>l@qH|?x0?JhL~UTz;tYitE_xbnkjf+Y~ZjGem!e76iN|i33bi| zKHO)97}A!~et$AJ6Ohaw)=e|fwlhXaQ-pceTTOjtm7Lgpr;8)6b^~IUn8nnm(oA)i zT$IgTWgaQy?>|oLu8go=ycY?eC6D5FV;W*`;e>%OYJ{3`PHclLCf!E)_t zXs1BUm~tN^PUhF%Y8hzWAqoDz`8D_wDR$7(zhJ39O{6+eUNliqCr1l0_5$22#4tlD zMh2G!U6G&Zards%TT+6kvwd6@BJmYBXbu=L;(uS`&E*eCITt5BxW4#uj?G{;R9}Su zdVfHzIG7ByoT1ptuHt8QB@Eq)_;RQDn}30_1s#FzXtX&`?#?Lc>@+t%B~3_{oVjA6 zZ6sw3Nt;(&!1bIbXi@-7_6eus{tE+nG+!`3Y{rueBN;k|6LLdjo-~}fuEKkdbneYE zSDbc|4zDePf9AwkD%$z1(0@b|ZH~n(y4{+|V=H?dYnPTkya6S;Sw=GzRO}!pa*>wH zHH;fWQ528cSV^-Rx3sSdPjcUMQp6_cpODfyS@qF_2-3~$Ihhf=6Ej+!_f%eNe><(c z>oA@F`x)KSsT=udI9=DZ7D^q%xBIr?WxGs^*>Y?qS>!UQ=@jDbOM&RtRRRKL`lP8g4Q!8H;^A(^66Fx%jL3jJl5+o}X; zDE6@&MC*i@licNMZ+2w=tdt{3@DsFi(46@9=c}VqmI9t$ zCXQp;O(oYeOtE1bJ6SR_fjCK`->vvJ{O<9=C3C&62qnr@ecS&y`RO2<#mqx`XgfEue z`QgH;vR9!QbF^MyGW9*Os>`!%Q^GCQ0MKKih(*#yG&8*(tkEsAl=$VvaZo`dr4=rK z(m47tVgkL@OYj-s6h9UoaPI(Dz6gogoIJ#umBQ;~&+K%#lE_(x*e8;m#=3Gn8f#+P z;+aYjILVLp*H*>!vzGylL%J@yB7!$Xql(!0&4Xk=LPei-gTgRl#_i_27yj{*v=N2P zjW7aU2{7UN3b89xI~_#uV>Jx2=CFvcgcO;MxSu2TE3J}QZO{DdS2d^u*l1wv=&;IN z7xJ2`Grin!iYj;!$V3_`=Sx+GT3rh3{8kBEt2dY?8msu};4)==Yr6guh`^-XY0?^1p%#k_KN`cX(x&Bdy@iW#RsOHSk=^rV$yAYYZvAVc{oiJ=NAb;jR%2Xa&R{+N ze)ohlqI&uz>~Qxz5QTfQ^gx}=cv;wi?)YcpVqJIg-H#;%!e2C>3*IImcPB4lWeVpaGn7?l8!y# zvNKCPT=<3XvR!{}RlKd#QuybR6tg0?d|r%!QA6L<$ooQUsaWOnbkZx(*~6CizcH~; zWTHN-RP!t+Dd}>|;~!>qvAScHC9Xt5HBSd_lWb9x7P@Yf_Xp|JKsQ+8Ai^nl+WI~) zFEvpZ6MS`sDue$g5pQRP+HF3t3!MY)^)`O0dFbPSGlAvkxB~Fge4tIqIcTJIAM#H+ zkmjod2ku7@ZemE>%*;pwHy_Qh1nm?4@)l{0Q)qyv=*thnl2Z5=CB;9Da!pf~CVvWa zP6e!+E?tl!*MjpPzmU*&ySk#ivg4-ba4$QkYb*z>9IFA5#DoSqvZ?72l{D7Ol$yMg7Ypf zS51mp8(#M?rnJa89CsZYWG{b0 zjd-szAV@akG(?YM>8$ClwG@J%Z;v{xP~S>tJYU>LeSyNB80DoTkew>!R?#oiFSPSW z34nz~KNe82kSx{b9Qp3}!|N$ted!cl4)gVFK4Ej97nP<=0=A;lV4A) zFjb2HVHQLD=lz*!IYZ^}^FdvJRCf#Y%<(F3%D}rQP`}C{~ir}~t!6O6} zvcU`(g(}`i9|cvO(hIHV{xQUFe;W99A;Csptp`4W^?d zDr5j#7_!#ym+pg=-qwTB^O|sfZ_r2ZMaY+F)Gr+|_apj1DwXMk&2d}(bdjNgH0wzj zD?nNpi=-L1&wLd*c&VSC3$;&u_p&g}vW|w4%qJ!wrcf|`+ih4d8PgM=N=+xGP5s5lBmQO(?W;de$tJ4J6MC5n zCSAfM$g&*qM8`W1xQa=5M?=@7ga6Sc@5x+}jl; zmH$>tuSczS7q@^!9fTAFAB+fVCzv8TR+sH-Q$+>EJR49p;1*}tr90BCq^bo1l?k&r zm<~C*`Kd^$0URdVog1`-{5R7QH@}TXYY@05f;fviYHhDMtAuo8FzcIlBK&OfUE|A< zqM?4DWBc5nZ<)eXY5F=I3@#rC@Y8iOJ!o%-R}t$!Glc=owr2G*f%x!};nzH+C+f{!=hq%B_~x zQcf<)FyU6K#%zgZ#aqQOnSK*mD=!HDCj>Wg#KK*b%Hb;-2MworCV_BxdFq9D?4n*3 zQh0M@#&Z@QUJ)+}?H5)d&;*zKuW7Y(dUXs%4S`^1CDAc>>yBm5gb) z9U>*eCc*$uM)($Kb`V7Idi&2O;vg4#Yh(a=%U$Fl_kLaml_?SFD3%=dsAo?ttpAL2 zV8A^q1U-2(~)MAgeu}uY&~|9GcghNBZTeW830@w`{rx|8{6o>VzdH{UHf)3G5Iuo^7aR=!wYu z%?YG^=Uz5?KIkZ`b@(0RuH&P1=nm2rXUv{)j6n7Jr}krxqN&_*Hi06# z0q#di3zTPofGbhclI7+RnwO`a4wEZ~QZAObeCn4u)HQ_XpF&!r>^wQX1KV#iB{=%M zv6E3%-O0;0=<%?>;wSaM=jhES@uycw6hq8SUXj|R-W;$R6XTWkzP(&MUJ~6@rg6Ni zZjJ;;P!3%N`33QYfo}DgUr~4#7fBMR`P-s}EQo@zP*5APL6-RY66E`#xS4O$W0Cbx zG8WjWo|P+n(s9b_=A-KBoCC~F7&a~+ZL-mb_F_|6+V4aE&&ue`6?;DLWMW=8A*O!h z+%_})QJOZMs<>pgzO=9;CeF%5ot0~DX5*@R?Il;PNn~`7rl@-3*CXQfq{UB~+_xIh z=d%X?y|NrRnt~UCYgi9CQHNJRGA!#${B~rrf@~VuB@}uiIwy!nIFEdtyQykwmAqw3 zWxVjuvO!>YYo-6k)L#a*!9U;sFoEFi?he7--6>wQxVsm3cPsA2ix(&s+})kxQlK~# zhkvfm_x{b?Px3G`nc3NQ_Uzf$!Pm49-Or>d`mjPW98M}#ORAXFVg9AV>*O6k{hs0h zm-et|iX3tHuY+!IW<8wv1yn4lYo*^4Xd3ZHvhQt!BbS}w1*nn8VOVPNdsiCe){}DlhXmQX$*p&huz!K_PD`5ici!aYgVh&Z^6c)a^ zF`1M<4S5?1>K)s>Y#MrJ`7+sk%&fTm$~RIQaWUL}C*(qRhW70+Fzt>sZ^jSm*u6W6 z@8dLX4Y6RA;}|b*?2&BRVr$0x0jtuV82`q{d5cf2APArJU^DS&o{;zUZ~puj)V#5F z$7Dkb`I_+?8I=iT?d3li>oIOKS1R`zX)Z%mY=VzbUa!Y%GJw z&X!b`cV>Tc*>My1gzf%`*!&QklI_gfWQ1p+wqqpbzOCQ1EMxe@ygfM}{R&OPszin_jt#>^5nheIO~Shll!`1a_9QGs8CA6e{} zeD`E%&QGHV6a=>|(I&%|=@73@Uwm-F^C8b}Cb~gVx1EIS0ae2T)8p`w-gI{gp#v@5 zz5xs;2m2v=;?J+;5YD;?%sgW$qROg1YV`UbKl9v08O@gsch*2LH<8pCel;!FI|%Ec zbp*5WZqFUTrO^XQV$_!=}#32QqTm%o0=ahw_Om$ zBlJ@($PJLAq9V6HreI8&qnr~xjEz0(?GK$ZZUt>!QGBxMU9kVer8(yv>*_rf>sQ9z z?O-OV!clKsQFJk=yGTNsP=4c6DJF!T%LQj5zxa^MTMJR?3Y}yLc?$BT9$#5~lNS7w zH23E`d{J8Qc=CuwoGZNYM<2)}d^1h`fvgV7LRb{qV$>ZG zdiFaAq8{%HLT6w3yfhg7mR$pK1~knUKn-7(d2G%KK^UuvCWbyRbhzZbVQ*t+rVH2N zA8Q1^E^uP)5v&xGc1PYcA=h3JHd0X71XHph84n0EGQp<>*DK z)5`{K54x*Mfk0F=awfTeHCVf6PP-mtATiG{w5B-@g(Z|_*wH|<^~Mr+4$)l2_4#m6 zox*aQQbtx1qY}QJR1@w@DvL(%O>LD;C7%JKIq|5xZP5C^ZQ~}KHh~fDmX^d?uT(R> zWqhOAJdO>o%Yg>W5_acZtiNI&IG(4WdjaFs!STPK#fRCl@SE$;3h(@L|NEymU18W% zb;y%)GneWy4adow%}K+Uq|aAfzHI6#=Gs%0xIF>#9*P66km}3*xA8_bGfSze#nTg) zrI7utq;1(SnWFM;C@nBu^ydx@%pJhwbpA&6x{t3WKhZA{;;0{ll|_VUp=a4#7Y7Lz z-Htf+XHb4aGz;~^o|HcR86m&>uEF{0%OaQiha2cZyv{`!wxH8sTY%haS#34w&iNjSP5Er`ZP6qCNu+j@j*Yn!9cmRKlaK=B=8V4cP zqMxNi)QtsV4mBnFg5tqOVaTXUqXNEAK}39*d}t&J6jDZf@2m%|QxlR99Nmw3XwGtj zF#bMt$J$UNO^^3a@j1ab9vZHovmg`4_ zy^(v3(JbOMMQ@#D&oO7EF-DUw{U*0!-;S#$524IY+hIO`y0>!a6f|}?v|TpcYwTb~ zalq_oY^lYekpMi1{vh`0U6`WTDQZ4N`0^tUt$ZomE|daLo`I~xG>xyQBfrp=du7^D z?)do=>A!Qa@LeER(=n*`DNcJOtv5R@c3Xnm{prmOfBx6u(+3h`Axq5hUrs)>HJ(?a z=j7*OKW^K0LP$(or_|a1TB(FG$W9%GCLU-2YGuFaP{H0*>m;Dij9Jjt`Gw4ZY_;=G zR0`u8dsM$(Nr**4BW!yOr+&aXG}lz=a&<>0mHQ5MI?P9;jqYfQIvTvL5OsUTzpVlLD(zsmBJaN#D zKVU7-3L?$DgmY99zh_MEdxkRPS)O&qGOp}Gx5`*Q?5+`}xo-4&A%d-wow;B2i^^7$ zTS4)2%M7#=R43oFcz~RzW_#U_EFAD;0SEZ9r`eIj=A4+V2T;qmTqqMlVV%!5R(8uJ z6`C#|S8rJ=@xMaE>Aw04I$emuIvQueZ1*JfrKNdMw4jU%8--QKI*oXmo*L`+ z@3bu;B(g*rd$WT3Eqz><6!x#Gos16`sP<7vvJ+Xm7BHG#8UAH9wSOO1sRf;dFB{JP z6=hl?%7}dhfeMjjP20zj%%S2Pzwc7A8Gpy?q%y>NREHTGd$A`bshmUU5Uy`NG}ioV zfC>*tEO4&jjr{xe-=golX|VBM{xqDHmR6QIX{E5L%-3 zD_lm(vb`HW!V`%<^Gb`V?=Zb_6GXi6zsmy{Q;9B6>80OIeQ~w$G&QyF;yC>Lc}Ulk zU=50Z1@N8N(PKR5|1f%Wyp>;xk|nV;?N`>@g5znu5B^rK&&_H{6n`ZXVnW+VZ`Nz; zyrc*pRt>9&K$H2Nf8^`>?|6{d5BSv<%xriW*C>d zzi>TJTz%!_O88Ghp7o0#7CQR0_(s84+vU0E<3!Ed<9QZKTW07--Jiq9kx3DGR(tVv z9}2T0tIaig*7dGtsPig@&?k~wj(yCgM4x$K;_+PlA2Qq85XS-K-~q=x_o**zFeC!OzbW4x4R}{VJlUDuD~j4=S={ zJU=H}@}QDP6ZIX|e&PoBqKl8;IB04A0S}eD(kk4JC$rA(Q8ihm=8OsBT&tCQVqtg3 zNk0_e4>W;3k8E-1*1nwV$8gi?-a;ZjiXATB5zT)je_b#&^SEaqe?)n_uow-^&(N zXWk_rW-LwlYNkDq6gVwS3RTgAzeb88*Z4%_M{;e+*B=LIVC9#g=l2Wi}dqz_Zl9^aHQe+jPK=x$8Zx5O`SZXK?$I^MtL41v>enYtPS5^RXdhBRVLg&-UE4`&nu~jKHBhWmPO_9aOlWmEx(WeT~V$Ul7Z*k?KKoUcw4RmWw5r!L0 z)^&_uO(iWaE|B{{@d=W!G*S$~W~mFJqoZ8JeQn&|#mzl}Mz8}w&O^C(GoBAnZH;@& z3A(SDcd_MUFbZOd{wQz$8y1wVx9?xo?0xAxz0yA+jNi}>@ke?DH+lXMpd~l-Ws#;Z zC{Udg3rlgRQV~J~H{GCYu?QwwT8CgE%@>#9Utig;{dt{7@rag}Bn~Yt8uib@tt(m4 zOm=3M{H^?@e7QOMR?5Ir0@5SXy2@kh{Lz)$Txwt7nZ(~{f z<07e+o9PIfJ}Eo>`$#-#SXdNV78`_i)wkKPHKO5{aPN7*XDiP%cY{Pj&o)wBkJ6X3 zlw0Xi$}v>9XE2oc&%@TZ7#GH5bOLLYHN+`$XS^@um^;30%avqlNl0yfb-aSqj0s;} zpC>mn8;lpQY=cYR_f7nzZXL#(#UAd0SQw*kcK`uTyVsyMJh%^Ht9Qb`oH&jJThV=A zXguUH2XX!&7N#HhTKnr_jv93ZWmL}N$hM|5kVIW0!5NK-)38|oZ?j|J(&NPU68Uaj z=kljqzXrSkZL=t za9XwD$nYr%_?!UV+J9G48sA9!6nU$VDD4$Cg^lyDRn+yx zc16@Y&+1!sO9qL*F~G7Ls8(s=QNb!)w;EGO;b(nhH$GB z|FhiT(%8`id`SmZk!@VD^@hI9c!^I;P zh^stsZ0niDju z;^HjpS=AEPGccxkY6;pWsI@NZVYTORt=avHw%Gcvgqfv_(o=x!vR$pjZat%??W_G% zZcgLrZc_!FAyrMul&?w|Fxqj-RKsK#)4J`8{p8bL`9nhv(8GcoIe=32d6T*9&6tJ> zQAwS9Z*mNqK-7Vs?o(bkb(Ct65wB;Y($m+}J3|k2A5Ds3OWu{n6O=ig-}LO}kh|)3 z{#?bX@~VDa`1lXVI)(hVt{i|(TxK?~;~h9$XAoWp7Q!H<-j*?$GkeKNR*1X1DTs%ym!1FJFoo@ydTSA*+ioScpd zy?f5*irxjQ_vd3?0{qeE>B|uPC=ht?ana)Ous}z_tYMxbi+IWE|Ldm>G6_u3gj)<^_U?$I z2-j)9EoHTvWp|&Mw8PCuMKYtTkHKNYFYyrIPdWPx7aqQnjY04sHO27Vg63?Fr=4OI zg4^yK7cSWh+i**O`}J%??c-tFZ*Q|Z-`D3Zl2?-}Gmi@nxDXL*iqdWU(8Bwxgo%+U zDaGs6wpwquc{*XP0POcyBc^U_0YLHZih(q!VR}mPcP+YZ4$cy#Xr=5?Eb55wJOvi| zY*b^C(k3NO7C;XwMZ`e2IZA)gcWx%+q2p6MCXHlk`O}Lc0(O=$ZE;j8q)JFxPMrR* zn=BAOc1H8T&Rup6Ezu@VDNOm~_zBJmHNr8)$)18q{<>_rdkt*M1&2ZqytwG0rLF&4 zF$2+1QOi9GqjJ?kndv|ifY)7~NQ@{>T=gx-LY;=6<2iFKzCB+?Yv2+0{&cwkgfW~H zoTNjNZFOMmQGAV~O)}NDT>(zW#oCf^Irwt(8OMtp?XtVcrq3Z=<2V4+I53CqbYMct@7;pzj+cjT&KO$M8;cB?)_Uf&R_|Bim zEsU(1q#sduZxG_wfBcYb(MNWKvu5PL!#PFw?_0{lsBj_qlHQfx~hpr+9TeGimrxJhEc4 zu1w#NLNjSyFc97InuGK>;!W>>b@D*eH-1~c2r>n#Y+6Bjp<$4Zx-D^Bs!6TU3 zzwVQum5(96ydZ^{5jukyXogzO^Zl!AewI78<|X28KO(amQ>p&a?lM*$=EKswy15Zq9e7B`aH>iBUK*;o)=Zb$ z|A?c(AY`2A6&VjEKuHyJD7V2prJn+Ky`b zZ2xG(LTR8<;I!jsW|a01dF58OTJX;b0-tkbwB1!r_6K@0hVOqjO3kljND{Qub79n;t^!S!}w%iY? zBfPB0J}KhBZ#n(Su zKp~!@(c%QlBj{D<@qVgxS7+r*)V60QX3*(Z?Dwy4pS+)+iLWQ``Cbd>7fOSE`y(5* z-SfV_<=9^*+1Jw>MjbnK5YF7@)qR}jIC(#JoaH{q%xrpN8?~K(6%LxHeWaiH$bVp% zPA|9)k~qrdTOAa3ufClz^n)p|eiGR}#}i&T=Y8GJF}NO4S=n#RuOGnX+fJmve5ccn zFAUDnqH-&a>ScD9G4!~bobrc6B%Ni+(u%)@#MknkeF6)zzQ{ve(%6(VcEDM0ZP||2enyx zHXg<9x|{L!EdWf~S)Fi`Y(+Vu0ywM)LCAC4%6KrLxXj&UYNXJ7s7qkF?u-_7LkCnV z?^@SD?(H~(r(o{!iZJl32LU*ophVU!d6ECrhA zWOp`+h-~BGUn+LjvNv7yfMhRj#`%tIzV5+b-%IbOxyr4BRKA5dI=X~}aN!%_vrjlr zf_Y%F^rWvTgf^<;*d!^aVxO2Hyhf>zL2Fx48a7n)Otu^V=Vp!qGpy4WA7rJWFsayN zPu<^&pDK6!mhA@d1dOqbi7IRfuS(B!;VnF?XsVRH4|`}Jj3$4<%TR^qT=wD=mqlu> z!&5LH-cbk*`B>?O>F+R1dT-rMc&u9~aUQW}uawe3vD?OlX(OF27&))&n>g>xJ{K>z z+&&??JF7g)_vuD9a$13f5%TB@PF(MS3q$oh4Ad#Oj1A21D5{r#V1EOUO2&3Q3WgGK^R8Z`*im+3+9^d*TU1h`NKbc4jz?cbhgL7&{_x}*cCa1LJ_G>mr^namqDY%^Swi?z%`ix|s4ThmwQ%rYR z2`JyFAlQPY)`G*Mz~bM1gJ!g9YsHC}d;pKsxR>w~J)a9E?r;IKe7OSmn99o#ueiNX z4SsfM?8sSS5XhNeXD1Ymf|}3U34+KvF;8$Vtl$t^PS5P)i=0?h_;~ znZ9OHX)`c0%PA@fKHr^0d7kn17Z1G?fX-5JRfCthKa^-iALg47vp!F6#(EDQxW7H4 z%FF*rXueb4KbZIvc}lo~GGhr&dd+^RZDxtED>QF+u{W^b?jQKs|0j3dVuUu^!0=@p zpIhUSf%D(-{>hxXi@~BtGpccP@G9;>ixzYe_l-W>)12kWtUpT~EC~y9^z?+aES}WG z#FL@Pz+)YTMI|wBhUehqQ@qiT+eUjugd*nt*?$MQJ5}S0#WOkT1J$nng`%h zacswR_Vd{NL&zYwB-k=fE|JGn-sN#7P%?O1=B z|B&~7!O+2Z^;?8SUiV34t+9Tau?uVOmdHAjLP8kIE8@*M+=h#j6ykt1zr(XQ*gnSw z_BQH=Fpm5YB_S`1zzs7i6N5>Uck5e2yr{3e-+R%(QI~l0WZ2MQ*)wXBCVAtanXrF zoL-Oh9P24Gn;GwO_VxgJ@JccE`^kP>)f@ayf8#zYhSWSCFYfUFg`HF*VX;GVQnh3> zmj!=^uoP$`q{}_esEk~=mx{r~o6!&0ZP77L$k&~Ga3%KjyH|0#)613se>3;hejJ2i z3e*ay#NQI@3VlCt>wQ#0ThIZ@&KjW;ZrELLMk!}CEhz|QpkjwKsMzR-*!cQ{M3!E2 z@wjjSiKL|fnuuaN#(mp#v)@W(#ZI(hq27;d@VK&x;mGe1IBpMYOld)bl1HD1!T|_ z_^G?D_FVYIGD0a>W~TL~Xt!DgN&5_(-um+=CrIxnFbod0|7gk}=hkV8ZBKDv5G*+x zaTFJ8{jrwGdLHnN6@)##YSO0gDFt(_nPc zQ0tx-esr?TASkNXC*x+UP(NM&w$q04Gjg!5wh}&6qeL{|M6kl1SG@5dyPOi5a^MnL z2rv7|6h|k65axNMpV>6Q_4OWENoJ%CCH#&8!7q?C@Nr8}d3~?fr~AiaFUoHo&fp-p zzt^juFt7`@zjk zh#8p+(oV`%wTk@|=}JBu@b`8pbae+mDyyO&c>7TT%H&8ZUaEf zIpUSwN&gr40g*{!X~5EuWW4Y+OmUhq8sb40V|SKOy_)hWymW^`Lz^GN&p*$ja|Ot} zXcMW#b%D-EN;6qF-m;c`xwV?k07O3vwQqEXSiNdWpDmDW@zpqj!=X1GvHu8PavgLy zh5IA_oaqF1p<2X?>#WyNR@tTJ41vsfG7~bCMx&g+01TF%fW{{XNJ_FV_|`k^dK)R8 zL{_fdL{qrxIx5B0V@vUmv@P8xVE}_Z`|1Y!71qI_A=9Uu!^&z+q4ik%k*a$9tH!-R zz2ZZzbN^GQ!Y&}0FIuOKoS^bKuEJ;R(%J|0FRP+w#Rzo9197idN*;=xrK3J9{i zwvCljn>d7&Ilyxt32aarFih#fH+_y+4Y8IEbY#aRUaui|JK;ISD@fkO4(J*qhs=NxFwj{-X`d{xlQ|UG8$q*Vp2r00~xHH?%%+R>oY4;^d;D z=px#*5m>D~8LbN$Xa=n<8D8(*7Ay@>#<+2CR_RNe!kN#Eod)3H)}Muzt)Vdls%mtD z_(|AEiM?rSVq}o*+G#=N&oNTMJaiSRvT;C+*qYMp?uJ!3faV3U6?`2ezK1r=6oj)D$H!UN)%z z`!5n5HZ)HT&l%auX87wdf4(9lRys|_*0s$J0!X?P&@y@Mpn5fX1U1JMqFs(YUB!Mu zs;|^STJ(Rk`Bd^p7>4W>NYUKUEUSvK`Y5eFI^H^@YeG{*d$shVG?_1W81JS~lJ&|w zGP^_hueMTVsgDqMNBGGTZ3ZWsGGES#eX6i~5XU+VUjOkLp|{NrXS{(Q68uwL4tlFB zwcqKX7^QuD@|Uw8*BYEGxZnWLkJ?%p6%{n!`_l*rScV8{PJ@H7d(VHZZ`ybQyxs?A zj+C99{b!*9os*Lj1)=HoH&#Ocql9I7iZ9QNhu02`%KkvQ()FmpWyz;I;3HjW@`KxM ziuilFDw2;1G8ddpw0o)jy{D%ikr?iEo(#*eb}H>PmP=2bJ~RPKAo9?fds~P_L`!oNL4i5e**i|6lsHk$P)Oj@j z$ovfg1IYd>6`@>KDAk+%sVt9LX2!i;YYQ4cNTVmGp)e#Xfz94lNjR#O!nV>FjB+`% z7YM-hsR9sWNb2}QCPa$C;~KL~)b0Yfni`G~3FVm?XdW6!Y02NvrR${yY9`DvawvoVxGR%jW(`2-ju$O=t3m}^!wqPZCS0Dq;9M9}x z5lq->yIFpgWsA$sBGQw*LvM^n1^MQ8U8_1j&<*WV3P?O-_c%d7A_Rd?+=@b_zzrsQ zndpCbI00SBk>sI8mXP=ZRj!zAVg!rI%`;+}zwzPycHiO*d(+I23urP!eyh7*XR_#n>WktA}y>l#A&S}%;` z##(OUuMM{woZD1~>cwC%Nt4x7|4v_6qxlG$`*b4p&&wAL=tAper`pLYo=VCQ{QRx( zD;X|V_w9!rQl6z#qV%OX(74SfL44&a$nQ}Wm%1XMRYI;OETVq@k0^qT9}qusZvRxO zWGI)}k)&n(#Y9$oIM{n5MPvi?W}27cS({1c_azKUbo+K~?NNK%0$kuul3RVyh728- zlu>Os{h_XQXXUn({$DkHrAV7FXS{N7uCBI$ZJh{(NhZMxw-{EUEK;Dy7^O2AJ<=ZU z$SUgBHF`y$Y3qq!(Ppo8&~rne0CL76;sE_|oN4={C}$9NYOKIKMxyeEym1ubMUr>~ zFyFud>Ie7^^W*3@Qk<>KSv`MEjs`}2WeYkI+oq1(k8cb9{&P&(Xh-H0j5LGYFC&^Q zxgZm&2NL-wDT`7^j8v5>cOfqR4zmOe2T?^MEZsK0)J|GJpa_riyJ(qGMF9H(@^@C8*%tp(YJbxXm>=u8Z4$l6lQO}CEj_(_y?n~ zPn*&pGG^#%S<;8Y_9|gi0t41Rx52FW>~k>h?ixb;-V*_U49S}7_JWB^c%4l!iKZ_P zJ?IxF%y*VsZ>4#kp{6`?+R-IX4+RPD5w~hgCCI*oz1$OIy+1WfI8ViB5qICN+crROHDEJ`uMN`Rc}=FXEp$>pzs%> zz=++XprR*8H36FIeqDyiTxfOscpFZ}mM(MAMs#_`8irG2Tw_lU$e;&gUn`~@?L4;v zb$zf-2K^xey- z=ziXi(d!3Ey!~G!_Vue?TAN49%|j7ms}qaoh94^5gv<&hqwyBgl?8_z9?^ zAPNAA_l+W21|HB$?Udf>uzxTr^Re_2GlwGhN`h0QuQCROEuZ{K_>+C8z>_ zR(~r(xGJ9i9aZs2pnzf|cP(KE5lK1P7sDa@tr)tdij(uRQ*J(ZTpF3qU}f5kAMomt z3PMO%o$BT;N{j5k9)1AX%nS$fUtf$_?>prvF9Hb#3&v0?Buq&)Y^>}MDEwrOci`L^ z<2N4e`;va6{?{~lis4Ck^WM1dj*bk5RYWs?#@R#UeN36y(w&v)Dp4SZ2ITBz=VRVq zn4bc1p>@TqP-;M_is6$00>xs#p7DgaXXnYefoei#e`83r{0K{@iFS={NOUwpjd9Nw z$%X_}(P6;)2WQyZW=5&-s*gsNfIA(8FCO*%JC(b`$imB7>~i8u5cwVGs8+(#AgV)l zjXZzVzzdFg*=nb;n7k-pk^fPeHst|nl0n2X^I7g2k$rqnxYc6%lC+7efk2*tHvV-r z`sKB2NVbx2{_ju+vK0hctdQ7_q?#&J5ONZTBNN1XgO1%sY0{d%^W>n)Lr`E4OdnZ4 z*e{aKKZaEM!10?!N}6O|kFT5fS?qmU2cIoWQqy~3)ABw4WN`v-zy5tZ zp=S74X|jn`61RNFY3?9 z*7T6GJi)NnV$D6D2RP^JVRE5n?h z#Fb7C!D*Kjo;pOt_Ugxr^T3~T^1H1CL_xF^<_6sVF1M5BO62xyTetclU2sxBh#~Rf zOy<#8=yU9J zA-X&&-=)6{3})rHq~NzB1eYxLGTUJbm++>ttq^SSxK9$yn!*rWSAE*snDBYswX$;-R@cb_i_zn9> zK@$H4(D$#nX7;3KGH2O6D%IGNn-SojA7qx(f_jIojexR=q3$;fd1ygoFCSNO-2dWx z-^oSeH-9-MAMPh{GrbMHJGwlc9IK0Yu{L;6GDUUArp37OuT_x$5_=I&z34>8P2te} zh@)3~H&f+KBt}N@LyvmDqsQ_8kgHVu6IU*v`B>wnwoxxeB&TX(PX*huFK0et{6X#( z^y;4X=}*G5Pm^olX!YuQYtOESKe@>!@CyMuMnummBX8FopB8w)uL50esK^E<;Dr@L zfiY&OS96cf@mqyiz6!{q2iFTBORTU!K9+zS4K%SwcKC!8)Ri~t7}TjysX_6wEDBZj zbFIU0NMBdhnNcf?U3zT9r*g~v77@FCJZz~e

Gu$r2h3*h?XjEqP~ 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 YT>1_}|7E?P7l? literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index f5fdadacf..469066920 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -1,20 +1,13 @@ Welcome to RAPIDS Graph documentation ===================================== -RAPIDS Graph covers a range of libraries and packages, that includes: - -__cugraph__: focuses on GPU accelerated graph algorithms. - -__cugraph-ops__: focuses on GNN aggregators and operators. - -__cugraph-pg__: focuses on providing support for Property Graph (and future Knowledge Graph). - -__cugraph-service__: focuses on wrapping graph features as a service. - -__cugraph-pyg__: focuses on exposing features under the Graph umbrella into the PyG framework. - -__cugraph-dgl__: focuses on exposing features under the Graph umbrella into the DGL framework - -__WholeGraph__: focuses on GNN training using shared memory. +RAPIDS Graph covers a range of graph libraries and packages, that includes: + +* cugraph: GPU-accelerated graph algorithms +* cugraph-ops: GPU-accelerated GNN aggregators and operators +* cugraph-service: multi-user, remote GPU-accelerated graph algorithm service +* cugraph-pyg: GPU-accelerated extensions for use with the PyG framework +* cugraph-dgl: GPU-accelerated extensions for use with the DGL framework +* wholegraph: shared memory-based GPU-accelerated GNN training 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 GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 005938f47..374a529d6 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -1,13 +1,16 @@ # 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) -Or checkout the [RAPIDS install selector](https://rapids.ai/start.html) for a pick list of install options.
diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md index cd9297abc..9a93ed6c5 100644 --- a/docs/cugraph/source/installation/source_build.md +++ b/docs/cugraph/source/installation/source_build.md @@ -41,7 +41,7 @@ __Create the conda development environment__ ```bash # create the conda environment (assuming in base `cugraph` directory) -# for CUDA 11.5 +# for CUDA 11.x conda env create --name cugraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml # activate the environment diff --git a/docs/cugraph/source/references/cugraph_ref.rst b/docs/cugraph/source/references/cugraph_ref.md similarity index 55% rename from docs/cugraph/source/references/cugraph_ref.rst rename to docs/cugraph/source/references/cugraph_ref.md index f099752c5..a646d6da2 100644 --- a/docs/cugraph/source/references/cugraph_ref.rst +++ b/docs/cugraph/source/references/cugraph_ref.md @@ -1,97 +1,46 @@ -########## -References -########## +# References -************ -Architecture -************ +## 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. +- 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 +## 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 - 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 - +### 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 - +### Hungarian Algorithm - Date, K., & Nagi, R. (2016). GPU-accelerated Hungarian algorithms for the Linear Assignment Problem. Parallel Computing, 57, 52-72. -Leiden - +### 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 - +### 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 -************* +## 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. -| - -| - -********** -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/cugraph/source/references/datasets.md b/docs/cugraph/source/references/datasets.md new file mode 100644 index 000000000..3d45dec18 --- /dev/null +++ b/docs/cugraph/source/references/datasets.md @@ -0,0 +1,21 @@ +# 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/. \ No newline at end of file diff --git a/docs/cugraph/source/references/datasets.rst b/docs/cugraph/source/references/datasets.rst deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/cugraph/source/references/index.rst b/docs/cugraph/source/references/index.rst index e70df627f..d7a173a83 100644 --- a/docs/cugraph/source/references/index.rst +++ b/docs/cugraph/source/references/index.rst @@ -6,4 +6,6 @@ References .. toctree:: :maxdepth: 3 - cugraph_ref \ No newline at end of file + cugraph_ref.md + datasets.md + licenses.md diff --git a/docs/cugraph/source/references/licenses.md b/docs/cugraph/source/references/licenses.md new file mode 100644 index 000000000..dfc950023 --- /dev/null +++ b/docs/cugraph/source/references/licenses.md @@ -0,0 +1,208 @@ +# License + +Most of the Graph code is open-sourced and developed under the Apache 2.0 licnese. +The cugraph-ops code is closed sourced and developed under a NVIDIA copyright + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 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/cugraph/source/references/licenses.rst b/docs/cugraph/source/references/licenses.rst deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/cugraph/source/tutorials/index.rst b/docs/cugraph/source/tutorials/index.rst index cce352509..525fbe4f5 100644 --- a/docs/cugraph/source/tutorials/index.rst +++ b/docs/cugraph/source/tutorials/index.rst @@ -9,3 +9,4 @@ Tutorials how_to_guides.md cugraph_blogs.rst community_resources.md + cugraph_notebooks.md From efe27b12629f745e311c1fd3df48b2c21a3ebd72 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Thu, 4 May 2023 12:26:11 -0400 Subject: [PATCH 247/384] Fixed notebook links in algorithm and cugraph notebook pages (#3515) resolves #3426 Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3515 --- .../source/graph_support/algorithms.md | 56 +++++++++---------- .../source/tutorials/cugraph_notebooks.md | 48 ++++++++-------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md index fa2e7cc95..60243fefb 100644 --- a/docs/cugraph/source/graph_support/algorithms.md +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -22,47 +22,47 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | Category | Algorithm | Scale | Notes | | ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | -| Centrality | | | | -| | Katz | __Multi-GPU__ | | -| | Betweenness Centrality | Single-GPU | MG planned for 23.02 | -| | Edge Betweenness Centrality | Single-GPU | MG planned for 23.02 | -| | Eigenvector Centrality | __Multi-GPU__ | | -| | Degree Centrality | __Multi-GPU__ | Python only | +| [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) | Single-GPU | MG planned for 23.02 | +| | [Edge Betweenness Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) | Single-GPU | MG planned for 23.02 | +| | [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 | Single-GPU | MG planned for 23.02 | -| | Louvain | __Multi-GPU__ | | -| | Ensemble Clustering for Graphs | Single-GPU | | -| | Spectral-Clustering - Balanced Cut | Single-GPU | | -| | Spectral-Clustering - Modularity | Single-GPU | | -| | Subgraph Extraction | Single-GPU | | -| | Triangle Counting | __Multi-GPU__ | | -| | K-Truss | Single-GPU | | +| | [Leiden](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Louvain.ipynb) | Single-GPU | MG planned for 23.02 | +| | [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 | | +| | [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 | | | Components | | | | -| | Weakly Connected Components | __Multi-GPU__ | | -| | Strongly Connected Components | Single-GPU | | +| | [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 | **Multi-GPU** | | -| | Core Number | **Multi-GPU** | | +| | [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 | Single-GPU | | +| | [Force Atlas 2](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/layout/Force-Atlas2.ipynb) | Single-GPU | | | Linear Assignment | | | | -| | Hungarian | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | +| | [Hungarian]() | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | | Link Analysis | | | | -| | Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | -| | Personal Pagerank | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | -| | HITS | __Multi-GPU__ | | +| | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | +| | [Personal Pagerank]() | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | +| | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | __Multi-GPU__ | | | Link Prediction | | | | -| | Jaccard Similarity | **Multi-GPU** | MG as of 22.12
Directed graph only | -| | Weighted Jaccard Similarity | Single-GPU | | -| | Overlap Similarity | **Multi-GPU** | MG as of 22.12 | -| | Sorensen Coefficient | **Multi-GPU** | MG as of 22.12 | +| | [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) | **Multi-GPU** | MG as of 22.12
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** | MG as of 22.12 | +| | [Sorensen Coefficient](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Sorensen-Similarity.ipynb) | **Multi-GPU** | MG as of 22.12 | | | _Local Clustering Coefficient_ | --- | | | Sampling | | | | -| | Uniform Random Walks (RW) | **Multi-GPU** | | +| | [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 | Single-GPU | MG planned for 23.02 | diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/cugraph/source/tutorials/cugraph_notebooks.md index ff9d6b199..ade6ed913 100644 --- a/docs/cugraph/source/tutorials/cugraph_notebooks.md +++ b/docs/cugraph/source/tutorials/cugraph_notebooks.md @@ -9,43 +9,43 @@ This repository contains a collection of Jupyter Notebooks that outline how to r | Folder | Notebook | Description | | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | Centrality | | | -| | [Centrality](algorithms/centrality/Centrality.ipynb) | Compute and compare multiple (currently 5) centrality scores | -| | [Katz](algorithms/centrality/Katz.ipynb) | Compute the Katz centrality for every vertex | -| | [Betweenness](algorithms/centrality/Betweenness.ipynb) | Compute both Edge and Vertex Betweenness centrality | -| | [Degree](algorithms/centrality/Degree.ipynb) | Compute Degree Centraility for each vertex | -| | [Eigenvector](algorithms/centrality/Eigenvector.ipynb) | Compute Eigenvector for every vertex | +| | [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](algorithms/community/Louvain.ipynb) and Leiden | Identify clusters in a graph using both the Louvain and Leiden algorithms | -| | [ECG](algorithms/community/ECG.ipynb) | Identify clusters in a graph using the Ensemble Clustering for Graph | -| | [K-Truss](algorithms/community/ktruss.ipynb) | Extracts the K-Truss cluster | -| | [Spectral-Clustering](algorithms/community/Spectral-Clustering.ipynb) | Identify clusters in a graph using Spectral Clustering with both
- Balanced Cut
- Modularity Modularity | -| | [Subgraph Extraction](algorithms/community/Subgraph-Extraction.ipynb) | Compute a subgraph of the existing graph including only the specified vertices | -| | [Triangle Counting](algorithms/community/Triangle-Counting.ipynb) | Count the number of Triangle in a graph | +| | [Louvain](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/community/Louvain.ipynb) and Leiden | 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](algorithms/components/ConnectedComponents.ipynb) | Find weakly and strongly connected components in a graph | +| | [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](algorithms/cores/kcore.ipynb) | Extracts the K-core cluster | -| | [Core Number](algorithms/cores/core-number.ipynb) | Computer the Core number for each vertex in a graph | +| | [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](algorithms/layout/Force-Atlas2.ipynb) |A large graph visualization achieved with cuGraph. | +| | [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](algorithms/link_analysis/Pagerank.ipynb) | Compute the PageRank of every vertex in a graph | -| | [HITS](algorithms/link_analysis/HITS.ipynb) | Compute the HITS' Hub and Authority scores for every vertex in a graph | +| | [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](algorithms/link_prediction/Jaccard-Similarity.ipynb) | Compute vertex similarity score using both:
- Jaccard Similarity
- Weighted Jaccard | -| | [Overlap Similarity](algorithms/link_prediction/Overlap-Similarity.ipynb) | Compute vertex similarity score using the Overlap Coefficient | +| | [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](algorithms/sampling/RandomWalk.ipynb) | Compute Random Walk for a various number of seeds and path lengths | +| | [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](algorithms/traversal/BFS.ipynb) | Compute the Breadth First Search path from a starting vertex to every other vertex in a graph | -| | [SSSP](algorithms/traversal/SSSP.ipynb) | Single Source Shortest Path - compute the shortest path from a starting vertex to every other vertex | +| | [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/notebooks) repo for a listing of all notebooks across all RAPIDS libraries. +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 @@ -74,4 +74,4 @@ Unless required by applicable law or agreed to in writing, software distributed -![RAPIDS](https://github.com/rapidsai/cugraph/tree/main/img/rapids_logo.png) \ No newline at end of file +![RAPIDS](https://github.com/rapidsai/cugraph/blob/main/img/rapids_logo.png) \ No newline at end of file From 08d84c5e98e3383039be6d8ff0cf343622489cb8 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Thu, 4 May 2023 13:06:09 -0400 Subject: [PATCH 248/384] Creates Notebook that runs Multi-GPU versions of Jaccard, Sorenson and overlap. (#3504) resolves #2669 Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3504 --- notebooks/demo/mg_jaccard.ipynb | 384 ++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 notebooks/demo/mg_jaccard.ipynb diff --git a/notebooks/demo/mg_jaccard.ipynb b/notebooks/demo/mg_jaccard.ipynb new file mode 100644 index 000000000..028deb72c --- /dev/null +++ b/notebooks/demo/mg_jaccard.ipynb @@ -0,0 +1,384 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Running Jaccard, Sorensen, and Overlap on Multiple GPUs\n", + "\n", + "This is a Multi-GPU notebook that loads data into a dask_cudf dataframe, creates a Graph, and then runs Jaccard, Sorensen, and Overlap.\n", + "\n", + "\n", + "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|---------------|------------|------------------|-----------------|-----------------------|\n", + "| Don Acosta | 04/21/2023 | created | 23.06 nightly | 2xA6000 CUDA 11.7 |\n", + "| Brad Rees | 04/24/2023 | Added RMAT | 23.06 nightly | 2xA6000 CUDA 11.7 |\n", + "\n", + "\n", + "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Basic setup" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + " Refer to https://docs.rapids.ai/install to learn how to create an environment for running cuGraph notebooks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Import needed libraries. We recommend using a [conda environment](https://github.com/rapidsai/cugraph/tree/HEAD/conda/environments) provided in the cugraph repo.\n", + "from dask.distributed import Client, wait\n", + "from dask_cuda import LocalCUDACluster\n", + "from cugraph.dask.comms import comms as Comms\n", + "\n", + "import cugraph.dask as dask_cugraph\n", + "import cugraph\n", + "from cugraph.generators import rmat\n", + "\n", + "import dask_cudf\n", + "import time\n", + "import urllib.request\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize multi-GPU environment\n", + "Before we get started, we need to set up a Dask local cluster of workers to execute our work, and a client to coordinate and schedule work for that cluster. As we see below, we can initiate a cluster and client using only 3 lines of code.\n", + "\n", + "The enable_spilling feature allows the graph stored in GPU memory to spill to host memory if necessary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def enable_spilling():\n", + " import cudf\n", + " cudf.set_option(\"spill\", True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "enable_spilling()\n", + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "client.run(enable_spilling)\n", + "Comms.initialize(p2p=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data\n", + "This notebook will use RMAT to generate a synthetic dataset. The size of the dataset will be determined by the number of GPUs present.\n", + "This appraoch removes the need to find test data of various sizes.\n", + "\n", + "The notebook will call the cugraph.rmat function and have a dask_cudf DataFrame returned. The rmat function could simply return a Graph object, which is more memory effecient, but the goal is to show the process starting with a dataframe\n", + "\n", + "| Number of GPUs | Scale | Edge Factor | Est Number of Nodes | Est Number of Edges |\n", + "|----------------|-------|-------------|---------------------|---------------------|\n", + "| 1 | 24 | 16 | 16,000,000 | 256,000,000 |\n", + "| 2 | 25 | 16 | 32,000,000 | 512,000,000 |\n", + "| 3 | 25 | 24 | 32,000,000 | 768,000,000 |\n", + "| 4 | 26 | 16 | 64,000,000 | 1,024,000,000 |\n", + "| 5 | 26 | 20 | 64,000,000 | 1,280,000,000 |\n", + "| 6 | 26 | 24 | 64,000,000 | 1,536,000,000 |\n", + "| 7 | 26 | 28 | 64,000,000 | 1,792,000,000 |\n", + "| 8 | 27 | 16 | 128,000,000 | 2,048,000,000 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rmat_settings = (\n", + " [24 , 16],\n", + " [25 , 16],\n", + " [25 , 24],\n", + " [26 , 16],\n", + " [26 , 20],\n", + " [26 , 24],\n", + " [26 , 28],\n", + " [27 , 16],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "def get_gpu_memory_size():\n", + " result = subprocess.check_output(\n", + " [\n", + " 'nvidia-smi', '--query-gpu=memory.total'\n", + " , '--format=csv,nounits,noheader'\n", + " ]\n", + " ) \n", + " return result.decode('utf-8').strip().split('\\n')#).strip().split('\\n')\n", + "\n", + "gpu_info = get_gpu_memory_size()\n", + "number_of_gpus = len(gpu_info)\n", + "gpu_memory = int(gpu_info[0])\n", + "print(f\"the cluster has {number_of_gpus} GPUs where each GPU has {gpu_memory} GB of memory\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scale, factor = rmat_settings[number_of_gpus - 1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if gpu_memory < 3600:\n", + " factor = (int)(factor * 0.75)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create the RMAT dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "numedges = (2**scale)* factor\n", + "ddf = rmat(\n", + " scale=scale,\n", + " num_edges=numedges,\n", + " a=0.57,\n", + " b=0.19,\n", + " c=0.19,\n", + " seed=42,\n", + " clip_and_flip=False,\n", + " scramble_vertex_ids=True,\n", + " create_using=None,\n", + " mg=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let's see how many edges were created" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(ddf)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ddf.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a Graph\n", + "yes, the rmat generator could have returned a Graph, but the goal for for this code to also be used as if data was loaded into cuDF via \n", + "read_csv, read_parquet, or similar data loading process. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "G = cugraph.Graph(directed=False)\n", + "G.from_dask_cudf_edgelist(ddf, renumber=False, source='src', destination='dst')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# we are using 1-hop pairs for demonstration\n", + "vertex_pairs = ddf.loc[0:1000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vertex_pairs.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run Multi-GPU jaccard\n", + "\n", + "Additional Reading\n", + "- [Wikipedia: Jaccard](https://en.wikipedia.org/wiki/Jaccard_index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jdf = dask_cugraph.jaccard(G,vertex_pairs)\n", + "jdf.head(20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run Multi-GPU Sorensen\n", + "\n", + "Additional Reading\n", + "- [Wikipedia: Sorensen Coefficient](https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sdf = jdf = dask_cugraph.sorensen(G,vertex_pairs)\n", + "sdf.head(20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run Multi-GPU overlap\n", + "\n", + "Additional Reading\n", + "- [Wikipedia: Sorensen Coefficient](https://en.wikipedia.org/wiki/Overlap_coefficient)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "odf = jdf = dask_cugraph.overlap(G,vertex_pairs)\n", + "odf.head(20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clean up and Shut down the multi-GPU Environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "del(ddf)\n", + "del(G)\n", + "\n", + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2023, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cugraph_0411", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From b3dfacc630c0bba5f318a49ac08906fe4b9d26ec Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Thu, 18 May 2023 13:16:18 -0400 Subject: [PATCH 249/384] removed deprecated calls and modified demo notebooks to run with 23.06 (#3561) resolves #3555 resolves #3556 resolves #3557 Is part of epic [196](https://github.com/rapidsai/graph_dl/issues/196) Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3561 --- .../cugraph_benchmarks/bfs_benchmark.ipynb | 54 +++++---- .../louvain_benchmark.ipynb | 56 +++++---- .../pagerank_benchmark.ipynb | 106 +++++------------- .../cugraph_benchmarks/sssp_benchmark.ipynb | 59 +++++----- 4 files changed, 124 insertions(+), 151 deletions(-) diff --git a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb index 6ae695e20..5a3d502c9 100644 --- a/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,22 +10,15 @@ "\n", "This notebook benchmarks performance of running BFS within cuGraph against NetworkX. \n", "\n", - "Notebook Credits\n", "\n", - " Original Authors: Bradley Rees\n", - " Last Edit: 08/16/2020\n", - " \n", - "RAPIDS Versions: 0.15\n", - "\n", - "Test Hardware\n", - "\n", - " GV100 32G, CUDA 10.2\n", - " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", - " 32GB system memory\n", - " \n" + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|------------------|-----------------|----------------|\n", + "| Brad Rees | 08/16/2020 | created | 0.15 | GV100 32G, CUDA 10.2\n", + "| Don Acosta | 05/15/2023 | update and test | 23.06 | A6000 32G, CUDA 11.7" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -45,6 +39,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -54,6 +49,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -64,6 +60,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -81,7 +78,8 @@ "import time\n", "import rmm\n", "import cugraph\n", - "import cudf" + "import cudf\n", + "import os" ] }, { @@ -118,10 +116,24 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "### Define the test data" + "### Define the test data\n", + "\n", + "README.md contains instructions on importing data using the dataPrep.sh script\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "|:---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| caidaRouterLevel | 192,244 | 1,218,132 |\n", + "| coAuthorsDBLP | 299,067 | 1,955,352 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| citationCiteseer | 268,495 | 2,313,294 |\n", + "| coPapersDBLP | 540,486 | 30,491,458 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |" ] }, { @@ -144,6 +156,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -183,7 +196,7 @@ " t1 = time.time()\n", " \n", " # cugraph Pagerank Call\n", - " G = cugraph.DiGraph()\n", + " G = cugraph.Graph(directed=True)\n", " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", " \n", " df = cugraph.bfs(G, 1)\n", @@ -236,6 +249,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -316,6 +330,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -353,11 +368,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -368,9 +384,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0510", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -382,7 +398,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb index 00e99a286..dc1cfebe3 100644 --- a/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -11,22 +12,10 @@ "

\n", "\n", "\n", - "#### Notebook Credits\n", - "\n", - " Original Authors: Bradley Rees\n", - " Last Edit: 06/10/2020\n", - "\n", - "\n", - "#### Test Environment\n", - "\n", - " RAPIDS Versions: 0.15\n", - "\n", - " Test Hardware:\n", - " GV100 32G, CUDA 10,0\n", - " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", - " 32GB system memory\n", - "\n", - "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|------------------|-----------------|----------------|\n", + "| Brad Rees | 08/16/2020 | created | 0.15 | GV100 32G, CUDA 10.0\n", + "| Don Acosta | 05/15/2023 | update and test | 23.06 | A6000 32G, CUDA 11.7\n", "\n", "#### Updates\n", "- moved loading ploting libraries to front so that dependencies can be checked before running algorithms\n", @@ -36,7 +25,6 @@ "\n", "\n", "#### Dependencies\n", - "- RAPIDS cuDF and cuGraph version 0.6.0 \n", "- NetworkX \n", "- Matplotlib \n", "- Scipy \n", @@ -47,14 +35,15 @@ "#### Note: Comparison against published results\n", "\n", "\n", - "The cuGraph blog post included performance numbers that were collected over a year ago. For the test graphs, int32 values are now used. That improves GPUs performance. Additionally, the initial benchamrks were measured on a P100 GPU. \n", + "The cuGraph blog post included performance numbers that were collected over a year ago. For the test graphs, int32 values are now used. That improves GPUs performance.\n", "\n", - "This test only comparse the modularity scores and a success is if the scores are within 15% of each other. That comparison is done by adjusting the NetworkX modularity score and then verifying that the cuGraph score is higher.\n", + "This test only compares the modularity scores and a success if the scores are within 15% of each other. That comparison is done by adjusting the NetworkX modularity score and then verifying that the cuGraph score is higher.\n", "\n", "cuGraph did a full validation of NetworkX results against cuGraph results. That included cross-validation of every cluster. That test is very slow and not included here" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -123,10 +112,24 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "### Define the test data" + "### Define the test data\n", + "\n", + "README.md contains instructions on downloading the data using the dataPrep.sh script\n", + "\n", + "| File Name | Num of Vertices | Num of Edges |\n", + "|:---------------------- | --------------: | -----------: |\n", + "| preferentialAttachment | 100,000 | 999,970 |\n", + "| caidaRouterLevel | 192,244 | 1,218,132 |\n", + "| coAuthorsDBLP | 299,067 | 1,955,352 |\n", + "| dblp-2010 | 326,186 | 1,615,400 |\n", + "| citationCiteseer | 268,495 | 2,313,294 |\n", + "| coPapersDBLP | 540,486 | 30,491,458 |\n", + "| coPapersCiteseer | 434,102 | 32,073,440 |\n", + "| as-Skitter | 1,696,415 | 22,190,596 |" ] }, { @@ -149,6 +152,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -235,6 +239,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -278,6 +283,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -303,6 +309,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -337,11 +344,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -352,9 +360,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0510", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -366,7 +374,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb index d0416efdd..b4c328cb2 100644 --- a/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/pagerank_benchmark.ipynb @@ -1,35 +1,30 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# PageRank Performance Benchmarking\n", "# Skip notebook test\n", "\n", - "This notebook benchmarks performance of running PageRank within cuGraph against NetworkX. NetworkX contains several implementations of PageRank. This benchmark will compare cuGraph versus the defaukt Nx implementation as well as the SciPy version\n", + "This notebook benchmarks performance of running PageRank within cuGraph against NetworkX. \n", "\n", - "Notebook Credits\n", - "\n", - " Original Authors: Bradley Rees\n", - " Last Edit: 08/16/2020\n", - " \n", - "RAPIDS Versions: 0.15\n", - "\n", - "Test Hardware\n", - "\n", - " GV100 32G, CUDA 10,0\n", - " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", - " 32GB system memory\n", - " \n" + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|------------------|-----------------|----------------|\n", + "| Brad Rees | 08/16/2020 | created | 0.15 | GV100 32G, CUDA 10.0\n", + "| Don Acosta | 05/17/2023 | removed outdated pagerank_scipy and tested | 23.06 | A6000 32G, CUDA 11.7\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Test Data\n", "\n", + "README.md contains instructions to download data using the dataPrep.sh script\n", + "\n", "| File Name | Num of Vertices | Num of Edges |\n", "|:---------------------- | --------------: | -----------: |\n", "| preferentialAttachment | 100,000 | 999,970 |\n", @@ -39,12 +34,11 @@ "| citationCiteseer | 268,495 | 2,313,294 |\n", "| coPapersDBLP | 540,486 | 30,491,458 |\n", "| coPapersCiteseer | 434,102 | 32,073,440 |\n", - "| as-Skitter | 1,696,415 | 22,190,596 |\n", - "\n", - "\n" + "| as-Skitter | 1,696,415 | 22,190,596 |\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -57,6 +51,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -67,6 +62,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -84,7 +80,8 @@ "import time\n", "import rmm\n", "import cugraph\n", - "import cudf" + "import cudf\n", + "import os" ] }, { @@ -121,6 +118,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -147,6 +145,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -186,8 +185,8 @@ " t1 = time.time()\n", " \n", " # cugraph Pagerank Call\n", - " G = cugraph.DiGraph()\n", - " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " G = cugraph.Graph(directed=True)\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False, store_transposed=True)\n", " \n", " df = cugraph.pagerank(G, alpha=alpha, max_iter=max_iter, tol=tol)\n", " t2 = time.time() - t1\n", @@ -239,46 +238,7 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# SciPy PageRank\n", - "\n", - "def networkx_scipy_call(M, max_iter, tol, alpha):\n", - " nnz_per_row = {r: 0 for r in range(M.get_shape()[0])}\n", - " for nnz in range(M.getnnz()):\n", - " nnz_per_row[M.row[nnz]] = 1 + nnz_per_row[M.row[nnz]]\n", - " for nnz in range(M.getnnz()):\n", - " M.data[nnz] = 1.0/float(nnz_per_row[M.row[nnz]])\n", - "\n", - " M = M.tocsr()\n", - " if M is None:\n", - " raise TypeError('Could not read the input graph')\n", - " if M.shape[0] != M.shape[1]:\n", - " raise TypeError('Shape is not square')\n", - "\n", - " # should be autosorted, but check just to make sure\n", - " if not M.has_sorted_indices:\n", - " print('sort_indices ... ')\n", - " M.sort_indices()\n", - "\n", - " z = {k: 1.0/M.shape[0] for k in range(M.shape[0])}\n", - "\n", - " # SciPy Pagerank Call\n", - " print('\\tSciPy Solving... ')\n", - " t1 = time.time()\n", - " \n", - " Gnx = nx.DiGraph(M) \n", - " \n", - " pr = nx.pagerank_scipy(Gnx, alpha, z, max_iter, tol)\n", - " t2 = time.time() - t1\n", - "\n", - " return t2" - ] - }, - { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -324,18 +284,13 @@ " speedUp = (tn / trapids)\n", " perf_nx.append(speedUp)\n", " time_nx.append(tn)\n", - " \n", - " # Now call SciPy\n", - " tsp = networkx_scipy_call(M, 100, 0.00001, 0.85)\n", - " speedUp = (tsp / trapids)\n", - " perf_sp.append(speedUp) \n", - " time_sp.append(tsp)\n", - " \n", - " print(\"cuGraph (\" + str(trapids) + \") Nx (\" + str(tn) + \") SciPy (\" + str(tsp) + \")\" )\n", + " \n", + " print(\"cuGraph (\" + str(trapids) + \") Nx (\" + str(tn) + \")\" )\n", " del M" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -356,7 +311,6 @@ "index = np.arange(len(names))\n", "\n", "_ = plt.bar(index, perf_nx, bar_width, color='g', label='vs Nx')\n", - "_ = plt.bar(index + bar_width, perf_sp, bar_width, color='b', label='vs SciPy')\n", "\n", "plt.xlabel('Datasets')\n", "plt.ylabel('Speedup')\n", @@ -368,15 +322,12 @@ "for i in range(len(perf_nx)):\n", " plt.text(x = (i - 0.55) + bar_width, y = perf_nx[i] + 25, s = round(perf_nx[i], 1), size = 12)\n", "\n", - "for i in range(len(perf_sp)):\n", - " plt.text(x = (i - 0.1) + bar_width, y = perf_sp[i] + 25, s = round(perf_sp[i], 1), size = 12)\n", - "\n", - "\n", "plt.legend()\n", "plt.show()" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -429,11 +380,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -444,9 +396,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0510", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -458,7 +410,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb index 32b562e7a..f6c239f28 100644 --- a/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb +++ b/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,27 +10,22 @@ "\n", "This notebook benchmarks performance of running SSSP within cuGraph against NetworkX. \n", "\n", - "Notebook Credits\n", "\n", - " Original Authors: Bradley Rees\n", - " Last Edit: 06/10/2020\n", - " \n", - "RAPIDS Versions: 0.15\n", - "\n", - "Test Hardware\n", - "\n", - " GV100 32G, CUDA 10,0\n", - " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n", - " 32GB system memory\n", - " \n" + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|------------------|-----------------|----------------|\n", + "| Brad Rees | 06/10/2020 | created | 0.15 | GV100 32G, CUDA 10.0\n", + "| Don Acosta | 05/17/2023 | update and test | 23.06 | A6000 48G, CUDA 11.7\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Test Data\n", "\n", + "README.md contains instructions to download data using the dataPrep.sh script\n", + "\n", "| File Name | Num of Vertices | Num of Edges |\n", "|:---------------------- | --------------: | -----------: |\n", "| preferentialAttachment | 100,000 | 999,970 |\n", @@ -45,6 +41,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -57,6 +54,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -67,6 +65,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -84,17 +83,7 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# since this is a shared machine - let's pick a GPU that no one else is using\n", - "import os\n", - "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"" - ] - }, - { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -112,7 +101,8 @@ "import time\n", "import rmm\n", "import cugraph\n", - "import cudf" + "import cudf\n", + "import os" ] }, { @@ -132,7 +122,7 @@ "metadata": {}, "outputs": [], "source": [ - "try: \n", + "try:\n", " import matplotlib\n", "except ModuleNotFoundError:\n", " os.system('pip install matplotlib')" @@ -149,6 +139,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -175,6 +166,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -208,14 +200,16 @@ " gdf = cudf.DataFrame()\n", " gdf['src'] = M.row\n", " gdf['dst'] = M.col\n", + " # added this since SSSP now requires a weight\n", + " gdf['weight'] = 1\n", " \n", " print('\\tcuGraph Solving... ')\n", " \n", " t1 = time.time()\n", " \n", " # cugraph SSSP Call\n", - " G = cugraph.DiGraph()\n", - " G.from_cudf_edgelist(gdf, source='src', destination='dst', renumber=False)\n", + " G = cugraph.Graph(directed=True)\n", + " G.from_cudf_edgelist(gdf, source='src', destination='dst', weight = 'weight', renumber=False)\n", " \n", " df = cugraph.sssp(G, 1)\n", " t2 = time.time() - t1\n", @@ -267,6 +261,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -345,6 +340,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -379,11 +375,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -394,9 +391,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0510", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -408,7 +405,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.10.10" } }, "nbformat": 4, From a298b8cce8120f19af3069363efeefda5fb5eb00 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Fri, 19 May 2023 08:59:03 -0400 Subject: [PATCH 250/384] updated cugraph Demo notebooks for 23.06 (#3558) This is done as part of epic [#196](https://github.com/rapidsai/graph_dl/issues/196) Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3558 --- notebooks/demo/batch_betweenness.ipynb | 397 ------------------------- notebooks/demo/mg_louvain.ipynb | 196 ++++++++++-- notebooks/demo/mg_pagerank.ipynb | 384 +++++++++++++++++++++++- notebooks/demo/mg_property_graph.ipynb | 18 +- 4 files changed, 558 insertions(+), 437 deletions(-) delete mode 100644 notebooks/demo/batch_betweenness.ipynb diff --git a/notebooks/demo/batch_betweenness.ipynb b/notebooks/demo/batch_betweenness.ipynb deleted file mode 100644 index 854621eb3..000000000 --- a/notebooks/demo/batch_betweenness.ipynb +++ /dev/null @@ -1,397 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Multi-GPU Batch Betweenness Centrality\n", - "#### Author : Xavier Cadet\n", - "In this notebook, we will compute Betweenness Centrality for vertices using cuGraph and will see how to **use Multiple GPUs to compute Betweenness Centrality scores**.\n", - "\n", - "This notebook was tested using 4 NVIDIA Tesla V100-DGX 32G GPUs, using RAPIDS 0.15, and CUDA 10.1. Please be aware that your system may be different and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "Betweenness Centrality can be slow to compute on large graphs, in order to speed up the process we can leverage multiple GPUs.\n", - "In this notebook we will showcase how it would have been done with a Single GPU approach, then we will show how it can be done using multiple GPUs." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data\n", - "The soc-LiveJournal1 dataset which can be obtained on [SNAP](https://snap.stanford.edu/data/soc-LiveJournal1.html). This graph contains roughly 5 million nodes, and 70 million edges and was extracted from the LiveJournal online social network, further information can be found in:\n", - "\n", - "*Group Formation in Large Social Networks: Membership, Growth, and Evolution., L. Backstrom, D. Huttenlocher, J. Kleinberg, X. Lan., KDD, 2006.*\n", - "\n", - "and:\n", - "\n", - "*Community Structure in Large Networks: Natural Cluster Sizes and the Absence of Large Well-Defined Clusters., J. Leskovec, K. Lang, A. Dasgupta, M. Mahoney., Internet Mathematics 6(1) 29--123, 2009.*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Betweenness Centrality with cuGraph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The imports:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import cugraph\n", - "import cudf\n", - "\n", - "import dask\n", - "import dask_cuda\n", - "import cugraph.comms as Comms" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "import cupy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get the data\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import urllib.request\n", - "import os\n", - "\n", - "data_dir = '../data/'\n", - "if not os.path.exists(data_dir):\n", - " print('creating data directory')\n", - " os.system('mkdir ../data')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# download the soc-LiveJournal1 dataset\n", - "base_url = 'https://snap.stanford.edu/data/'\n", - "fn = 'soc-LiveJournal1.txt'\n", - "comp = '.gz'\n", - "if not os.path.isfile(data_dir + fn):\n", - " if not os.path.isfile(data_dir + fn + comp):\n", - " print(f'Downloading {base_url + fn + comp} to {data_dir + fn + comp}')\n", - " urllib.request.urlretrieve(base_url + fn + comp, data_dir + fn + comp)\n", - " print(f'Decompressing {data_dir + fn + comp}...')\n", - " os.system('gunzip ' + data_dir + fn + comp)\n", - " print(f'{data_dir + fn + comp} decompressed!')\n", - "else:\n", - " print(f'Your data file, {data_dir + fn}, already exists')\n", - "input_data_path = data_dir + fn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Single GPU" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the Data - Single GPU\n", - "The following shows how we would read the csv file using a single GPU as it is commonly done when using a single GPU with CuGraph." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t_start_read_sg = time.perf_counter()\n", - "e_list = cudf.read_csv(input_data_path, delimiter='\\t', names=['src', 'dst'], dtype=['int32', 'int32'], comment='#')\n", - "t_stop_read_sg = time.perf_counter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"SG Read time: {}s\".format(t_stop_read_sg - t_start_read_sg))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Building the Graph - Single GPU\n", - "Once we read the file, we need to build the Graph, we will use a DiGraph, and use the content extracted from the .csv file as an edge list." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t_start_build_sg = time.perf_counter()\n", - "G = cugraph.DiGraph()\n", - "G.from_cudf_edgelist(e_list, source='src', destination='dst')\n", - "t_stop_build_sg = time.perf_counter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"SG Build time: {}s\".format(t_stop_build_sg - t_start_build_sg))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calling the Algorithm - Single GPU\n", - "Now that our graph is built, we can get its betweenness centrality score. Here we will use a sub-sample of 1024 sources in order to have a better approximation of the overall betweenness centrality. We set the seed for comparability with the multi GPU version that comes next." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t_start_sg = time.perf_counter()\n", - "sg_df = cugraph.betweenness_centrality(G, k=1024, seed=123)\n", - "t_stop_sg = time.perf_counter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"SG Time elapsed: {}s\".format(t_stop_sg - t_start_sg))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Now let's use multiple GPUs!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a Dask Cluster\n", - "In order to use multiple GPU, we need to ensure that we have Dask Cluster and Client running, further more we need to initialize the CuGraph Communicator." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cluster = dask_cuda.LocalCUDACluster()\n", - "client = dask.distributed.Client(cluster)\n", - "Comms.initialize(p2p=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Enabling Multi GPU Batch Processing\n", - "The good thing is that with a simple `enable_mg_batch` call you can harness the power of Multiple GPUs to operate Batch Processing.\n", - "This step might take a few seconds, indeed we need to get the graph available to all GPUS, do not worry, this is only required once or when adding new representations to the graph (adjacency list for example)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t_start_mg = time.perf_counter()\n", - "G.enable_batch()\n", - "print(\"MG Batch Enabling Time elapsed: {}s\".format(time.perf_counter() - t_start_mg))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calling the algorithm\n", - "We call the algorithm the same way as we used to, but this time it is much faster as we leverage multiple GPUs to compute the Betweenness Centrality scores." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t_start_mg = time.perf_counter()\n", - "batch_df = cugraph.betweenness_centrality(G, k=1024, seed=123)\n", - "t_stop_mg = time.perf_counter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"MG Time elapsed: {}s\".format(t_stop_mg - t_start_mg))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Verification\n", - "Order in the DataFrame might vary, but scores for each vertices match, in order to display them side by side we will first sort the resluts based on the `vertex` key, and renew the DataFramee index." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sorted_sg_df = sg_df.sort_values(\"vertex\").reset_index(drop=True)\n", - "sorted_batch_df = batch_df.sort_values(\"vertex\").reset_index(drop=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now compare score for each of the vertices:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cupy.allclose(sorted_sg_df[\"betweenness_centrality\"], sorted_batch_df[\"betweenness_centrality\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And just to visually compare the results we can display the DataFrames:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(sorted_sg_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(sorted_batch_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Do not forget to clear the Communicator / client /cluster if required." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Comms.destroy()\n", - "client.close()\n", - "cluster.close()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", - "\n", - "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\n", - "\n", - "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.\n", - "___" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "cugraph_dev", - "language": "python", - "name": "cugraph_dev" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/demo/mg_louvain.ipynb b/notebooks/demo/mg_louvain.ipynb index a23c8eadb..8e8c5b041 100644 --- a/notebooks/demo/mg_louvain.ipynb +++ b/notebooks/demo/mg_louvain.ipynb @@ -7,11 +7,11 @@ "source": [ "# Multiple GPU Louvain in cuGraph\n", "\n", - "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", - "|---------------|------------|------------------|-----------------|-----------------------|\n", - "| Chuck Hastings| 11/08/2021 | created | 21.10 nightly | |\n", - "| Don Acosta | 01/30/2023 | updated | 23.02 nightly | 2xA6000 CUDA 11.7 |\n", - "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|---------------|------------|--------------------|-----------------|-----------------------|\n", + "| Chuck Hastings| 11/08/2021 | created | 21.10 nightly | |\n", + "| Don Acosta | 01/30/2023 | updated | 23.02 nightly | 2xA6000 CUDA 11.7 |\n", + "| Don Acosta | 05/12/2023 | updated and tested | 23.06 nightly | 2xA6000 CUDA 11.7 |\n", "\n", "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the Louvain partitions and global modularity score for a dataset.\n", "\n", @@ -22,6 +22,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -31,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -46,6 +47,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -53,6 +55,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -64,11 +67,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your data file, ../data/hollywood.csv, already exists\n" + ] + } + ], "source": [ "import urllib.request\n", "import os\n", @@ -98,6 +109,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -107,9 +119,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-05-12 08:59:04,694 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-t6i5b0t1', purging\n", + "2023-05-12 08:59:04,694 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-pn3z4erj', purging\n", + "2023-05-12 08:59:04,695 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n", + "2023-05-12 08:59:04,695 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n", + "2023-05-12 08:59:04,718 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n", + "2023-05-12 08:59:04,718 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n" + ] + } + ], "source": [ "cluster = LocalCUDACluster()\n", "client = Client(cluster)\n", @@ -117,6 +142,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -126,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "tags": [] }, @@ -136,13 +162,14 @@ "t_start = time.time()\n", "\n", "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", - "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "blocksize = dask_cugraph.get_chunksize(input_data_path)\n", "\n", "# Multi-GPU CSV reader\n", - "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" + "e_list = dask_cudf.read_csv(input_data_path, blocksize = blocksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,11 +178,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Read, load and renumber: 8.843012809753418 s\n" + ] + } + ], "source": [ "# Create an undirected graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", "G = cugraph.Graph(directed=False)\n", @@ -166,6 +201,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -174,12 +210,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "scrolled": true, "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Louvain: 5.56727409362793 s\n" + ] + } + ], "source": [ "# Start Pagerank timer\n", "t_start = time.time()\n", @@ -192,6 +236,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -199,6 +244,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -209,19 +255,127 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "scrolled": true, "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
vertexpartition
06012252
15998642
26012262
37913430
46006872
.........
570285113989420139
570286113989620140
57028711398973451
570288113989840215
570289113990331869
\n", + "

1139905 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " vertex partition\n", + "0 601225 2\n", + "1 599864 2\n", + "2 601226 2\n", + "3 791343 0\n", + "4 600687 2\n", + "... ... ...\n", + "570285 1139894 20139\n", + "570286 1139896 20140\n", + "570287 1139897 3451\n", + "570288 1139898 40215\n", + "570289 1139903 31869\n", + "\n", + "[1139905 rows x 2 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "louvain_df.compute()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -261,7 +415,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.10" }, "vscode": { "interpreter": { diff --git a/notebooks/demo/mg_pagerank.ipynb b/notebooks/demo/mg_pagerank.ipynb index 5e3f05210..bb3330484 100644 --- a/notebooks/demo/mg_pagerank.ipynb +++ b/notebooks/demo/mg_pagerank.ipynb @@ -1,21 +1,37 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Multiple GPU in cuGraph\n", - "#### Author : Alex Fender\n", + "\n", "\n", "In this notebook, we will show how to use multiple GPUs in cuGraph to compute the PageRank of each user in Twitter's dataset.\n", "\n", - "This notebook was tested using RAPIDS 0.15 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + " If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|---------------|------------|------------------|-----------------|----------------------------------------------------------|\n", + "|Alex Fender | 11/08/2021 | created | 0.15 | Tesla V100-DGX 32G GPU CUDA 10.2 |\n", + "| Don Acosta | 05/11/2023 | updated/tested | 23.06 nightly | 2xA6000 CUDA 11.7\n", "\n", "\n", "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." ] }, { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Note:\n", + "This notebook runs only in releases 23.06 and later. It requires memory optimizations delivered in 23.06" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -27,6 +43,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -36,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -51,6 +68,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -58,6 +76,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -69,11 +88,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your data file, ../data/twitter-2010.csv, already exists\n" + ] + } + ], "source": [ "import urllib.request\n", "import os\n", @@ -102,6 +129,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -111,16 +139,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], + "source": [ + "def enable_spilling():\n", + " import cudf\n", + " cudf.set_option(\"spill\", True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-05-12 09:22:17,684 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n", + "2023-05-12 09:22:17,684 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n", + "2023-05-12 09:22:17,688 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n", + "2023-05-12 09:22:17,688 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n" + ] + } + ], "source": [ "cluster = LocalCUDACluster()\n", + "enable_spilling()\n", "client = Client(cluster)\n", "Comms.initialize(p2p=True)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -130,7 +182,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "tags": [] }, @@ -140,13 +192,14 @@ "t_start = time.time()\n", "\n", "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", - "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "blocksize = dask_cugraph.get_chunksize(input_data_path)\n", "\n", "# Multi-GPU CSV reader\n", - "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n" + "e_list = dask_cudf.read_csv(input_data_path, blocksize = blocksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -155,11 +208,305 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-05-12 09:25:01,974 - distributed.sizeof - WARNING - Sizeof calculation failed. Defaulting to 0.95 MiB\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/sizeof.py\", line 17, in safe_sizeof\n", + " return sizeof(obj)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/utils.py\", line 642, in __call__\n", + " return meth(arg, *args, **kwargs)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask_cudf/backends.py\", line 430, in sizeof_cudf_dataframe\n", + " + df._index.memory_usage()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 1594, in memory_usage\n", + " if self.levels:\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 605, in levels\n", + " self._compute_levels_and_codes()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 748, in _compute_levels_and_codes\n", + " code, cats = cudf.Series._from_data({None: col}).factorize()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/single_column_frame.py\", line 311, in factorize\n", + " return cudf.core.algorithms.factorize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/algorithms.py\", line 138, in factorize\n", + " labels = values._column._label_encoding(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1385, in _label_encoding\n", + " order = order.take(left_gather_map, check_bounds=False).argsort()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1101, in argsort\n", + " return self.as_frame()._get_sorted_inds(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 1572, in _get_sorted_inds\n", + " return libcudf.sort.order_by(to_sort, ascending, na_position)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"sort.pyx\", line 141, in cudf._lib.sort.order_by\n", + "MemoryError: std::bad_alloc: out_of_memory: CUDA error at: /home/dacosta/miniconda3/envs/cugraph_0411/include/rmm/mr/device/cuda_memory_resource.hpp\n", + "2023-05-12 09:25:01,976 - distributed.sizeof - WARNING - Sizeof calculation failed. Defaulting to 0.95 MiB\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/sizeof.py\", line 17, in safe_sizeof\n", + " return sizeof(obj)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/utils.py\", line 642, in __call__\n", + " return meth(arg, *args, **kwargs)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask_cudf/backends.py\", line 430, in sizeof_cudf_dataframe\n", + " + df._index.memory_usage()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 1594, in memory_usage\n", + " if self.levels:\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 605, in levels\n", + " self._compute_levels_and_codes()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 748, in _compute_levels_and_codes\n", + " code, cats = cudf.Series._from_data({None: col}).factorize()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/single_column_frame.py\", line 311, in factorize\n", + " return cudf.core.algorithms.factorize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/algorithms.py\", line 138, in factorize\n", + " labels = values._column._label_encoding(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1385, in _label_encoding\n", + " order = order.take(left_gather_map, check_bounds=False).argsort()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1101, in argsort\n", + " return self.as_frame()._get_sorted_inds(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 1572, in _get_sorted_inds\n", + " return libcudf.sort.order_by(to_sort, ascending, na_position)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"sort.pyx\", line 141, in cudf._lib.sort.order_by\n", + "MemoryError: std::bad_alloc: out_of_memory: CUDA error at: /home/dacosta/miniconda3/envs/cugraph_0411/include/rmm/mr/device/cuda_memory_resource.hpp\n", + "2023-05-12 09:25:03,767 - distributed.sizeof - WARNING - Sizeof calculation failed. Defaulting to 0.95 MiB\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/sizeof.py\", line 17, in safe_sizeof\n", + " return sizeof(obj)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/utils.py\", line 642, in __call__\n", + " return meth(arg, *args, **kwargs)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask_cudf/backends.py\", line 430, in sizeof_cudf_dataframe\n", + " + df._index.memory_usage()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 1594, in memory_usage\n", + " if self.levels:\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 605, in levels\n", + " self._compute_levels_and_codes()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 748, in _compute_levels_and_codes\n", + " code, cats = cudf.Series._from_data({None: col}).factorize()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/single_column_frame.py\", line 311, in factorize\n", + " return cudf.core.algorithms.factorize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/algorithms.py\", line 138, in factorize\n", + " labels = values._column._label_encoding(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1385, in _label_encoding\n", + " order = order.take(left_gather_map, check_bounds=False).argsort()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1101, in argsort\n", + " return self.as_frame()._get_sorted_inds(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 1572, in _get_sorted_inds\n", + " return libcudf.sort.order_by(to_sort, ascending, na_position)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"sort.pyx\", line 141, in cudf._lib.sort.order_by\n", + "MemoryError: std::bad_alloc: out_of_memory: CUDA error at: /home/dacosta/miniconda3/envs/cugraph_0411/include/rmm/mr/device/cuda_memory_resource.hpp\n", + "2023-05-12 09:25:03,768 - distributed.sizeof - WARNING - Sizeof calculation failed. Defaulting to 0.95 MiB\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/sizeof.py\", line 17, in safe_sizeof\n", + " return sizeof(obj)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/utils.py\", line 642, in __call__\n", + " return meth(arg, *args, **kwargs)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask_cudf/backends.py\", line 430, in sizeof_cudf_dataframe\n", + " + df._index.memory_usage()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 1594, in memory_usage\n", + " if self.levels:\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 605, in levels\n", + " self._compute_levels_and_codes()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/multiindex.py\", line 748, in _compute_levels_and_codes\n", + " code, cats = cudf.Series._from_data({None: col}).factorize()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/single_column_frame.py\", line 311, in factorize\n", + " return cudf.core.algorithms.factorize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/algorithms.py\", line 138, in factorize\n", + " labels = values._column._label_encoding(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1385, in _label_encoding\n", + " order = order.take(left_gather_map, check_bounds=False).argsort()\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1101, in argsort\n", + " return self.as_frame()._get_sorted_inds(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 1572, in _get_sorted_inds\n", + " return libcudf.sort.order_by(to_sort, ascending, na_position)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"sort.pyx\", line 141, in cudf._lib.sort.order_by\n", + "MemoryError: std::bad_alloc: out_of_memory: CUDA error at: /home/dacosta/miniconda3/envs/cugraph_0411/include/rmm/mr/device/cuda_memory_resource.hpp\n", + "2023-05-12 09:25:03,820 - distributed.worker - ERROR - Could not deserialize task ('len-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d', 1)\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2923, in loads_function\n", + " result = cache_loads[bytes_object]\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/collections.py\", line 24, in __getitem__\n", + " value = super().__getitem__(key)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/collections/__init__.py\", line 1106, in __getitem__\n", + " raise KeyError(key)\n", + "KeyError: b'\\x80\\x05\\x95>\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x11dask.optimization\\x94\\x8c\\x10SubgraphCallable\\x94\\x93\\x94(}\\x94(\\x8cKlen-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d\\x94\\x8cZassign-getitem-len-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d\\x94\\x8c*rename-01db283bd79fee66f232920c8dc6b55e_.0\\x94\\x8c;getitem-to_frame-rename-01db283bd79fee66f232920c8dc6b55e_.0\\x94\\x8c+getitem-3499fd71ac25ebbc1a06991edea6067c_.0\\x94\\x8c\\t_operator\\x94\\x8c\\x07getitem\\x94\\x93\\x94\\x8c/reset_index-f4c18304ca92859ccd09f44cf89b4b43_.0\\x94\\x8c\\x13__dask_blockwise__1\\x94\\x87\\x94h\\x0c(\\x8c\\ndask.utils\\x94\\x8c\\x05apply\\x94\\x93\\x94h\\x0f\\x8c\\x0cmethodcaller\\x94\\x93\\x94\\x8c\\x0breset_index\\x94\\x85\\x94R\\x94]\\x94\\x8c\\x13__dask_blockwise__5\\x94a\\x8c\\x08builtins\\x94\\x8c\\x04dict\\x94\\x93\\x94]\\x94]\\x94(\\x8c\\x04drop\\x94\\x89ea\\x86\\x94t\\x94h\\x07(h\\x11\\x8c\\x13dask.dataframe.core\\x94\\x8c\\x11apply_and_enforce\\x94\\x93\\x94]\\x94((h\\x11h#]\\x94h\\x0bh\\x0c\\x8c\\x13__dask_blockwise__0\\x94\\x87\\x94ah\\x1b]\\x94(]\\x94(\\x8c\\x05_func\\x94h\\x13\\x8c\\x08to_frame\\x94\\x85\\x94R\\x94e]\\x94(\\x8c\\x05_meta\\x94\\x8c\\x08builtins\\x94\\x8c\\x07getattr\\x94\\x93\\x94\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94\\x8c\\x10host_deserialize\\x94\\x86\\x94R\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94C0\\x80\\x04\\x95%\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94.\\x94\\x8c\\x0ccolumn_names\\x94C\\x14\\x80\\x04\\x95\\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x03src\\x94\\x85\\x94.\\x94\\x8c\\x07columns\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94C=\\x80\\x04\\x952\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x1acudf.core.column.numerical\\x94\\x8c\\x0fNumericalColumn\\x94\\x93\\x94.\\x94\\x8c\\x05dtype\\x94CB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i4\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94\\x8c\\x18dtype-is-cudf-serialized\\x94\\x89\\x8c\\x04data\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94CI\\x80\\x04\\x95>\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x14SpillableBufferSlice\\x94\\x93\\x94.\\x94\\x8c\\x0bframe_count\\x94K\\x01u\\x8c\\x04mask\\x94}\\x94(hGCD\\x80\\x04\\x959\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x0fSpillableBuffer\\x94\\x93\\x94.\\x94hIK\\x01u\\x8c\\x04size\\x94K\\x00hIK\\x02u\\x85\\x94\\x8c\\x05index\\x94}\\x94(\\x8c\\x0cindex_column\\x94}\\x94(\\x8c\\x05start\\x94K\\x00\\x8c\\x04stop\\x94K\\x00\\x8c\\x04step\\x94K\\x01u\\x8c\\x04name\\x94C\\x04\\x80\\x04N.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i8\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94\\x8c\\x0ftype-serialized\\x94C-\\x80\\x04\\x95\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0fcudf.core.index\\x94\\x8c\\nRangeIndex\\x94\\x93\\x94.\\x94hIK\\x00u\\x8c\\x11index_frame_count\\x94K\\x00\\x8c\\x07is-cuda\\x94]\\x94(\\x88\\x88e\\x8c\\x07lengths\\x94]\\x94(K\\x00K\\x00e\\x8c\\twriteable\\x94NN\\x86\\x94u]\\x94(\\x8c\\x12numpy.core.numeric\\x94\\x8c\\x0b_frombuffer\\x94\\x93\\x94(C\\x00\\x94\\x8c\\x05numpy\\x94hB\\x93\\x94\\x8c\\x02u1\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01|\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94bK\\x00\\x85\\x94\\x8c\\x01C\\x94t\\x94R\\x94he(C\\x00\\x94hkK\\x00\\x85\\x94hot\\x94R\\x94e\\x86\\x94R\\x94ee\\x86\\x94t\\x94\\x8c\\x13__dask_blockwise__2\\x94eh\\x1b]\\x94(]\\x94(h*h\\x13\\x8c\\x06rename\\x94\\x85\\x94R\\x94e]\\x94(h/h2h5h6\\x86\\x94R\\x94}\\x94(h:C0\\x80\\x04\\x95%\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94.\\x94h}\\x94(h@C=\\x80\\x04\\x952\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x1acudf.core.column.numerical\\x94\\x8c\\x0fNumericalColumn\\x94\\x93\\x94.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i4\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94hD\\x89hE}\\x94(hGCI\\x80\\x04\\x95>\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x14SpillableBufferSlice\\x94\\x93\\x94.\\x94hIK\\x01uhMK\\x00hIK\\x01u\\x85\\x94hO}\\x94(hQ}\\x94(hSK\\x00hTK\\x00hUK\\x01uhVC\\x04\\x80\\x04N.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i8\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94hYC-\\x80\\x04\\x95\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0fcudf.core.index\\x94\\x8c\\nRangeIndex\\x94\\x93\\x94.\\x94hIK\\x00uh[K\\x00h\\\\]\\x94\\x88ah^]\\x94K\\x00ah`N\\x85\\x94u]\\x94he(C\\x00\\x94hkK\\x00\\x85\\x94hot\\x94R\\x94a\\x86\\x94R\\x94e]\\x94(h>h\\x1b]\\x94]\\x94(\\x8c\\x03src\\x94h\\x9eea\\x86\\x94ee\\x86\\x94t\\x94h\\x05(h\\x11h!\\x8c\\x10_reduction_chunk\\x94\\x93\\x94]\\x94h\\x0b(\\x8c\\x16dask.dataframe.methods\\x94\\x8c\\x06assign\\x94\\x93\\x94h\\x06h\\rh\\x08t\\x94h&\\x87\\x94ah\\x1b]\\x94]\\x94(\\x8c\\taca_chunk\\x94h0\\x8c\\x03len\\x94\\x93\\x94ea\\x86\\x94t\\x94\\x8c\\x13__dask_blockwise__0\\x94h\\x9e\\x8c\\x13__dask_blockwise__1\\x94\\x8c\\x03dst\\x94\\x8c\\x13__dask_blockwise__2\\x94N\\x8c\\x13__dask_blockwise__3\\x94\\x8c)to_frame-804980ae30b71d28f0a6bd3d5b7610f9\\x94\\x8c\\x13__dask_blockwise__4\\x94\\x8c(getitem-15414b72be12e28054238b44933937ab\\x94\\x8c\\x13__dask_blockwise__6\\x94\\x8c3cudf-aggregate-agg-c50c2d97de169ca4f41e43a92a042630\\x94uh\\x04\\x8c\\x13__dask_blockwise__5\\x94\\x85\\x94\\x8c6subgraph_callable-b4ca530e-8895-432e-b553-40a7b5892ab2\\x94t\\x94R\\x94.'\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2244, in execute\n", + " function, args, kwargs = await self._maybe_deserialize_task(ts)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2216, in _maybe_deserialize_task\n", + " function, args, kwargs = _deserialize(*ts.run_spec)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2937, in _deserialize\n", + " function = loads_function(function)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2925, in loads_function\n", + " result = pickle.loads(bytes_object)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 96, in loads\n", + " return pickle.loads(x)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py\", line 176, in host_deserialize\n", + " obj = cls.device_deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py\", line 130, in device_deserialize\n", + " return typ.deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/dataframe.py\", line 1019, in deserialize\n", + " obj = super().deserialize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 106, in deserialize\n", + " columns = deserialize_columns(header[\"columns\"], frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 2450, in deserialize_columns\n", + " colobj = col_typ.deserialize(meta, frames[:col_frame_count])\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1216, in deserialize\n", + " data, frames = unpack(header[\"data\"], frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1204, in unpack\n", + " obj = klass.deserialize(header, frames[:count])\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 574, in deserialize\n", + " return SpillableBuffer.deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/buffer.py\", line 335, in deserialize\n", + " return cls._from_device_memory(frame)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 235, in _from_device_memory\n", + " ret._finalize_init(ptr_desc={\"type\": \"gpu\"}, exposed=exposed)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 206, in _finalize_init\n", + " raise ValueError(\n", + "ValueError: cannot create without a global spill manager\n", + "2023-05-12 09:25:03,817 - distributed.worker - ERROR - Could not deserialize task ('len-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d', 0)\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2923, in loads_function\n", + " result = cache_loads[bytes_object]\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/collections.py\", line 24, in __getitem__\n", + " value = super().__getitem__(key)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/collections/__init__.py\", line 1106, in __getitem__\n", + " raise KeyError(key)\n", + "KeyError: b'\\x80\\x05\\x95>\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x11dask.optimization\\x94\\x8c\\x10SubgraphCallable\\x94\\x93\\x94(}\\x94(\\x8cKlen-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d\\x94\\x8cZassign-getitem-len-chunk-319fe46af5510615b2fae86c6e732896-841a12bf4568ebb80eb2030cc4d9651d\\x94\\x8c*rename-01db283bd79fee66f232920c8dc6b55e_.0\\x94\\x8c;getitem-to_frame-rename-01db283bd79fee66f232920c8dc6b55e_.0\\x94\\x8c+getitem-3499fd71ac25ebbc1a06991edea6067c_.0\\x94\\x8c\\t_operator\\x94\\x8c\\x07getitem\\x94\\x93\\x94\\x8c/reset_index-f4c18304ca92859ccd09f44cf89b4b43_.0\\x94\\x8c\\x13__dask_blockwise__1\\x94\\x87\\x94h\\x0c(\\x8c\\ndask.utils\\x94\\x8c\\x05apply\\x94\\x93\\x94h\\x0f\\x8c\\x0cmethodcaller\\x94\\x93\\x94\\x8c\\x0breset_index\\x94\\x85\\x94R\\x94]\\x94\\x8c\\x13__dask_blockwise__5\\x94a\\x8c\\x08builtins\\x94\\x8c\\x04dict\\x94\\x93\\x94]\\x94]\\x94(\\x8c\\x04drop\\x94\\x89ea\\x86\\x94t\\x94h\\x07(h\\x11\\x8c\\x13dask.dataframe.core\\x94\\x8c\\x11apply_and_enforce\\x94\\x93\\x94]\\x94((h\\x11h#]\\x94h\\x0bh\\x0c\\x8c\\x13__dask_blockwise__0\\x94\\x87\\x94ah\\x1b]\\x94(]\\x94(\\x8c\\x05_func\\x94h\\x13\\x8c\\x08to_frame\\x94\\x85\\x94R\\x94e]\\x94(\\x8c\\x05_meta\\x94\\x8c\\x08builtins\\x94\\x8c\\x07getattr\\x94\\x93\\x94\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94\\x8c\\x10host_deserialize\\x94\\x86\\x94R\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94C0\\x80\\x04\\x95%\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94.\\x94\\x8c\\x0ccolumn_names\\x94C\\x14\\x80\\x04\\x95\\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x03src\\x94\\x85\\x94.\\x94\\x8c\\x07columns\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94C=\\x80\\x04\\x952\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x1acudf.core.column.numerical\\x94\\x8c\\x0fNumericalColumn\\x94\\x93\\x94.\\x94\\x8c\\x05dtype\\x94CB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i4\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94\\x8c\\x18dtype-is-cudf-serialized\\x94\\x89\\x8c\\x04data\\x94}\\x94(\\x8c\\x0ftype-serialized\\x94CI\\x80\\x04\\x95>\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x14SpillableBufferSlice\\x94\\x93\\x94.\\x94\\x8c\\x0bframe_count\\x94K\\x01u\\x8c\\x04mask\\x94}\\x94(hGCD\\x80\\x04\\x959\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x0fSpillableBuffer\\x94\\x93\\x94.\\x94hIK\\x01u\\x8c\\x04size\\x94K\\x00hIK\\x02u\\x85\\x94\\x8c\\x05index\\x94}\\x94(\\x8c\\x0cindex_column\\x94}\\x94(\\x8c\\x05start\\x94K\\x00\\x8c\\x04stop\\x94K\\x00\\x8c\\x04step\\x94K\\x01u\\x8c\\x04name\\x94C\\x04\\x80\\x04N.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i8\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94\\x8c\\x0ftype-serialized\\x94C-\\x80\\x04\\x95\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0fcudf.core.index\\x94\\x8c\\nRangeIndex\\x94\\x93\\x94.\\x94hIK\\x00u\\x8c\\x11index_frame_count\\x94K\\x00\\x8c\\x07is-cuda\\x94]\\x94(\\x88\\x88e\\x8c\\x07lengths\\x94]\\x94(K\\x00K\\x00e\\x8c\\twriteable\\x94NN\\x86\\x94u]\\x94(\\x8c\\x12numpy.core.numeric\\x94\\x8c\\x0b_frombuffer\\x94\\x93\\x94(C\\x00\\x94\\x8c\\x05numpy\\x94hB\\x93\\x94\\x8c\\x02u1\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01|\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94bK\\x00\\x85\\x94\\x8c\\x01C\\x94t\\x94R\\x94he(C\\x00\\x94hkK\\x00\\x85\\x94hot\\x94R\\x94e\\x86\\x94R\\x94ee\\x86\\x94t\\x94\\x8c\\x13__dask_blockwise__2\\x94eh\\x1b]\\x94(]\\x94(h*h\\x13\\x8c\\x06rename\\x94\\x85\\x94R\\x94e]\\x94(h/h2h5h6\\x86\\x94R\\x94}\\x94(h:C0\\x80\\x04\\x95%\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x13cudf.core.dataframe\\x94\\x8c\\tDataFrame\\x94\\x93\\x94.\\x94h}\\x94(h@C=\\x80\\x04\\x952\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x1acudf.core.column.numerical\\x94\\x8c\\x0fNumericalColumn\\x94\\x93\\x94.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i4\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94hD\\x89hE}\\x94(hGCI\\x80\\x04\\x95>\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c!cudf.core.buffer.spillable_buffer\\x94\\x8c\\x14SpillableBufferSlice\\x94\\x93\\x94.\\x94hIK\\x01uhMK\\x00hIK\\x01u\\x85\\x94hO}\\x94(hQ}\\x94(hSK\\x00hTK\\x00hUK\\x01uhVC\\x04\\x80\\x04N.\\x94hBCB\\x80\\x04\\x957\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x05numpy\\x94\\x8c\\x05dtype\\x94\\x93\\x94\\x8c\\x02i8\\x94\\x89\\x88\\x87\\x94R\\x94(K\\x03\\x8c\\x01<\\x94NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00t\\x94b.\\x94hYC-\\x80\\x04\\x95\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0fcudf.core.index\\x94\\x8c\\nRangeIndex\\x94\\x93\\x94.\\x94hIK\\x00uh[K\\x00h\\\\]\\x94\\x88ah^]\\x94K\\x00ah`N\\x85\\x94u]\\x94he(C\\x00\\x94hkK\\x00\\x85\\x94hot\\x94R\\x94a\\x86\\x94R\\x94e]\\x94(h>h\\x1b]\\x94]\\x94(\\x8c\\x03src\\x94h\\x9eea\\x86\\x94ee\\x86\\x94t\\x94h\\x05(h\\x11h!\\x8c\\x10_reduction_chunk\\x94\\x93\\x94]\\x94h\\x0b(\\x8c\\x16dask.dataframe.methods\\x94\\x8c\\x06assign\\x94\\x93\\x94h\\x06h\\rh\\x08t\\x94h&\\x87\\x94ah\\x1b]\\x94]\\x94(\\x8c\\taca_chunk\\x94h0\\x8c\\x03len\\x94\\x93\\x94ea\\x86\\x94t\\x94\\x8c\\x13__dask_blockwise__0\\x94h\\x9e\\x8c\\x13__dask_blockwise__1\\x94\\x8c\\x03dst\\x94\\x8c\\x13__dask_blockwise__2\\x94N\\x8c\\x13__dask_blockwise__3\\x94\\x8c)to_frame-804980ae30b71d28f0a6bd3d5b7610f9\\x94\\x8c\\x13__dask_blockwise__4\\x94\\x8c(getitem-15414b72be12e28054238b44933937ab\\x94\\x8c\\x13__dask_blockwise__6\\x94\\x8c3cudf-aggregate-agg-c50c2d97de169ca4f41e43a92a042630\\x94uh\\x04\\x8c\\x13__dask_blockwise__5\\x94\\x85\\x94\\x8c6subgraph_callable-b4ca530e-8895-432e-b553-40a7b5892ab2\\x94t\\x94R\\x94.'\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2244, in execute\n", + " function, args, kwargs = await self._maybe_deserialize_task(ts)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2216, in _maybe_deserialize_task\n", + " function, args, kwargs = _deserialize(*ts.run_spec)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py\", line 79, in inner\n", + " return func(*args, **kwds)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2937, in _deserialize\n", + " function = loads_function(function)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py\", line 2925, in loads_function\n", + " result = pickle.loads(bytes_object)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 96, in loads\n", + " return pickle.loads(x)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py\", line 176, in host_deserialize\n", + " obj = cls.device_deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py\", line 130, in device_deserialize\n", + " return typ.deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/dataframe.py\", line 1019, in deserialize\n", + " obj = super().deserialize(\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py\", line 106, in deserialize\n", + " columns = deserialize_columns(header[\"columns\"], frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 2450, in deserialize_columns\n", + " colobj = col_typ.deserialize(meta, frames[:col_frame_count])\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1216, in deserialize\n", + " data, frames = unpack(header[\"data\"], frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py\", line 1204, in unpack\n", + " obj = klass.deserialize(header, frames[:count])\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 574, in deserialize\n", + " return SpillableBuffer.deserialize(header, frames)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/buffer.py\", line 335, in deserialize\n", + " return cls._from_device_memory(frame)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 235, in _from_device_memory\n", + " ret._finalize_init(ptr_desc={\"type\": \"gpu\"}, exposed=exposed)\n", + " File \"/home/dacosta/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py\", line 206, in _finalize_init\n", + " raise ValueError(\n", + "ValueError: cannot create without a global spill manager\n" + ] + }, + { + "ename": "ValueError", + "evalue": "cannot create without a global spill manager", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \u001b[39;00m\n\u001b[1;32m 2\u001b[0m G \u001b[39m=\u001b[39m cugraph\u001b[39m.\u001b[39mGraph(directed\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)\n\u001b[0;32m----> 3\u001b[0m G\u001b[39m.\u001b[39;49mfrom_dask_cudf_edgelist(e_list, source\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39msrc\u001b[39;49m\u001b[39m'\u001b[39;49m, destination\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mdst\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 5\u001b[0m \u001b[39m# Print time\u001b[39;00m\n\u001b[1;32m 6\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mRead, load and renumber: \u001b[39m\u001b[39m\"\u001b[39m, time\u001b[39m.\u001b[39mtime()\u001b[39m-\u001b[39mt_start, \u001b[39m\"\u001b[39m\u001b[39ms\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cugraph/structure/graph_classes.py:309\u001b[0m, in \u001b[0;36mGraph.from_dask_cudf_edgelist\u001b[0;34m(self, input_ddf, source, destination, edge_attr, renumber, store_transposed, legacy_renum_only)\u001b[0m\n\u001b[1;32m 307\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_Impl\u001b[39m.\u001b[39medgelist \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 308\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mRuntimeError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mGraph already has values\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m--> 309\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_Impl\u001b[39m.\u001b[39;49m_simpleDistributedGraphImpl__from_edgelist(\n\u001b[1;32m 310\u001b[0m input_ddf,\n\u001b[1;32m 311\u001b[0m source,\n\u001b[1;32m 312\u001b[0m destination,\n\u001b[1;32m 313\u001b[0m edge_attr,\n\u001b[1;32m 314\u001b[0m renumber,\n\u001b[1;32m 315\u001b[0m store_transposed,\n\u001b[1;32m 316\u001b[0m legacy_renum_only,\n\u001b[1;32m 317\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cugraph/structure/graph_implementation/simpleDistributedGraph.py:272\u001b[0m, in \u001b[0;36msimpleDistributedGraphImpl.__from_edgelist\u001b[0;34m(self, input_ddf, source, destination, edge_attr, renumber, store_transposed, legacy_renum_only)\u001b[0m\n\u001b[1;32m 268\u001b[0m dst_col_name \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mrenumber_map\u001b[39m.\u001b[39mrenumbered_dst_col_name\n\u001b[1;32m 270\u001b[0m ddf \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39medgelist\u001b[39m.\u001b[39medgelist_df\n\u001b[0;32m--> 272\u001b[0m num_edges \u001b[39m=\u001b[39m \u001b[39mlen\u001b[39;49m(ddf)\n\u001b[1;32m 273\u001b[0m edge_data \u001b[39m=\u001b[39m get_distributed_data(ddf)\n\u001b[1;32m 275\u001b[0m graph_props \u001b[39m=\u001b[39m GraphProperties(\n\u001b[1;32m 276\u001b[0m is_multigraph\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mproperties\u001b[39m.\u001b[39mmulti_edge,\n\u001b[1;32m 277\u001b[0m is_symmetric\u001b[39m=\u001b[39m\u001b[39mnot\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mproperties\u001b[39m.\u001b[39mdirected,\n\u001b[1;32m 278\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/dataframe/core.py:4775\u001b[0m, in \u001b[0;36mDataFrame.__len__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 4773\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__len__\u001b[39m()\n\u001b[1;32m 4774\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m-> 4775\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mlen\u001b[39;49m(s)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/dataframe/core.py:843\u001b[0m, in \u001b[0;36m_Frame.__len__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 840\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__len__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 841\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mreduction(\n\u001b[1;32m 842\u001b[0m \u001b[39mlen\u001b[39;49m, np\u001b[39m.\u001b[39;49msum, token\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mlen\u001b[39;49m\u001b[39m\"\u001b[39;49m, meta\u001b[39m=\u001b[39;49m\u001b[39mint\u001b[39;49m, split_every\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m\n\u001b[0;32m--> 843\u001b[0m )\u001b[39m.\u001b[39;49mcompute()\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/base.py:314\u001b[0m, in \u001b[0;36mDaskMethodsMixin.compute\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mcompute\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 291\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Compute this dask collection\u001b[39;00m\n\u001b[1;32m 292\u001b[0m \n\u001b[1;32m 293\u001b[0m \u001b[39m This turns a lazy Dask collection into its in-memory equivalent.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 312\u001b[0m \u001b[39m dask.base.compute\u001b[39;00m\n\u001b[1;32m 313\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 314\u001b[0m (result,) \u001b[39m=\u001b[39m compute(\u001b[39mself\u001b[39;49m, traverse\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 315\u001b[0m \u001b[39mreturn\u001b[39;00m result\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/dask/base.py:599\u001b[0m, in \u001b[0;36mcompute\u001b[0;34m(traverse, optimize_graph, scheduler, get, *args, **kwargs)\u001b[0m\n\u001b[1;32m 596\u001b[0m keys\u001b[39m.\u001b[39mappend(x\u001b[39m.\u001b[39m__dask_keys__())\n\u001b[1;32m 597\u001b[0m postcomputes\u001b[39m.\u001b[39mappend(x\u001b[39m.\u001b[39m__dask_postcompute__())\n\u001b[0;32m--> 599\u001b[0m results \u001b[39m=\u001b[39m schedule(dsk, keys, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 600\u001b[0m \u001b[39mreturn\u001b[39;00m repack([f(r, \u001b[39m*\u001b[39ma) \u001b[39mfor\u001b[39;00m r, (f, a) \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(results, postcomputes)])\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/client.py:3186\u001b[0m, in \u001b[0;36mClient.get\u001b[0;34m(self, dsk, keys, workers, allow_other_workers, resources, sync, asynchronous, direct, retries, priority, fifo_timeout, actors, **kwargs)\u001b[0m\n\u001b[1;32m 3184\u001b[0m should_rejoin \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 3185\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m-> 3186\u001b[0m results \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mgather(packed, asynchronous\u001b[39m=\u001b[39;49masynchronous, direct\u001b[39m=\u001b[39;49mdirect)\n\u001b[1;32m 3187\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[1;32m 3188\u001b[0m \u001b[39mfor\u001b[39;00m f \u001b[39min\u001b[39;00m futures\u001b[39m.\u001b[39mvalues():\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/client.py:2345\u001b[0m, in \u001b[0;36mClient.gather\u001b[0;34m(self, futures, errors, direct, asynchronous)\u001b[0m\n\u001b[1;32m 2343\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 2344\u001b[0m local_worker \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[0;32m-> 2345\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49msync(\n\u001b[1;32m 2346\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_gather,\n\u001b[1;32m 2347\u001b[0m futures,\n\u001b[1;32m 2348\u001b[0m errors\u001b[39m=\u001b[39;49merrors,\n\u001b[1;32m 2349\u001b[0m direct\u001b[39m=\u001b[39;49mdirect,\n\u001b[1;32m 2350\u001b[0m local_worker\u001b[39m=\u001b[39;49mlocal_worker,\n\u001b[1;32m 2351\u001b[0m asynchronous\u001b[39m=\u001b[39;49masynchronous,\n\u001b[1;32m 2352\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/utils.py:349\u001b[0m, in \u001b[0;36mSyncMethodMixin.sync\u001b[0;34m(self, func, asynchronous, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[1;32m 347\u001b[0m \u001b[39mreturn\u001b[39;00m future\n\u001b[1;32m 348\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 349\u001b[0m \u001b[39mreturn\u001b[39;00m sync(\n\u001b[1;32m 350\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mloop, func, \u001b[39m*\u001b[39;49margs, callback_timeout\u001b[39m=\u001b[39;49mcallback_timeout, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs\n\u001b[1;32m 351\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/utils.py:416\u001b[0m, in \u001b[0;36msync\u001b[0;34m(loop, func, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[1;32m 414\u001b[0m \u001b[39mif\u001b[39;00m error:\n\u001b[1;32m 415\u001b[0m typ, exc, tb \u001b[39m=\u001b[39m error\n\u001b[0;32m--> 416\u001b[0m \u001b[39mraise\u001b[39;00m exc\u001b[39m.\u001b[39mwith_traceback(tb)\n\u001b[1;32m 417\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 418\u001b[0m \u001b[39mreturn\u001b[39;00m result\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/utils.py:389\u001b[0m, in \u001b[0;36msync..f\u001b[0;34m()\u001b[0m\n\u001b[1;32m 387\u001b[0m future \u001b[39m=\u001b[39m wait_for(future, callback_timeout)\n\u001b[1;32m 388\u001b[0m future \u001b[39m=\u001b[39m asyncio\u001b[39m.\u001b[39mensure_future(future)\n\u001b[0;32m--> 389\u001b[0m result \u001b[39m=\u001b[39m \u001b[39myield\u001b[39;00m future\n\u001b[1;32m 390\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[1;32m 391\u001b[0m error \u001b[39m=\u001b[39m sys\u001b[39m.\u001b[39mexc_info()\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/tornado/gen.py:769\u001b[0m, in \u001b[0;36mRunner.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 766\u001b[0m exc_info \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m 768\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 769\u001b[0m value \u001b[39m=\u001b[39m future\u001b[39m.\u001b[39;49mresult()\n\u001b[1;32m 770\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[1;32m 771\u001b[0m exc_info \u001b[39m=\u001b[39m sys\u001b[39m.\u001b[39mexc_info()\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/client.py:2208\u001b[0m, in \u001b[0;36mClient._gather\u001b[0;34m(self, futures, errors, direct, local_worker)\u001b[0m\n\u001b[1;32m 2206\u001b[0m exc \u001b[39m=\u001b[39m CancelledError(key)\n\u001b[1;32m 2207\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m-> 2208\u001b[0m \u001b[39mraise\u001b[39;00m exception\u001b[39m.\u001b[39mwith_traceback(traceback)\n\u001b[1;32m 2209\u001b[0m \u001b[39mraise\u001b[39;00m exc\n\u001b[1;32m 2210\u001b[0m \u001b[39mif\u001b[39;00m errors \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mskip\u001b[39m\u001b[39m\"\u001b[39m:\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/contextlib.py:79\u001b[0m, in \u001b[0;36minner\u001b[0;34m()\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[39m@wraps\u001b[39m(func)\n\u001b[1;32m 77\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39minner\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwds):\n\u001b[1;32m 78\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_recreate_cm():\n\u001b[0;32m---> 79\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwds)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py:2937\u001b[0m, in \u001b[0;36m_deserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2934\u001b[0m \u001b[39m# Some objects require threadlocal state during deserialization, e.g. to\u001b[39;00m\n\u001b[1;32m 2935\u001b[0m \u001b[39m# detect the current worker\u001b[39;00m\n\u001b[1;32m 2936\u001b[0m \u001b[39mif\u001b[39;00m function \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m-> 2937\u001b[0m function \u001b[39m=\u001b[39m loads_function(function)\n\u001b[1;32m 2938\u001b[0m \u001b[39mif\u001b[39;00m args \u001b[39mand\u001b[39;00m \u001b[39misinstance\u001b[39m(args, \u001b[39mbytes\u001b[39m):\n\u001b[1;32m 2939\u001b[0m args \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(args)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/worker.py:2925\u001b[0m, in \u001b[0;36mloads_function\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2923\u001b[0m result \u001b[39m=\u001b[39m cache_loads[bytes_object]\n\u001b[1;32m 2924\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mKeyError\u001b[39;00m:\n\u001b[0;32m-> 2925\u001b[0m result \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(bytes_object)\n\u001b[1;32m 2926\u001b[0m cache_loads[bytes_object] \u001b[39m=\u001b[39m result\n\u001b[1;32m 2927\u001b[0m \u001b[39mreturn\u001b[39;00m result\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/distributed/protocol/pickle.py:96\u001b[0m, in \u001b[0;36mloads\u001b[0;34m()\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[39mreturn\u001b[39;00m pickle\u001b[39m.\u001b[39mloads(x, buffers\u001b[39m=\u001b[39mbuffers)\n\u001b[1;32m 95\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m---> 96\u001b[0m \u001b[39mreturn\u001b[39;00m pickle\u001b[39m.\u001b[39mloads(x)\n\u001b[1;32m 97\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[1;32m 98\u001b[0m logger\u001b[39m.\u001b[39minfo(\u001b[39m\"\u001b[39m\u001b[39mFailed to deserialize \u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m\"\u001b[39m, x[:\u001b[39m10000\u001b[39m], exc_info\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py:176\u001b[0m, in \u001b[0;36mhost_deserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"Perform device-side deserialization tasks.\u001b[39;00m\n\u001b[1;32m 155\u001b[0m \n\u001b[1;32m 156\u001b[0m \u001b[39mParameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[39m:meta private:\u001b[39;00m\n\u001b[1;32m 171\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 172\u001b[0m frames \u001b[39m=\u001b[39m [\n\u001b[1;32m 173\u001b[0m cudf\u001b[39m.\u001b[39mcore\u001b[39m.\u001b[39mbuffer\u001b[39m.\u001b[39mas_buffer(f) \u001b[39mif\u001b[39;00m c \u001b[39melse\u001b[39;00m f\n\u001b[1;32m 174\u001b[0m \u001b[39mfor\u001b[39;00m c, f \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(header[\u001b[39m\"\u001b[39m\u001b[39mis-cuda\u001b[39m\u001b[39m\"\u001b[39m], \u001b[39mmap\u001b[39m(\u001b[39mmemoryview\u001b[39m, frames))\n\u001b[1;32m 175\u001b[0m ]\n\u001b[0;32m--> 176\u001b[0m obj \u001b[39m=\u001b[39m \u001b[39mcls\u001b[39m\u001b[39m.\u001b[39mdevice_deserialize(header, frames)\n\u001b[1;32m 177\u001b[0m \u001b[39mreturn\u001b[39;00m obj\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/abc.py:130\u001b[0m, in \u001b[0;36mdevice_deserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 125\u001b[0m typ \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mtype-serialized\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 126\u001b[0m frames \u001b[39m=\u001b[39m [\n\u001b[1;32m 127\u001b[0m cudf\u001b[39m.\u001b[39mcore\u001b[39m.\u001b[39mbuffer\u001b[39m.\u001b[39mas_buffer(f) \u001b[39mif\u001b[39;00m c \u001b[39melse\u001b[39;00m \u001b[39mmemoryview\u001b[39m(f)\n\u001b[1;32m 128\u001b[0m \u001b[39mfor\u001b[39;00m c, f \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(header[\u001b[39m\"\u001b[39m\u001b[39mis-cuda\u001b[39m\u001b[39m\"\u001b[39m], frames)\n\u001b[1;32m 129\u001b[0m ]\n\u001b[0;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m typ\u001b[39m.\u001b[39mdeserialize(header, frames)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/dataframe.py:1019\u001b[0m, in \u001b[0;36mdeserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1016\u001b[0m \u001b[39m@classmethod\u001b[39m\n\u001b[1;32m 1017\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdeserialize\u001b[39m(\u001b[39mcls\u001b[39m, header, frames):\n\u001b[1;32m 1018\u001b[0m index_nframes \u001b[39m=\u001b[39m header[\u001b[39m\"\u001b[39m\u001b[39mindex_frame_count\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m-> 1019\u001b[0m obj \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39mdeserialize(\n\u001b[1;32m 1020\u001b[0m header, frames[header[\u001b[39m\"\u001b[39m\u001b[39mindex_frame_count\u001b[39m\u001b[39m\"\u001b[39m] :]\n\u001b[1;32m 1021\u001b[0m )\n\u001b[1;32m 1023\u001b[0m idx_typ \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mindex\u001b[39m\u001b[39m\"\u001b[39m][\u001b[39m\"\u001b[39m\u001b[39mtype-serialized\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 1024\u001b[0m index \u001b[39m=\u001b[39m idx_typ\u001b[39m.\u001b[39mdeserialize(header[\u001b[39m\"\u001b[39m\u001b[39mindex\u001b[39m\u001b[39m\"\u001b[39m], frames[:index_nframes])\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/frame.py:106\u001b[0m, in \u001b[0;36mdeserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 104\u001b[0m cls_deserialize \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mtype-serialized\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 105\u001b[0m column_names \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mcolumn_names\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[0;32m--> 106\u001b[0m columns \u001b[39m=\u001b[39m deserialize_columns(header[\u001b[39m\"\u001b[39m\u001b[39mcolumns\u001b[39m\u001b[39m\"\u001b[39m], frames)\n\u001b[1;32m 107\u001b[0m \u001b[39mreturn\u001b[39;00m cls_deserialize\u001b[39m.\u001b[39m_from_data(\u001b[39mdict\u001b[39m(\u001b[39mzip\u001b[39m(column_names, columns)))\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py:2450\u001b[0m, in \u001b[0;36mdeserialize_columns\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2448\u001b[0m col_frame_count \u001b[39m=\u001b[39m meta[\u001b[39m\"\u001b[39m\u001b[39mframe_count\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[1;32m 2449\u001b[0m col_typ \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(meta[\u001b[39m\"\u001b[39m\u001b[39mtype-serialized\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[0;32m-> 2450\u001b[0m colobj \u001b[39m=\u001b[39m col_typ\u001b[39m.\u001b[39mdeserialize(meta, frames[:col_frame_count])\n\u001b[1;32m 2451\u001b[0m columns\u001b[39m.\u001b[39mappend(colobj)\n\u001b[1;32m 2452\u001b[0m \u001b[39m# Advance frames\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py:1216\u001b[0m, in \u001b[0;36mdeserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1214\u001b[0m dtype \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mdtype\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 1215\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mdata\u001b[39m\u001b[39m\"\u001b[39m \u001b[39min\u001b[39;00m header:\n\u001b[0;32m-> 1216\u001b[0m data, frames \u001b[39m=\u001b[39m unpack(header[\u001b[39m\"\u001b[39m\u001b[39mdata\u001b[39m\u001b[39m\"\u001b[39m], frames)\n\u001b[1;32m 1217\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 1218\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/column/column.py:1204\u001b[0m, in \u001b[0;36munpack\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1202\u001b[0m count \u001b[39m=\u001b[39m header[\u001b[39m\"\u001b[39m\u001b[39mframe_count\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[1;32m 1203\u001b[0m klass \u001b[39m=\u001b[39m pickle\u001b[39m.\u001b[39mloads(header[\u001b[39m\"\u001b[39m\u001b[39mtype-serialized\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[0;32m-> 1204\u001b[0m obj \u001b[39m=\u001b[39m klass\u001b[39m.\u001b[39mdeserialize(header, frames[:count])\n\u001b[1;32m 1205\u001b[0m \u001b[39mreturn\u001b[39;00m obj, frames[count:]\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py:574\u001b[0m, in \u001b[0;36mdeserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 567\u001b[0m \u001b[39m@classmethod\u001b[39m\n\u001b[1;32m 568\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdeserialize\u001b[39m(\u001b[39mcls\u001b[39m, header: \u001b[39mdict\u001b[39m, frames: \u001b[39mlist\u001b[39m):\n\u001b[1;32m 569\u001b[0m \u001b[39m# TODO: because of the hack in `SpillableBuffer.serialize()` where\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 572\u001b[0m \u001b[39m# deserialize into `SpillableBufferSlice` when the frames hasn't been\u001b[39;00m\n\u001b[1;32m 573\u001b[0m \u001b[39m# copied.\u001b[39;00m\n\u001b[0;32m--> 574\u001b[0m \u001b[39mreturn\u001b[39;00m SpillableBuffer\u001b[39m.\u001b[39mdeserialize(header, frames)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/buffer.py:335\u001b[0m, in \u001b[0;36mdeserialize\u001b[0;34m()\u001b[0m\n\u001b[1;32m 332\u001b[0m \u001b[39mreturn\u001b[39;00m frame \u001b[39m# The frame is already deserialized\u001b[39;00m\n\u001b[1;32m 334\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mhasattr\u001b[39m(frame, \u001b[39m\"\u001b[39m\u001b[39m__cuda_array_interface__\u001b[39m\u001b[39m\"\u001b[39m):\n\u001b[0;32m--> 335\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m_from_device_memory(frame)\n\u001b[1;32m 336\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m_from_host_memory(frame)\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py:235\u001b[0m, in \u001b[0;36m_from_device_memory\u001b[0;34m()\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"Create a spillabe buffer from device memory.\u001b[39;00m\n\u001b[1;32m 219\u001b[0m \n\u001b[1;32m 220\u001b[0m \u001b[39mNo data is being copied.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[39m Buffer representing the same device memory as `data`\u001b[39;00m\n\u001b[1;32m 233\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 234\u001b[0m ret \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m_from_device_memory(data)\n\u001b[0;32m--> 235\u001b[0m ret\u001b[39m.\u001b[39m_finalize_init(ptr_desc\u001b[39m=\u001b[39m{\u001b[39m\"\u001b[39m\u001b[39mtype\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mgpu\u001b[39m\u001b[39m\"\u001b[39m}, exposed\u001b[39m=\u001b[39mexposed)\n\u001b[1;32m 236\u001b[0m \u001b[39mreturn\u001b[39;00m ret\n", + "File \u001b[0;32m~/miniconda3/envs/cugraph_0411/lib/python3.10/site-packages/cudf/core/buffer/spillable_buffer.py:206\u001b[0m, in \u001b[0;36m_finalize_init\u001b[0;34m()\u001b[0m\n\u001b[1;32m 204\u001b[0m manager \u001b[39m=\u001b[39m get_global_manager()\n\u001b[1;32m 205\u001b[0m \u001b[39mif\u001b[39;00m manager \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m--> 206\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 207\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mcannot create \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__class__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m without \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 208\u001b[0m \u001b[39m\"\u001b[39m\u001b[39ma global spill manager\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 209\u001b[0m )\n\u001b[1;32m 211\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_manager \u001b[39m=\u001b[39m manager\n\u001b[1;32m 212\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_manager\u001b[39m.\u001b[39madd(\u001b[39mself\u001b[39m)\n", + "\u001b[0;31mValueError\u001b[0m: cannot create without a global spill manager" + ] + } + ], "source": [ "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", "G = cugraph.Graph(directed=True)\n", @@ -170,6 +517,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -196,6 +544,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -204,6 +553,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -236,6 +586,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -251,6 +602,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -269,6 +621,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -280,11 +633,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -295,9 +649,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0411", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -309,7 +663,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.10" } }, "nbformat": 4, diff --git a/notebooks/demo/mg_property_graph.ipynb b/notebooks/demo/mg_property_graph.ipynb index 0a5aa5df8..d2f0f456c 100644 --- a/notebooks/demo/mg_property_graph.ipynb +++ b/notebooks/demo/mg_property_graph.ipynb @@ -14,7 +14,7 @@ "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", "|---------------|------------|------------------|-----------------|-----------------------|\n", "| Don Acosta | 01/30/2023 | created | 23.02 nightly | 2xA6000 CUDA 11.7 |\n", - "\n", + "| Don Acosta | 05/15/2023 | update/test | 23.06 nightly | 2xA6000 CUDA 11.7 |\n", "\n", "CuGraph's multi-GPU features leverage Dask. RAPIDS has other projects based on Dask such as dask-cudf and dask-cuda. These products will also be used in this example. Check out [RAPIDS.ai](https://rapids.ai/) to learn more about these technologies." ] @@ -89,6 +89,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +109,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -126,10 +128,10 @@ "\n", "# Helper function to set the reader chunk size to automatically get one partition per GPU \n", "input_data_path = get_data_file()\n", - "chunksize = dask_cugraph.get_chunksize(input_data_path)\n", + "blocksize = dask_cugraph.get_chunksize(input_data_path)\n", "\n", "# Multi-GPU CSV reader\n", - "e_list = dask_cudf.read_csv(input_data_path, chunksize = chunksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" + "e_list = dask_cudf.read_csv(input_data_path, blocksize = blocksize, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'])" ] }, { @@ -154,6 +156,14 @@ "pG.get_num_edges()" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run louvain and print out the partition data" + ] + }, { "cell_type": "code", "execution_count": null, @@ -215,7 +225,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.10.10" }, "orig_nbformat": 4, "vscode": { From 62ef0f5eba8b8f67bdab009dadfe697896ca25d1 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Fri, 19 May 2023 09:50:01 -0400 Subject: [PATCH 251/384] DOC --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 983584839..394acf0e9 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -76,9 +76,9 @@ # built documents. # # The short X.Y version. -version = '23.06' +version = '23.08' # The full version, including alpha/beta/rc tags. -release = '23.06.00' +release = '23.08.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 69a4ee674a49876fb74495cc0f2c14a8492b5416 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 19 May 2023 21:56:15 -0500 Subject: [PATCH 252/384] Updates pytest benchmarks to use synthetic data and multi-GPUs (#3540) closes #2810 closes #3282 * Adds the ability to use datasets read from files on disk and/or RMAT-generated synthetic datasets. * Adds markers for "file_data" and "rmat_data" for use by benchmark scripts, based on cluster size. * Adds CLI options for specifying the RMAT scale and edgefactor in order to generate datasets large enough for MNMG runs. * Adds fixtures for use by `bench_algos.py` benchmarks which will instantiate graph objs based on dataset type and SG or MG markers. * Updated `Dataset` class to allow instances to be used as test params and properly provide human-readable/deterministic test IDs. * Added ability for `Dataset` ctor to take a .csf file as input, useful when a metadata.yaml file for a dataset has not been created yet. * Added options to `get_test_data.sh` in the CI scripts to download a subset of datasets for C++ (to save time/space since most datasets aren't needed), and to only download the benchmark data for python (for use when running benchmarks as tests). Authors: - Rick Ratzel (https://github.com/rlratzel) - Alex Barghi (https://github.com/alexbarghi-nv) Approvers: - Alex Barghi (https://github.com/alexbarghi-nv) - Vibhu Jawa (https://github.com/VibhuJawa) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/3540 --- benchmarks/pytest.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index b61fa92d4..6af3aab27 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -14,7 +14,6 @@ markers = managedmem_off: RMM managed memory disabled poolallocator_on: RMM pool allocator enabled poolallocator_off: RMM pool allocator disabled - ETL: benchmarks for ETL steps small: small datasets tiny: tiny datasets directed: directed datasets @@ -50,6 +49,8 @@ markers = num_clients_32: start 32 cugraph-service clients fanout_10_25: fanout [10, 25] for sampling algos fanout_5_10_15: fanout [5, 10, 15] for sampling algos + rmat_data: RMAT-generated synthetic datasets + file_data: datasets from $RAPIDS_DATASET_ROOT_DIR python_classes = Bench* From 911768caefdc12eee9f1fe22bb4677b38e0a4831 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 23 May 2023 08:27:17 -0400 Subject: [PATCH 253/384] UVM notebook update and add tracker for notebooks to readme (#3595) resolves [graph_dl issue 192](https://github.com/rapidsai/graph_dl/issues/192) fixed deprecated item in uvm notebook Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3595 --- notebooks/demo/uvm.ipynb | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/notebooks/demo/uvm.ipynb b/notebooks/demo/uvm.ipynb index d4d9caeba..96dcb425f 100644 --- a/notebooks/demo/uvm.ipynb +++ b/notebooks/demo/uvm.ipynb @@ -1,22 +1,31 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Oversubscribing GPU memory in cuGraph\n", - "#### Author : Alex Fender\n", "# Skip notebook test\n", "\n", + "\n", "In this notebook, we will show how to **scale to 4x larger graphs than before** without incurring a performance drop using managed memory features in cuGraph. We will compute the PageRank of each user in Twitter's dataset on a single GPU as an example. This technique applies to all features.\n", "\n", "Unified Memory is a single memory address space accessible from any processor in a system. If a kernel tries to access any absent pages,the Page Migration Engine migrates the pages. When the GPU memory is full, the least recently used pages are evicted. In other words, Unified Memory transparently enables oversubscribing GPU memory, enabling out-of-core computations.\n", "\n", "\n", - "This notebook was tested on an NVIDIA 48GB RTX8000 GPU using RAPIDS 0.14 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)" + "This notebook was tested on an NVIDIA 48GB RTX8000 GPU using RAPIDS 0.14 and CUDA 10.2. Please be aware that your system may be different, and you may need to modify the code or install packages to run the below examples. If you think you have found a bug or an error, please file an issue in [cuGraph](https://github.com/rapidsai/cugraph/issues)\n", + "\n", + "| Author Credit | Date | Update | cuGraph Version | Test Hardware |\n", + "|-----------------|------------|-----------------------|-----------------|--------------------------------|\n", + "|Alex Fender | 05/15/2020 | created | 0.14 | RTX8000 48G GPU CUDA 10.2 |\n", + "|Chuck Hastings | 02/21/2021 | incorporate dendrogram| 0.18 | |\n", + "|Jordan Jacobelli | 11/08/2021 | update dataset URL | 23.04 | |\n", + "| Don Acosta | 05/21/2023 | updated/tested | 23.06 nightly | 2xA6000 CUDA 11.7 |\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -30,6 +39,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -58,6 +68,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -78,6 +89,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,6 +97,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -135,6 +148,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -159,6 +173,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -174,8 +189,8 @@ "t_start = time.time()\n", "\n", "# Create a directed graph using the source (src) and destination (dst) vertex pairs from the Dataframe \n", - "G = cugraph.DiGraph()\n", - "G.from_cudf_edgelist(e_list, source='src', destination='dst', renumber=False)\n", + "G = cugraph.Graph(directed=True)\n", + "G.from_cudf_edgelist(e_list, source='src', destination='dst', renumber=False, store_transposed=True)\n", "\n", "# (optional) request the transposed here so that we can analyse pagerank solver time alone\n", "G.view_transposed_adj_list()\n", @@ -185,6 +200,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -210,6 +226,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -218,6 +235,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -249,6 +267,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -264,6 +283,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -275,11 +295,12 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "___\n", - "Copyright (c) 2020, NVIDIA CORPORATION.\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", "\n", "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\n", "\n", @@ -290,9 +311,9 @@ ], "metadata": { "kernelspec": { - "display_name": "cugraph_dev", + "display_name": "cugraph_0411", "language": "python", - "name": "cugraph_dev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -304,7 +325,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.10.10" } }, "nbformat": 4, From 575fb3eca1a6df135f67e74b318cf5381b0b4fc8 Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Thu, 25 May 2023 22:16:11 -0400 Subject: [PATCH 254/384] [BUG] Fix Issue in cuGraph-PyG Tests Blocking CI (#3607) One of the fixtures for the cuGraph-PyG tests is not properly partitioning the edgelist, causing some tests to fail. This PR updates that fixture to correctly partition the edgelist. Authors: - Alex Barghi (https://github.com/alexbarghi-nv) - Bradley Dice (https://github.com/bdice) - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/3607 --- docs/cugraph/source/installation/getting_cugraph.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 374a529d6..509508c52 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -38,7 +38,7 @@ 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 numba -c conda-forge -c nvidia cugraph cudatoolkit=11.8 +conda install -c rapidsai -c conda-forge -c nvidia cugraph cudatoolkit=11.8 ``` Note: This conda installation only applies to Linux and Python versions 3.8/3.10. From 4c32c5c1d739b69f38bfc383b78f33c5df5eed23 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Wed, 7 Jun 2023 17:03:58 -0400 Subject: [PATCH 255/384] REL v23.06.00 release From f9161930dd26487c74491231e40471a78f1c09d3 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Fri, 9 Jun 2023 09:46:40 -0400 Subject: [PATCH 256/384] REL v23.06.01 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 983584839..96d813c6e 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -78,7 +78,7 @@ # The short X.Y version. version = '23.06' # The full version, including alpha/beta/rc tags. -release = '23.06.00' +release = '23.06.01' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From d94466f32bcc48247bf85a7e6417ca589b9bd2f6 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Tue, 13 Jun 2023 09:43:36 -0400 Subject: [PATCH 257/384] REL v23.06.02 release --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 96d813c6e..5b7ba8d1b 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -78,7 +78,7 @@ # The short X.Y version. version = '23.06' # The full version, including alpha/beta/rc tags. -release = '23.06.01' +release = '23.06.02' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 4dfe0707014a88839a830b938eb09e1912b2a92b Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 27 Jun 2023 12:23:39 -0400 Subject: [PATCH 258/384] this fixes github links in cugraph, cugraph-dgl and cugraph-pyg (#3650) resolves #3635 AJ Schmidt came up with this fix. It does correct all the links in the cugraph projects. Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3650 --- docs/cugraph/source/conf.py | 5 +- docs/cugraph/source/sphinxext/github_link.py | 72 ++++++++------------ 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 394acf0e9..b64901772 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -204,6 +204,5 @@ def setup(app): # The following is used by sphinx.ext.linkcode to provide links to github linkcode_resolve = make_linkcode_resolve( - 'cugraph', 'https://github.com/rapidsai/' - 'cugraph/blob/{revision}/python/' - '{package}/{path}#L{lineno}') + "https://github.com/rapidsai/cugraph/blob/{revision}/python/{path}#L{lineno}" +) \ No newline at end of file diff --git a/docs/cugraph/source/sphinxext/github_link.py b/docs/cugraph/source/sphinxext/github_link.py index fa8fe3f5f..cc28dc6e8 100644 --- a/docs/cugraph/source/sphinxext/github_link.py +++ b/docs/cugraph/source/sphinxext/github_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2021, NVIDIA CORPORATION. +# 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 @@ -16,10 +16,8 @@ # license in /thirdparty/LICENSES/LICENSE.scikit_learn import inspect -import os import re import subprocess -import sys from functools import partial from operator import attrgetter @@ -56,7 +54,7 @@ def _get_git_revision(): return revision.decode('utf-8') -def _linkcode_resolve(domain, info, package, url_fmt, revision): +def _linkcode_resolve(domain, info, url_fmt, revision): """Determine a link to online source for a class/method/function This is called by sphinx.ext.linkcode @@ -73,7 +71,7 @@ def _linkcode_resolve(domain, info, package, url_fmt, revision): if revision is None: return - if domain not in ('py', 'pyx'): + if domain != 'py': return if not info.get('module') or not info.get('fullname'): return @@ -89,41 +87,29 @@ def _linkcode_resolve(domain, info, package, url_fmt, revision): fn: str = None lineno: str = None - try: - fn = inspect.getsourcefile(obj) - except Exception: - fn = None - if not fn: - try: - fn = inspect.getsourcefile(sys.modules[obj.__module__]) - except Exception: - fn = None - - if not fn: - # Possibly Cython code. Search docstring for source - m = source_regex.search(obj.__doc__) - - if (m is not None): - source_file = m.group(1) - lineno = m.group(2) - - # fn is expected to be the absolute path. - fn = os.path.relpath(source_file, start=package) - print("{}:{}".format( - os.path.abspath(os.path.join("..", "python", "cuml", fn)), - lineno)) - else: - return - else: - # Test if we are absolute or not (pyx are relative) - if (not os.path.isabs(fn)): - # Should be relative to docs right now - fn = os.path.abspath(os.path.join("..", "python", fn)) - - # Convert to relative from module root - fn = os.path.relpath(fn, - start=os.path.dirname( - __import__(package).__file__)) + obj_module = inspect.getmodule(obj) + if not obj_module: + print(f"could not infer source code link for: {info}") + return + module_name = obj_module.__name__.split('.')[0] + + module_dir_dict = { + "cugraph_dgl": "cugraph-dgl", + "cugraph_pyg": "cugraph-pyg", + "cugraph_service_client": "cugraph-service/client", + "cugraph_service_server": "cugraph-service/server", + "cugraph": "cugraph", + "pylibcugraph": "pylibcugraph", + } + module_dir = module_dir_dict.get(module_name) + if not module_dir: + print(f"no source path directory set for {module_name}") + return + + obj_path = "/".join(obj_module.__name__.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): @@ -137,18 +123,15 @@ def _linkcode_resolve(domain, info, package, url_fmt, revision): else: lineno = '' return url_fmt.format(revision=revision, - package=package, path=fn, lineno=lineno) -def make_linkcode_resolve(package, url_fmt): +def make_linkcode_resolve(url_fmt): """Returns a linkcode_resolve function for the given URL format revision is a git commit reference (hash or name) - package is the name of the root module of the package - url_fmt is along the lines of ('https://github.com/USER/PROJECT/' 'blob/{revision}/{package}/' '{path}#L{lineno}') @@ -156,5 +139,4 @@ def make_linkcode_resolve(package, url_fmt): revision = _get_git_revision() return partial(_linkcode_resolve, revision=revision, - package=package, url_fmt=url_fmt) From b1e7a4df8bd4d8fce9f296dfdd24f0e0070f7619 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Fri, 21 Jul 2023 09:55:43 -0400 Subject: [PATCH 259/384] v23.10 Updates [skip ci] --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index b64901772..a96f0fc1e 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -76,9 +76,9 @@ # built documents. # # The short X.Y version. -version = '23.08' +version = '23.10' # The full version, including alpha/beta/rc tags. -release = '23.08.00' +release = '23.10.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b0721e9323623cceb66cc7bc1973dd53a3cb7d3b Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:28:13 -0400 Subject: [PATCH 260/384] Created landing spot for centrality and similarity algorithms (#3620) resolves #3030 resolves #3023 Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3620 --- .../source/graph_support/DGL_support.md | 14 ++- .../source/graph_support/algorithms.md | 84 ++++++++++-------- .../graph_support/algorithms/Centrality.md | 38 ++++++++ .../graph_support/algorithms/Similarity.md | 38 ++++++++ .../algorithms/betweenness_centrality.md | 42 +++++++++ .../algorithms/degree_centrality.md | 32 +++++++ .../algorithms/eigenvector_centrality.md | 42 +++++++++ .../algorithms/jaccard_similarity.md | 34 +++++++ .../algorithms/katz_centrality.md | 28 ++++++ .../algorithms/overlap_similarity.md | 32 +++++++ .../algorithms/sorensen_coefficient.md | 34 +++++++ .../images/zachary_graph_centrality.png | Bin 0 -> 141188 bytes .../source/tutorials/cugraph_notebooks.md | 22 ++--- 13 files changed, 386 insertions(+), 54 deletions(-) create mode 100644 docs/cugraph/source/graph_support/algorithms/Centrality.md create mode 100644 docs/cugraph/source/graph_support/algorithms/Similarity.md create mode 100644 docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md create mode 100644 docs/cugraph/source/graph_support/algorithms/degree_centrality.md create mode 100644 docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md create mode 100644 docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md create mode 100644 docs/cugraph/source/graph_support/algorithms/katz_centrality.md create mode 100644 docs/cugraph/source/graph_support/algorithms/overlap_similarity.md create mode 100644 docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md create mode 100644 docs/cugraph/source/images/zachary_graph_centrality.png diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md index 4db2a4d77..fc1f1b45b 100644 --- a/docs/cugraph/source/graph_support/DGL_support.md +++ b/docs/cugraph/source/graph_support/DGL_support.md @@ -35,15 +35,14 @@ pytest tests/* ## Usage ```diff -+from cugraph_dgl.convert import cugraph_storage_from_heterograph -+cugraph_g = cugraph_storage_from_heterograph(dgl_g) +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( -- dgl_g, -+ cugraph_g, +cugraph_g, train_idx, sampler, device=device, @@ -53,3 +52,10 @@ 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/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md index 60243fefb..f6cb7c0d8 100644 --- a/docs/cugraph/source/graph_support/algorithms.md +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -20,55 +20,55 @@ _Italic_ algorithms are planned for future releases. Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called MNMG). -| Category | Algorithm | Scale | Notes | +| Category | Notebooks | Scale | Notes | | ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | -| [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) | Single-GPU | MG planned for 23.02 | -| | [Edge Betweenness Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Betweenness.ipynb) | Single-GPU | MG planned for 23.02 | -| | [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 | +| [Centrality](./algorithms/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) | __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) | Single-GPU | MG planned for 23.02 | -| | [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 | | -| | [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 | | -| 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_ | --- | | +| | [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 23.10 | +| | [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 23.10 | +| 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 | | +| | [Force Atlas 2](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/layout/Force-Atlas2.ipynb) | Single-GPU | | | Linear Assignment | | | | -| | [Hungarian]() | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | +| | [Hungarian]() | Single-GPU | [README](cpp/src/linear_assignment/README-hungarian.md) | | Link Analysis | | | | -| | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | +| | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | | | [Personal Pagerank]() | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | -| | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | __Multi-GPU__ | | -| Link Prediction | | | | -| | [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) | **Multi-GPU** | MG as of 22.12
Directed graph only | +| | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | __Multi-GPU__ | | +| [Link Prediction](./algorithms/Similarity.md) | | | | +| | [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** | MG as of 22.12 | -| | [Sorensen Coefficient](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Sorensen-Similarity.ipynb) | **Multi-GPU** | MG as of 22.12 | +| | [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** | | +| | [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 | Single-GPU | MG planned for 23.02 | +| | Egonet | __Multi-GPU__ | | +| | Node2Vec | Single-GPU | | | | Uniform Neighborhood sampling | __Multi-GPU__ | | | Traversal | | | | -| | Breadth First Search (BFS) | __Multi-GPU__ | with cutoff support``[C++ README](cpp/src/traversal/README.md#BFS) | +| | Breadth First Search (BFS) | __Multi-GPU__ | with cutoff support [C++ README](cpp/src/traversal/README.md#BFS) | | | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](cpp/src/traversal/README.md#SSSP) | | | _ASSP / APSP_ | --- | | | Tree | | | | @@ -83,3 +83,13 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | | 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/Centrality.md b/docs/cugraph/source/graph_support/algorithms/Centrality.md new file mode 100644 index 000000000..e42bbe238 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/Centrality.md @@ -0,0 +1,38 @@ + +# 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](./Centrality.ipynb), [Degree](./Degree.ipynb) |Measure based on counting direct connections for each vertex| +|[Betweenness Centrality](./betweenness_centrality.md)| [Centrality](./Centrality.ipynb), [Betweenness](./Betweenness.ipynb) |Number of shortest paths through the vertex| +|[Eigenvector Centrality](./eigenvector_centrality.md)|[Centrality](./Centrality.ipynb), [Eigenvector](./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](./Centrality.ipynb), [Katz](./Katz.ipynb) |Similar to Eigenvector but has tweaks to measure more weakly connected graph | +|Pagerank|[Centrality](./Centrality.ipynb), [Pagerank](../../link_analysis/Pagerank.ipynb) |Classified as both a link analysis and centrality measure by quantifying incoming links from central vertices. | + +[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/cugraph/source/graph_support/algorithms/Similarity.md b/docs/cugraph/source/graph_support/algorithms/Similarity.md new file mode 100644 index 000000000..450beb373 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/Similarity.md @@ -0,0 +1,38 @@ + +# 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.md)| [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) || +|[Overlap Similarity](./overlap_similarity.md)| [Overlap Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Overlap-Similarity.ipynb) || +|[Sorensen](./sorensen_coefficient.md)|[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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md b/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md new file mode 100644 index 000000000..7dc692684 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md @@ -0,0 +1,42 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/degree_centrality.md b/docs/cugraph/source/graph_support/algorithms/degree_centrality.md new file mode 100644 index 000000000..64fe694e4 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/degree_centrality.md @@ -0,0 +1,32 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md b/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md new file mode 100644 index 000000000..5217dc497 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md @@ -0,0 +1,42 @@ +# 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/cugraph/source/graph_support/algorithms/jaccard_similarity.md b/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md new file mode 100644 index 000000000..c9ffc76d1 --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md @@ -0,0 +1,34 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/katz_centrality.md b/docs/cugraph/source/graph_support/algorithms/katz_centrality.md new file mode 100644 index 000000000..3bfe4d40c --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/katz_centrality.md @@ -0,0 +1,28 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md b/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md new file mode 100644 index 000000000..026d713fb --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md @@ -0,0 +1,32 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md b/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md new file mode 100644 index 000000000..01b6709de --- /dev/null +++ b/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md @@ -0,0 +1,34 @@ +# 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. +___ \ No newline at end of file diff --git a/docs/cugraph/source/images/zachary_graph_centrality.png b/docs/cugraph/source/images/zachary_graph_centrality.png new file mode 100644 index 0000000000000000000000000000000000000000..54a91314d267e1ae70bba02588d15f9614bfcccc GIT binary patch literal 141188 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 - Balanced Cut
- Modularity Modularity | @@ -28,11 +28,11 @@ This repository contains a collection of Jupyter Notebooks that outline how to r | | [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 | | | +| 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 | +| 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 | @@ -60,9 +60,9 @@ Running the example in these notebooks requires: * CUDA 11.4+ * NVIDIA driver 450.51+ -#### Copyright +## Copyright -Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. +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 @@ -70,8 +70,4 @@ 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. - - - - -![RAPIDS](https://github.com/rapidsai/cugraph/blob/main/img/rapids_logo.png) \ No newline at end of file +--- From 4cb904a24ce016bebc92823b8631ce6a5594772e Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Wed, 9 Aug 2023 17:12:39 -0400 Subject: [PATCH 261/384] REL v23.08.00 release From ff240bb142522d69df029cb765d1fa25387eee5c Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 16 Aug 2023 01:03:33 -0500 Subject: [PATCH 262/384] Add new cugraph-nx package (networkx backend using pylibcugraph) (#3614) `cugraph-nx` is working with two algorithm (`betweenness_centrality`, `edge_betweenness_centrality`). It can efficiently (i.e., faster than `cugraph` in my benchmarks) convert from (and to) networkx graphs, and runs (and passes) networkx tests using networkx dispatching machinery. It renumbers vertex labels, which we handle with python dicts. It only depends on `networkx`, `cupy`, and `pylibcugraph`. `cupy` is a transitive dependency from `pylibcugraph`, so we don't actually need to list it as a dependency. I think it's nice the way we depend on `networkx`, which allows us to use its exceptions and utilities. There is still plenty to do (and I have a few questions), but I think it's a good start and gets cugraph in on the NetworkX dispatching party. I was planning on including `cugraph-pg` with this PR, but now I think it's probably better to have that in a new PR. Authors: - Erik Welch (https://github.com/eriknw) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3614 --- docs/cugraph/source/installation/source_build.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md index 9a93ed6c5..453149d6c 100644 --- a/docs/cugraph/source/installation/source_build.md +++ b/docs/cugraph/source/installation/source_build.md @@ -84,6 +84,7 @@ build.sh [ ...] [ ...] libcugraph_etl - build libcugraph_etl.so and SG test binaries pylibcugraph - build the pylibcugraph Python package cugraph - build the cugraph Python package + cugraph-nx - build the cugraph-nx Python package cugraph-service - build the cugraph-service_client and cugraph-service_server Python package cpp-mgtests - build libcugraph and libcugraph_etl MG tests. Builds MPI communicator, adding MPI as a dependency. cugraph-dgl - build the cugraph-dgl extensions for DGL From 47a9c66fe2e26904407b106189604899927ff735 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 6 Sep 2023 13:04:23 -0500 Subject: [PATCH 263/384] Rename `cugraph-nx` to `nx-cugraph` (#3840) We decided to rename `cugraph-nx` to `nx-cugraph` to follow (and help establish) conventions for names of networkx backends. See: https://github.com/networkx/networkx/discussions/6883 This PR was created from the following commands: ```sh mv notebooks/ ../notebooks-bak find * -type f -print0 | xargs -0 sed -i 's/cugraph_nx/nx_cugraph/g' find * -type f -print0 | xargs -0 sed -i 's/cugraph-nx/nx-cugraph/g' git mv ./conda/recipes/cugraph-nx ./conda/recipes/nx-cugraph git mv ./python/cugraph-nx ./python/nx-cugraph git mv ./python/nx-cugraph/cugraph_nx ./python/nx-cugraph/nx_cugraph mv ../notebooks-bak/ notebooks ``` (a more reliable bash script would ensure the destination of `git mv` does not exist yet, b/c if the destination is a directory, it will happily--and incorrectly--move the target _into_ the directory) ```sh # Make sure everything got renamed correctly git grep -i 'cugraph.nx' find . -iname '*cugraph*nx*' -print ``` Should we remove `cugraph-nx` nightlies once this is merged? Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/3840 --- .../source/installation/source_build.md | 2 +- python/nx-cugraph/.flake8 | 13 + python/nx-cugraph/LICENSE | 1 + python/nx-cugraph/Makefile | 7 + python/nx-cugraph/README.md | 32 + python/nx-cugraph/conftest.py | 28 + python/nx-cugraph/lint.yaml | 86 +++ python/nx-cugraph/nx_cugraph/__init__.py | 20 + .../nx_cugraph/algorithms/__init__.py | 14 + .../algorithms/centrality/__init__.py | 13 + .../algorithms/centrality/betweenness.py | 73 +++ .../algorithms/community/__init__.py | 13 + .../algorithms/community/louvain.py | 62 ++ .../nx-cugraph/nx_cugraph/classes/__init__.py | 15 + .../nx-cugraph/nx_cugraph/classes/digraph.py | 61 ++ python/nx-cugraph/nx_cugraph/classes/graph.py | 600 ++++++++++++++++++ python/nx-cugraph/nx_cugraph/convert.py | 528 +++++++++++++++ python/nx-cugraph/nx_cugraph/interface.py | 201 ++++++ .../nx-cugraph/nx_cugraph/tests/__init__.py | 13 + .../nx_cugraph/tests/bench_convert.py | 179 ++++++ .../nx-cugraph/nx_cugraph/tests/conftest.py | 31 + .../nx_cugraph/tests/test_convert.py | 203 ++++++ .../nx_cugraph/tests/test_match_api.py | 106 ++++ python/nx-cugraph/nx_cugraph/typing.py | 25 + .../nx-cugraph/nx_cugraph/utils/__init__.py | 14 + .../nx-cugraph/nx_cugraph/utils/decorators.py | 69 ++ python/nx-cugraph/nx_cugraph/utils/misc.py | 60 ++ python/nx-cugraph/pyproject.toml | 218 +++++++ python/nx-cugraph/run_nx_tests.sh | 36 ++ python/nx-cugraph/setup.py | 15 + 30 files changed, 2737 insertions(+), 1 deletion(-) create mode 100644 python/nx-cugraph/.flake8 create mode 120000 python/nx-cugraph/LICENSE create mode 100644 python/nx-cugraph/Makefile create mode 100644 python/nx-cugraph/README.md create mode 100644 python/nx-cugraph/conftest.py create mode 100644 python/nx-cugraph/lint.yaml create mode 100644 python/nx-cugraph/nx_cugraph/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/community/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py create mode 100644 python/nx-cugraph/nx_cugraph/classes/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/classes/digraph.py create mode 100644 python/nx-cugraph/nx_cugraph/classes/graph.py create mode 100644 python/nx-cugraph/nx_cugraph/convert.py create mode 100644 python/nx-cugraph/nx_cugraph/interface.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/bench_convert.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/conftest.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_convert.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_match_api.py create mode 100644 python/nx-cugraph/nx_cugraph/typing.py create mode 100644 python/nx-cugraph/nx_cugraph/utils/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/utils/decorators.py create mode 100644 python/nx-cugraph/nx_cugraph/utils/misc.py create mode 100644 python/nx-cugraph/pyproject.toml create mode 100755 python/nx-cugraph/run_nx_tests.sh create mode 100644 python/nx-cugraph/setup.py diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md index 453149d6c..7782591f1 100644 --- a/docs/cugraph/source/installation/source_build.md +++ b/docs/cugraph/source/installation/source_build.md @@ -84,7 +84,7 @@ build.sh [ ...] [ ...] libcugraph_etl - build libcugraph_etl.so and SG test binaries pylibcugraph - build the pylibcugraph Python package cugraph - build the cugraph Python package - cugraph-nx - build the cugraph-nx Python package + nx-cugraph - build the nx-cugraph Python package cugraph-service - build the cugraph-service_client and cugraph-service_server Python package cpp-mgtests - build libcugraph and libcugraph_etl MG tests. Builds MPI communicator, adding MPI as a dependency. cugraph-dgl - build the cugraph-dgl extensions for DGL diff --git a/python/nx-cugraph/.flake8 b/python/nx-cugraph/.flake8 new file mode 100644 index 000000000..3a2e3fb86 --- /dev/null +++ b/python/nx-cugraph/.flake8 @@ -0,0 +1,13 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. + +[flake8] +max-line-length = 88 +inline-quotes = " +extend-ignore = + E203, + SIM105, + SIM401, +# E203 whitespace before ':' (to be compatible with black) +per-file-ignores = + nx_cugraph/tests/*.py:T201, + __init__.py:F401,F403, diff --git a/python/nx-cugraph/LICENSE b/python/nx-cugraph/LICENSE new file mode 120000 index 000000000..30cff7403 --- /dev/null +++ b/python/nx-cugraph/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/python/nx-cugraph/Makefile b/python/nx-cugraph/Makefile new file mode 100644 index 000000000..c9caf147d --- /dev/null +++ b/python/nx-cugraph/Makefile @@ -0,0 +1,7 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. +SHELL= /bin/bash + +lint: + git ls-files | xargs pre-commit run --config lint.yaml --files +lint-update: + pre-commit autoupdate --config lint.yaml diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md new file mode 100644 index 000000000..e7cd26218 --- /dev/null +++ b/python/nx-cugraph/README.md @@ -0,0 +1,32 @@ +# nx-cugraph + +## Description +[RAPIDS](https://rapids.ai) nx-cugraph is a [backend to NetworkX](https://networkx.org/documentation/stable/reference/classes/index.html#backends) +with minimal dependencies (`networkx`, `cupy`, and `pylibcugraph`) to run graph algorithms on the GPU. + +### Contribute + +Follow instructions for [contributing to cugraph](https://github.com/rapidsai/cugraph/blob/branch-23.10/readme_pages/CONTRIBUTING.md) +and [building from source](https://docs.rapids.ai/api/cugraph/stable/installation/source_build/), then build nx-cugraph in develop (i.e., editable) mode: +``` +$ ./build.sh nx-cugraph --pydevelop +``` + +### Run tests + +Run nx-cugraph tests from `cugraph/python/nx-cugraph` directory: +``` +$ pytest +``` +Run nx-cugraph benchmarks: +``` +$ pytest --bench +``` +Run networkx tests (requires networkx version 3.2): +``` +$ ./run_nx_tests.sh +``` +Additional arguments may be passed to pytest such as: +``` +$ ./run_nx_tests.sh -x --sw -k betweenness +``` diff --git a/python/nx-cugraph/conftest.py b/python/nx-cugraph/conftest.py new file mode 100644 index 000000000..e329b28d8 --- /dev/null +++ b/python/nx-cugraph/conftest.py @@ -0,0 +1,28 @@ +# 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. + + +def pytest_addoption(parser): + parser.addoption( + "--bench", + action="store_true", + default=False, + help="Run benchmarks (sugar for --benchmark-enable) and skip other tests" + " (to run both benchmarks AND tests, use --all)", + ) + parser.addoption( + "--all", + action="store_true", + default=False, + help="Run benchmarks AND tests (unlike --bench, which only runs benchmarks)", + ) diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml new file mode 100644 index 000000000..dba061bd6 --- /dev/null +++ b/python/nx-cugraph/lint.yaml @@ -0,0 +1,86 @@ +# Copyright (c) 2023, 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.4.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.14 + hooks: + - id: validate-pyproject + name: Validate pyproject.toml + - repo: https://github.com/PyCQA/autoflake + rev: v2.2.0 + hooks: + - id: autoflake + args: [--in-place] + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + - repo: https://github.com/asottile/pyupgrade + rev: v3.10.1 + hooks: + - id: pyupgrade + args: [--py39-plus] + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + # - id: black-jupyter + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.0.286 + hooks: + - id: ruff + args: [--fix-only, --show-fixes] + - repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + additional_dependencies: &flake8_dependencies + # These versions need updated manually + - flake8==6.1.0 + - flake8-bugbear==23.7.10 + - flake8-simplify==0.20.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.2.5 + 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.0.286 + hooks: + - id: ruff + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: no-commit-to-branch + args: [-p, "^branch-2....$"] diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py new file mode 100644 index 000000000..28066fe2b --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -0,0 +1,20 @@ +# 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. +from networkx.exception import * + +from . import algorithms, classes, convert, utils +from .algorithms import * +from .classes import * +from .convert import * + +__version__ = "23.10.00" diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py new file mode 100644 index 000000000..3a585452d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -0,0 +1,14 @@ +# 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. +from . import centrality, community +from .centrality import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py new file mode 100644 index 000000000..2ac6242e8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .betweenness import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py new file mode 100644 index 000000000..b777919f8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py @@ -0,0 +1,73 @@ +# 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. +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import _handle_seed, networkx_algorithm + +__all__ = ["betweenness_centrality", "edge_betweenness_centrality"] + + +@networkx_algorithm +def betweenness_centrality( + G, k=None, normalized=True, weight=None, endpoints=False, seed=None +): + if weight is not None: + raise NotImplementedError( + "Weighted implementation of betweenness centrality not currently supported" + ) + seed = _handle_seed(seed) + G = _to_graph(G, weight) + node_ids, values = plc.betweenness_centrality( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + k=k, + random_state=seed, + normalized=normalized, + include_endpoints=endpoints, + do_expensive_check=False, + ) + return G._nodearrays_to_dict(node_ids, values) + + +@betweenness_centrality._can_run +def _(G, k=None, normalized=True, weight=None, endpoints=False, seed=None): + return weight is None + + +@networkx_algorithm +def edge_betweenness_centrality(G, k=None, normalized=True, weight=None, seed=None): + if weight is not None: + raise NotImplementedError( + "Weighted implementation of betweenness centrality not currently supported" + ) + G = _to_graph(G, weight) + src_ids, dst_ids, values, _edge_ids = plc.edge_betweenness_centrality( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + k=k, + random_state=seed, + normalized=normalized, + do_expensive_check=False, + ) + if not G.is_directed(): + mask = src_ids <= dst_ids + src_ids = src_ids[mask] + dst_ids = dst_ids[mask] + values = 2 * values[mask] + return G._edgearrays_to_dict(src_ids, dst_ids, values) + + +@edge_betweenness_centrality._can_run +def _(G, k=None, normalized=True, weight=None, seed=None): + return weight is None diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/community/__init__.py new file mode 100644 index 000000000..51a4f5c19 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .louvain import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py new file mode 100644 index 000000000..ca5f05c20 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -0,0 +1,62 @@ +# 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. +import sys + +import pylibcugraph as plc + +from nx_cugraph.convert import _to_undirected_graph +from nx_cugraph.utils import ( + _groupby, + _handle_seed, + networkx_algorithm, + not_implemented_for, +) + +__all__ = ["louvain_communities"] + + +@not_implemented_for("directed") +@networkx_algorithm(extra_params="max_level") +def louvain_communities( + G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None +): + """`threshold` and `seed` parameters are currently ignored. + + Extra parameter: `max_level` controls the maximum number of levels of the algorithm. + """ + # NetworkX allows both directed and undirected, but cugraph only allows undirected. + seed = _handle_seed(seed) # Unused, but ensure it's valid for future compatibility + G = _to_undirected_graph(G, weight) + if G.row_indices.size == 0: + # TODO: PLC doesn't handle empty graphs gracefully! + return [{key} for key in G._nodeiter_to_iter(range(len(G)))] + if max_level is None: + max_level = sys.maxsize + vertices, clusters, modularity = plc.louvain( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + max_level=max_level, # TODO: add this parameter to NetworkX + resolution=resolution, + # threshold=threshold, # TODO: add this parameter to PLC + do_expensive_check=False, + ) + groups = _groupby(clusters, vertices) + return [set(G._nodearray_to_list(node_ids)) for node_ids in groups.values()] + + +@louvain_communities._can_run +def _( + G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None +): + # NetworkX allows both directed and undirected, but cugraph only allows undirected. + return not G.is_directed() diff --git a/python/nx-cugraph/nx_cugraph/classes/__init__.py b/python/nx-cugraph/nx_cugraph/classes/__init__.py new file mode 100644 index 000000000..e47641ae8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/__init__.py @@ -0,0 +1,15 @@ +# 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. +from .graph import Graph + +from .digraph import DiGraph # isort:skip diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py new file mode 100644 index 000000000..0aaf88fd7 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -0,0 +1,61 @@ +# 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. +from __future__ import annotations + +from typing import TYPE_CHECKING + +import networkx as nx + +import nx_cugraph as nxcg + +from .graph import Graph + +if TYPE_CHECKING: + from nx_cugraph.typing import NodeKey + +__all__ = ["DiGraph"] + +networkx_api = nxcg.utils.decorators.networkx_class(nx.DiGraph) + + +class DiGraph(Graph): + ################# + # Class methods # + ################# + + @classmethod + @networkx_api + def is_directed(cls) -> bool: + return True + + @classmethod + def to_networkx_class(cls) -> type[nx.DiGraph]: + return nx.DiGraph + + @networkx_api + def number_of_edges( + self, u: NodeKey | None = None, v: NodeKey | None = None + ) -> int: + if u is not None or v is not None: + raise NotImplementedError + return self.row_indices.size + + ########################## + # NetworkX graph methods # + ########################## + + @networkx_api + def reverse(self, copy: bool = True) -> DiGraph: + return self._copy(not copy, self.__class__, reverse=True) + + # Many more methods to implement... diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py new file mode 100644 index 000000000..1432f68c7 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -0,0 +1,600 @@ +# 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. +from __future__ import annotations + +import operator as op +from copy import deepcopy +from typing import TYPE_CHECKING, ClassVar + +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +import nx_cugraph as nxcg + +if TYPE_CHECKING: + from collections.abc import Iterable, Iterator + + from nx_cugraph.typing import ( + AttrKey, + Dtype, + EdgeTuple, + EdgeValue, + IndexValue, + NodeKey, + NodeValue, + ) + +__all__ = ["Graph"] + +networkx_api = nxcg.utils.decorators.networkx_class(nx.Graph) + + +class Graph: + # Tell networkx to dispatch calls with this object to nx-cugraph + __networkx_plugin__: ClassVar[str] = "cugraph" + + # networkx properties + graph: dict + graph_attr_dict_factory: ClassVar[type] = dict + + # Not networkx properties + # We store edge data in COO format with {row,col}_indices and edge_values. + row_indices: cp.ndarray[IndexValue] + col_indices: cp.ndarray[IndexValue] + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] + edge_masks: dict[AttrKey, cp.ndarray[bool]] + node_values: dict[AttrKey, cp.ndarray[NodeValue]] + node_masks: dict[AttrKey, cp.ndarray[bool]] + key_to_id: dict[NodeKey, IndexValue] | None + _id_to_key: dict[IndexValue, NodeKey] | None + _N: int + + #################### + # Creation methods # + #################### + + @classmethod + def from_coo( + cls, + N: int, + row_indices: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: dict[IndexValue, NodeKey] | None = None, + **attr, + ) -> Graph: + new_graph = object.__new__(cls) + new_graph.row_indices = row_indices + new_graph.col_indices = col_indices + new_graph.edge_values = {} if edge_values is None else dict(edge_values) + new_graph.edge_masks = {} if edge_masks is None else dict(edge_masks) + new_graph.node_values = {} if node_values is None else dict(node_values) + new_graph.node_masks = {} if node_masks is None else dict(node_masks) + new_graph.key_to_id = None if key_to_id is None else dict(key_to_id) + new_graph._id_to_key = None if id_to_key is None else dict(id_to_key) + new_graph._N = op.index(N) # Ensure N is integral + new_graph.graph = new_graph.graph_attr_dict_factory() + new_graph.graph.update(attr) + size = new_graph.row_indices.size + # Easy and fast sanity checks + if size != new_graph.col_indices.size: + raise ValueError + for attr in ["edge_values", "edge_masks"]: + if datadict := getattr(new_graph, attr): + for key, val in datadict.items(): + if val.shape[0] != size: + raise ValueError(key) + for attr in ["node_values", "node_masks"]: + if datadict := getattr(new_graph, attr): + for key, val in datadict.items(): + if val.shape[0] != N: + raise ValueError(key) + if new_graph.key_to_id is not None and len(new_graph.key_to_id) != N: + raise ValueError + if new_graph._id_to_key is not None and len(new_graph._id_to_key) != N: + raise ValueError + return new_graph + + @classmethod + def from_csr( + cls, + indptr: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: dict[IndexValue, NodeKey] | None = None, + **attr, + ) -> Graph: + N = indptr.size - 1 + row_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + **attr, + ) + + @classmethod + def from_csc( + cls, + indptr: cp.ndarray[IndexValue], + row_indices: cp.ndarray[IndexValue], + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: dict[IndexValue, NodeKey] | None = None, + **attr, + ) -> Graph: + N = indptr.size - 1 + col_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + **attr, + ) + + @classmethod + def from_dcsr( + cls, + N: int, + compressed_rows: cp.ndarray[IndexValue], + indptr: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: dict[IndexValue, NodeKey] | None = None, + **attr, + ) -> Graph: + row_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(compressed_rows.get(), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + **attr, + ) + + @classmethod + def from_dcsc( + cls, + N: int, + compressed_cols: cp.ndarray[IndexValue], + indptr: cp.ndarray[IndexValue], + row_indices: cp.ndarray[IndexValue], + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: dict[IndexValue, NodeKey] | None = None, + **attr, + ) -> Graph: + col_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(compressed_cols.get(), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + **attr, + ) + + def __new__(cls, incoming_graph_data=None, **attr) -> Graph: + if incoming_graph_data is None: + new_graph = cls.from_coo(0, cp.empty(0, np.int32), cp.empty(0, np.int32)) + elif incoming_graph_data.__class__ is new_graph.__class__: + new_graph = incoming_graph_data.copy() + elif incoming_graph_data.__class__ is new_graph.to_networkx_class(): + new_graph = nxcg.from_networkx(incoming_graph_data, preserve_all_attrs=True) + else: + raise NotImplementedError + new_graph.graph.update(attr) + return new_graph + + ################# + # Class methods # + ################# + + @classmethod + @networkx_api + def is_directed(cls) -> bool: + return False + + @classmethod + @networkx_api + def is_multigraph(cls) -> bool: + return False + + @classmethod + @networkx_api + def to_directed_class(cls) -> type[nxcg.DiGraph]: + return nxcg.DiGraph + + @classmethod + def to_networkx_class(cls) -> type[nx.Graph]: + return nx.Graph + + @classmethod + @networkx_api + def to_undirected_class(cls) -> type[Graph]: + return Graph + + ############## + # Properties # + ############## + + @property + def edge_dtypes(self) -> dict[AttrKey, Dtype]: + return {key: val.dtype for key, val in self.edge_values.items()} + + @property + def node_dtypes(self) -> dict[AttrKey, Dtype]: + return {key: val.dtype for key, val in self.node_values.items()} + + @property + def id_to_key(self) -> dict[IndexValue, NodeKey] | None: + if self.key_to_id is None: + return None + if self._id_to_key is None: + self._id_to_key = {val: key for key, val in self.key_to_id.items()} + return self._id_to_key + + name = nx.Graph.name + + ################## + # Dunder methods # + ################## + + @networkx_api + def __contains__(self, n: NodeKey) -> bool: + if self.key_to_id is not None: + container = self.key_to_id + else: + container = range(self._N) + try: + return n in container + except TypeError: + return False + + @networkx_api + def __iter__(self) -> Iterator[NodeKey]: + if self.key_to_id is not None: + return iter(self.key_to_id) + return iter(range(self._N)) + + @networkx_api + def __len__(self) -> int: + return self._N + + __str__ = nx.Graph.__str__ + + ########################## + # NetworkX graph methods # + ########################## + + @networkx_api + def clear(self) -> None: + self.edge_values.clear() + self.edge_masks.clear() + self.node_values.clear() + self.node_masks.clear() + self.graph.clear() + self.row_indices = cp.empty(0, self.row_indices.dtype) + self.col_indices = cp.empty(0, self.col_indices.dtype) + self._N = 0 + self.key_to_id = None + self._id_to_key = None + + @networkx_api + def clear_edges(self) -> None: + self.edge_values.clear() + self.edge_masks.clear() + self.row_indices = cp.empty(0, self.row_indices.dtype) + self.col_indices = cp.empty(0, self.col_indices.dtype) + + @networkx_api + def copy(self, as_view: bool = False) -> Graph: + # Does shallow copy in networkx + return self._copy(as_view, self.__class__) + + @networkx_api + def get_edge_data( + self, u: NodeKey, v: NodeKey, default: EdgeValue | None = None + ) -> dict[AttrKey, EdgeValue]: + if self.key_to_id is not None: + try: + u = self.key_to_id[u] + v = self.key_to_id[v] + except KeyError: + return default + index = cp.nonzero((self.row_indices == u) & (self.col_indices == v))[0] + if index.size == 0: + return default + [index] = index.tolist() + if not self.edge_values: + return {} + return { + key: val[index].tolist() + for key, val in self.edge_values.items() + if key not in self.edge_masks or self.edge_masks[key][index] + } + + @networkx_api + def has_edge(self, u: NodeKey, v: NodeKey) -> bool: + if self.key_to_id is not None: + try: + u = self.key_to_id[u] + v = self.key_to_id[v] + except KeyError: + return False + return bool(((self.row_indices == u) & (self.col_indices == v)).any()) + + @networkx_api + def has_node(self, n: NodeKey) -> bool: + return n in self + + @networkx_api + def nbunch_iter(self, nbunch=None) -> Iterator[NodeKey]: + if nbunch is None: + return iter(self) + if nbunch in self: + return iter([nbunch]) + return (node for node in nbunch if node in self) + + @networkx_api + def number_of_edges( + self, u: NodeKey | None = None, v: NodeKey | None = None + ) -> int: + if u is not None or v is not None: + raise NotImplementedError + return self.size() + + @networkx_api + def number_of_nodes(self) -> int: + return self._N + + @networkx_api + def order(self) -> int: + return self._N + + @networkx_api + def size(self, weight: AttrKey | None = None) -> int: + if weight is not None: + raise NotImplementedError + # If no self-edges, then `self.row_indices.size // 2` + return int((self.row_indices <= self.col_indices).sum()) + + @networkx_api + def to_directed(self, as_view: bool = False) -> nxcg.DiGraph: + return self._copy(as_view, self.to_directed_class()) + + @networkx_api + def to_undirected(self, as_view: bool = False) -> Graph: + # Does deep copy in networkx + return self.copy(as_view) + + # Not implemented... + # adj, adjacency, add_edge, add_edges_from, add_node, + # add_nodes_from, add_weighted_edges_from, degree, + # edge_subgraph, edges, neighbors, nodes, remove_edge, + # remove_edges_from, remove_node, remove_nodes_from, subgraph, update + + ################### + # Private methods # + ################### + + def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): + indptr = self.indptr + row_indices = self.row_indices + col_indices = self.col_indices + edge_values = self.edge_values + edge_masks = self.edge_masks + node_values = self.node_values + node_masks = self.node_masks + key_to_id = self.key_to_id + id_to_key = None if key_to_id is None else self._id_to_key + if not as_view: + indptr = indptr.copy() + row_indices = row_indices.copy() + col_indices = col_indices.copy() + edge_values = {key: val.copy() for key, val in edge_values.items()} + edge_masks = {key: val.copy() for key, val in edge_masks.items()} + node_values = {key: val.copy() for key, val in node_values.items()} + node_masks = {key: val.copy() for key, val in node_masks.items()} + if key_to_id is not None: + key_to_id = key_to_id.copy() + if id_to_key is not None: + id_to_key = id_to_key.copy() + if reverse: + row_indices, col_indices = col_indices, row_indices + rv = cls.from_coo( + indptr, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + ) + if as_view: + rv.graph = self.graph + else: + rv.graph.update(deepcopy(self.graph)) + return rv + + def _get_plc_graph( + self, + edge_attr: AttrKey | None = None, + edge_default: EdgeValue | None = None, + edge_dtype: Dtype | None = None, + *, + store_transposed: bool = False, + ): + if edge_attr is None: + edge_array = None + elif edge_attr not in self.edge_values: + raise KeyError("Graph has no edge attribute {edge_attr!r}") + elif edge_attr not in self.edge_masks: + edge_array = self.edge_values[edge_attr] + elif not self.edge_masks[edge_attr].all(): + if edge_default is None: + raise NotImplementedError( + "Missing edge attributes is not yet implemented" + ) + edge_array = cp.where( + self.edge_masks[edge_attr], self.edge_values[edge_attr], edge_default + ) + else: + # Mask is all True; don't need anymore + del self.edge_masks[edge_attr] + edge_array = self.edge_values[edge_attr] + # Should we cache PLC graph? + if edge_dtype is not None: + edge_dtype = np.dtype(edge_dtype) + if edge_array.dtype != edge_dtype: + edge_array = edge_array.astype(edge_dtype) + return plc.SGGraph( + resource_handle=plc.ResourceHandle(), + graph_properties=plc.GraphProperties( + is_multigraph=self.is_multigraph(), + is_symmetric=not self.is_directed(), + ), + src_or_offset_array=self.row_indices, + dst_or_index_array=self.col_indices, + weight_array=edge_array, + store_transposed=store_transposed, + renumber=False, + do_expensive_check=False, + ) + + def _nodeiter_to_iter(self, node_ids: Iterable[IndexValue]) -> Iterable[NodeKey]: + """Convert an iterable of node IDs to an iterable of node keys.""" + if (id_to_key := self.id_to_key) is not None: + return map(id_to_key.__getitem__, node_ids) + return node_ids + + def _nodearray_to_list(self, node_ids: cp.ndarray[IndexValue]) -> list[NodeKey]: + if self.key_to_id is None: + return node_ids.tolist() + return list(self._nodeiter_to_iter(node_ids.tolist())) + + def _nodearrays_to_dict( + self, node_ids: cp.ndarray[IndexValue], values: cp.ndarray[NodeValue] + ) -> dict[NodeKey, NodeValue]: + it = zip(node_ids.tolist(), values.tolist()) + if (id_to_key := self.id_to_key) is not None: + return {id_to_key[key]: val for key, val in it} + return dict(it) + + def _edgearrays_to_dict( + self, + src_ids: cp.ndarray[IndexValue], + dst_ids: cp.ndarray[IndexValue], + values: cp.ndarray[EdgeValue], + ) -> dict[EdgeTuple, EdgeValue]: + it = zip(zip(src_ids.tolist(), dst_ids.tolist()), values.tolist()) + if (id_to_key := self.id_to_key) is not None: + return { + (id_to_key[src_id], id_to_key[dst_id]): val + for (src_id, dst_id), val in it + } + return dict(it) + + def _dict_to_nodearrays( + self, + d: dict[NodeKey, NodeValue], + dtype: Dtype | None = None, + ) -> tuple[cp.ndarray[IndexValue], cp.ndarray[NodeValue]]: + if self.key_to_id is None: + indices_iter = d + else: + indices_iter = map(self.key_to_id.__getitem__, d) + node_ids = cp.fromiter(indices_iter, np.int32) + if dtype is None: + values = cp.array(list(d.values())) + else: + values = cp.fromiter(d.values(), dtype) + return node_ids, values + + # def _dict_to_nodearray( + # self, + # d: dict[NodeKey, NodeValue] | cp.ndarray[NodeValue], + # default: NodeValue | None = None, + # dtype: Dtype | None = None, + # ) -> cp.ndarray[NodeValue]: + # if isinstance(d, cp.ndarray): + # if d.shape[0] != len(self): + # raise ValueError + # return d + # if default is None: + # val_iter = map(d.__getitem__, self) + # else: + # val_iter = (d.get(node, default) for node in self) + # if dtype is None: + # return cp.array(list(val_iter)) + # return cp.fromiter(val_iter, dtype) diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py new file mode 100644 index 000000000..9be8cac78 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -0,0 +1,528 @@ +# 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. +from __future__ import annotations + +import itertools +import operator as op +from collections import Counter +from collections.abc import Mapping +from typing import TYPE_CHECKING + +import cupy as cp +import networkx as nx +import numpy as np + +import nx_cugraph as nxcg + +if TYPE_CHECKING: + from nx_cugraph.typing import AttrKey, Dtype, EdgeValue, NodeValue + +__all__ = [ + "from_networkx", + "to_networkx", +] + +concat = itertools.chain.from_iterable +# A "required" attribute is one that all edges or nodes must have or KeyError is raised +REQUIRED = ... + + +def from_networkx( + graph: nx.Graph, + edge_attrs: AttrKey | dict[AttrKey, EdgeValue | None] | None = None, + edge_dtypes: Dtype | dict[AttrKey, Dtype | None] | None = None, + *, + node_attrs: AttrKey | dict[AttrKey, NodeValue | None] | None = None, + node_dtypes: Dtype | dict[AttrKey, Dtype | None] | None = None, + preserve_all_attrs: bool = False, + preserve_edge_attrs: bool = False, + preserve_node_attrs: bool = False, + preserve_graph_attrs: bool = False, + as_directed: bool = False, + name: str | None = None, + graph_name: str | None = None, +) -> nxcg.Graph: + """Convert a networkx graph to nx_cugraph graph; can convert all attributes. + + Parameters + ---------- + G : networkx.Graph + edge_attrs : str or dict, optional + Dict that maps edge attributes to default values if missing in ``G``. + If None, then no edge attributes will be converted. + If default value is None, then missing values are handled with a mask. + A default value of ``nxcg.convert.REQUIRED`` or ``...`` indicates that + all edges have data for this attribute, and raise `KeyError` if not. + For convenience, `edge_attrs` may be a single attribute with default 1; + for example ``edge_attrs="weight"``. + edge_dtypes : dtype or dict, optional + node_attrs : str or dict, optional + Dict that maps node attributes to default values if missing in ``G``. + If None, then no node attributes will be converted. + If default value is None, then missing values are handled with a mask. + A default value of ``nxcg.convert.REQUIRED`` or ``...`` indicates that + all edges have data for this attribute, and raise `KeyError` if not. + For convenience, `node_attrs` may be a single attribute with no default; + for example ``node_attrs="weight"``. + node_dtypes : dtype or dict, optional + preserve_all_attrs : bool, default False + If True, then equivalent to setting preserve_edge_attrs, preserve_node_attrs, + and preserve_graph_attrs to True. + preserve_edge_attrs : bool, default False + Whether to preserve all edge attributes. + preserve_node_attrs : bool, default False + Whether to preserve all node attributes. + preserve_graph_attrs : bool, default False + Whether to preserve all graph attributes. + as_directed : bool, default False + If True, then the returned graph will be directed regardless of input. + If False, then the returned graph type is determined by input graph. + name : str, optional + The name of the algorithm when dispatched from networkx. + graph_name : str, optional + The name of the graph argument geing converted when dispatched from networkx. + + Returns + ------- + nx_cugraph.Graph + + Notes + ----- + For optimal performance, be as specific as possible about what is being converted: + + 1. Do you need edge values? Creating a graph with just the structure is the fastest. + 2. Do you know the edge attribute(s) you need? Specify with `edge_attrs`. + 3. Do you know the default values? Specify with ``edge_attrs={weight: default}``. + 4. Do you know if all edges have values? Specify with ``edge_attrs={weight: ...}``. + 5. Do you know the dtype of attributes? Specify with `edge_dtypes`. + + Conversely, using ``preserve_edge_attrs=True`` or ``preserve_all_attrs=True`` are + the slowest, but are also the most flexible and generic. + + See Also + -------- + to_networkx : The opposite; convert nx_cugraph graph to networkx graph + """ + # This uses `graph._adj` and `graph._node`, which are private attributes in NetworkX + if not isinstance(graph, nx.Graph): + if isinstance(graph, nx.classes.reportviews.NodeView): + # Convert to a Graph with only nodes (no edges) + G = nx.Graph() + G.add_nodes_from(graph.items()) + graph = G + else: + raise TypeError(f"Expected networkx.Graph; got {type(graph)}") + elif graph.is_multigraph(): + raise NotImplementedError("MultiGraph support is not yet implemented") + + if preserve_all_attrs: + preserve_edge_attrs = True + preserve_node_attrs = True + preserve_graph_attrs = True + + if edge_attrs is not None: + if isinstance(edge_attrs, Mapping): + # Copy so we don't mutate the original + edge_attrs = dict(edge_attrs) + else: + edge_attrs = {edge_attrs: 1} + + if node_attrs is not None: + if isinstance(node_attrs, Mapping): + # Copy so we don't mutate the original + node_attrs = dict(node_attrs) + else: + node_attrs = {node_attrs: None} + + if graph.__class__ in {nx.Graph, nx.DiGraph}: + # This is a NetworkX private attribute, but is much faster to use + adj = graph._adj + else: + adj = graph.adj + if isinstance(adj, nx.classes.coreviews.FilterAdjacency): + adj = {k: dict(v) for k, v in adj.items()} + + N = len(adj) + if ( + not preserve_edge_attrs + and not edge_attrs + # Faster than graph.number_of_edges() == 0 + or next(concat(rowdata.values() for rowdata in adj.values()), None) is None + ): + # Either we weren't asked to preserve edge attributes, or there are no edges + edge_attrs = None + elif preserve_edge_attrs: + # Using comprehensions should be just as fast starting in Python 3.11 + attr_sets = set(map(frozenset, concat(map(dict.values, adj.values())))) + attrs = frozenset.union(*attr_sets) + edge_attrs = dict.fromkeys(attrs, REQUIRED) + if len(attr_sets) > 1: + # Determine which edges have missing data + for attr, count in Counter(concat(attr_sets)).items(): + if count != len(attr_sets): + edge_attrs[attr] = None + elif None in edge_attrs.values(): + # Required edge attributes have a default of None in `edge_attrs` + # Verify all edge attributes are present! + required = frozenset( + attr for attr, default in edge_attrs.items() if default is None + ) + if len(required) == 1: + # Fast path for the common case of a single attribute with no default + [attr] = required + it = ( + attr in edgedata + for rowdata in adj.values() + for edgedata in rowdata.values() + ) + if next(it): + if all(it): + # All edges have data + edge_attrs[attr] = REQUIRED + # Else some edges have attribute (default already None) + elif not any(it): + # No edges have attribute + del edge_attrs[attr] + # Else some edges have attribute (default already None) + else: + attr_sets = set( + map(required.intersection, concat(map(dict.values, adj.values()))) + ) + for attr in required - frozenset.union(*attr_sets): + # No edges have these attributes + del edge_attrs[attr] + for attr in frozenset.intersection(*attr_sets): + # All edges have these attributes + edge_attrs[attr] = REQUIRED + + if N == 0: + node_attrs = None + elif preserve_node_attrs: + attr_sets = set(map(frozenset, graph._node.values())) + attrs = frozenset.union(*attr_sets) + node_attrs = dict.fromkeys(attrs, REQUIRED) + if len(attr_sets) > 1: + # Determine which nodes have missing data + for attr, count in Counter(concat(attr_sets)).items(): + if count != len(attr_sets): + node_attrs[attr] = None + elif node_attrs and None in node_attrs.values(): + # Required node attributes have a default of None in `node_attrs` + # Verify all node attributes are present! + required = frozenset( + attr for attr, default in node_attrs.items() if default is None + ) + if len(required) == 1: + # Fast path for the common case of a single attribute with no default + [attr] = required + it = (attr in nodedata for nodedata in graph._node.values()) + if next(it): + if all(it): + # All nodes have data + node_attrs[attr] = REQUIRED + # Else some nodes have attribute (default already None) + elif not any(it): + # No nodes have attribute + del node_attrs[attr] + # Else some nodes have attribute (default already None) + else: + attr_sets = set(map(required.intersection, graph._node.values())) + for attr in required - frozenset.union(*attr_sets): + # No nodes have these attributes + del node_attrs[attr] + for attr in frozenset.intersection(*attr_sets): + # All nodes have these attributes + node_attrs[attr] = REQUIRED + + key_to_id = dict(zip(adj, range(N))) + col_iter = concat(adj.values()) + try: + no_renumber = all(k == v for k, v in key_to_id.items()) + except Exception: + no_renumber = False + if no_renumber: + key_to_id = None + else: + col_iter = map(key_to_id.__getitem__, col_iter) + col_indices = cp.fromiter(col_iter, np.int32) + + edge_values = {} + edge_masks = {} + if edge_attrs: + if edge_dtypes is None: + edge_dtypes = {} + elif not isinstance(edge_dtypes, Mapping): + edge_dtypes = dict.fromkeys(edge_attrs, edge_dtypes) + for edge_attr, edge_default in edge_attrs.items(): + dtype = edge_dtypes.get(edge_attr) + if edge_default is None: + vals = [] + append = vals.append + iter_mask = ( + append( + edgedata[edge_attr] + if (present := edge_attr in edgedata) + else False + ) + or present + for rowdata in adj.values() + for edgedata in rowdata.values() + ) + edge_masks[edge_attr] = cp.fromiter(iter_mask, bool) + edge_values[edge_attr] = cp.array(vals, dtype) + # if vals.ndim > 1: ... + else: + if edge_default is REQUIRED: + # Using comprehensions should be fast starting in Python 3.11 + # iter_values = ( + # edgedata[edge_attr] + # for rowdata in adj.values() + # for edgedata in rowdata.values() + # ) + iter_values = map( + op.itemgetter(edge_attr), concat(map(dict.values, adj.values())) + ) + else: + iter_values = ( + edgedata.get(edge_attr, edge_default) + for rowdata in adj.values() + for edgedata in rowdata.values() + ) + if dtype is None: + edge_values[edge_attr] = cp.array(list(iter_values)) + else: + edge_values[edge_attr] = cp.fromiter(iter_values, dtype) + # if vals.ndim > 1: ... + + row_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat( + np.arange(N, dtype=np.int32), + np.fromiter(map(len, adj.values()), np.int32), + ) + ) + + node_values = {} + node_masks = {} + if node_attrs: + nodes = graph._node + if node_dtypes is None: + node_dtypes = {} + elif not isinstance(node_dtypes, Mapping): + node_dtypes = dict.fromkeys(node_attrs, node_dtypes) + for node_attr, node_default in node_attrs.items(): + # Iterate over `adj` to ensure consistent order + dtype = node_dtypes.get(node_attr) + if node_default is None: + vals = [] + append = vals.append + iter_mask = ( + append( + nodedata[node_attr] + if (present := node_attr in (nodedata := nodes[node_id])) + else False + ) + or present + for node_id in adj + ) + node_masks[node_attr] = cp.fromiter(iter_mask, bool) + node_values[node_attr] = cp.array(vals, dtype) + # if vals.ndim > 1: ... + else: + if node_default is REQUIRED: + iter_values = (nodes[node_id][node_attr] for node_id in adj) + else: + iter_values = ( + nodes[node_id].get(node_attr, node_default) for node_id in adj + ) + if dtype is None: + node_values[node_attr] = cp.array(list(iter_values)) + else: + node_values[node_attr] = cp.fromiter(iter_values, dtype) + # if vals.ndim > 1: ... + + if graph.is_directed() or as_directed: + klass = nxcg.DiGraph + else: + klass = nxcg.Graph + rv = klass.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + ) + if preserve_graph_attrs: + rv.graph.update(graph.graph) # deepcopy? + return rv + + +def _iter_attr_dicts( + values: dict[AttrKey, cp.ndarray[EdgeValue | NodeValue]], + masks: dict[AttrKey, cp.ndarray[bool]], +): + full_attrs = list(values.keys() - masks.keys()) + if full_attrs: + full_dicts = ( + dict(zip(full_attrs, vals)) + for vals in zip(*(values[attr].tolist() for attr in full_attrs)) + ) + partial_attrs = list(values.keys() & masks.keys()) + if partial_attrs: + partial_dicts = ( + {k: v for k, (v, m) in zip(partial_attrs, vals_masks) if m} + for vals_masks in zip( + *( + zip(values[attr].tolist(), masks[attr].tolist()) + for attr in partial_attrs + ) + ) + ) + if full_attrs and partial_attrs: + full_dicts = (d1.update(d2) or d1 for d1, d2 in zip(full_dicts, partial_dicts)) + elif partial_attrs: + full_dicts = partial_dicts + return full_dicts + + +def to_networkx(G: nxcg.Graph) -> nx.Graph: + """Convert a nx_cugraph graph to networkx graph. + + All edge and node attributes and ``G.graph`` properties are converted. + + Parameters + ---------- + G : nx_cugraph.Graph + + Returns + ------- + networkx.Graph + + See Also + -------- + from_networkx : The opposite; convert networkx graph to nx_cugraph graph + """ + rv = G.to_networkx_class()() + id_to_key = G.id_to_key + + node_values = G.node_values + node_masks = G.node_masks + if node_values: + node_iter = range(len(G)) + if id_to_key is not None: + node_iter = map(id_to_key.__getitem__, node_iter) + full_node_dicts = _iter_attr_dicts(node_values, node_masks) + rv.add_nodes_from(zip(node_iter, full_node_dicts)) + elif id_to_key is not None: + rv.add_nodes_from(id_to_key.values()) + else: + rv.add_nodes_from(range(len(G))) + + row_indices = G.row_indices + col_indices = G.col_indices + edge_values = G.edge_values + edge_masks = G.edge_masks + if edge_values and not G.is_directed(): + # Only add upper triangle of the adjacency matrix so we don't double-add edges + mask = row_indices <= col_indices + row_indices = row_indices[mask] + col_indices = col_indices[mask] + edge_values = {k: v[mask] for k, v in edge_values.items()} + if edge_masks: + edge_masks = {k: v[mask] for k, v in edge_masks.items()} + row_indices = row_iter = row_indices.tolist() + col_indices = col_iter = col_indices.tolist() + if id_to_key is not None: + row_iter = map(id_to_key.__getitem__, row_indices) + col_iter = map(id_to_key.__getitem__, col_indices) + if edge_values: + full_edge_dicts = _iter_attr_dicts(edge_values, edge_masks) + rv.add_edges_from(zip(row_iter, col_iter, full_edge_dicts)) + else: + rv.add_edges_from(zip(row_iter, col_iter)) + + rv.graph.update(G.graph) + return rv + + +def _to_graph( + G, + edge_attr: AttrKey | None = None, + edge_default: EdgeValue | None = 1, + edge_dtype: Dtype | None = None, +) -> nxcg.Graph | nxcg.DiGraph: + """Ensure that input type is a nx_cugraph graph, and convert if necessary. + + Directed and undirected graphs are both allowed. + This is an internal utility function and may change or be removed. + """ + if isinstance(G, nxcg.Graph): + return G + if isinstance(G, nx.Graph): + return from_networkx( + G, {edge_attr: edge_default} if edge_attr is not None else None, edge_dtype + ) + # TODO: handle cugraph.Graph + raise TypeError + + +def _to_directed_graph( + G, + edge_attr: AttrKey | None = None, + edge_default: EdgeValue | None = 1, + edge_dtype: Dtype | None = None, +) -> nxcg.DiGraph: + """Ensure that input type is a nx_cugraph DiGraph, and convert if necessary. + + Undirected graphs will be converted to directed. + This is an internal utility function and may change or be removed. + """ + if isinstance(G, nxcg.DiGraph): + return G + if isinstance(G, nxcg.Graph): + return G.to_directed() + if isinstance(G, nx.Graph): + return from_networkx( + G, + {edge_attr: edge_default} if edge_attr is not None else None, + edge_dtype, + as_directed=True, + ) + # TODO: handle cugraph.Graph + raise TypeError + + +def _to_undirected_graph( + G, + edge_attr: AttrKey | None = None, + edge_default: EdgeValue | None = 1, + edge_dtype: Dtype | None = None, +) -> nxcg.Graph: + """Ensure that input type is a nx_cugraph Graph, and convert if necessary. + + Only undirected graphs are allowed. Directed graphs will raise ValueError. + This is an internal utility function and may change or be removed. + """ + if isinstance(G, nxcg.Graph): + if G.is_directed(): + raise ValueError("Only undirected graphs supported; got a directed graph") + return G + if isinstance(G, nx.Graph): + return from_networkx( + G, {edge_attr: edge_default} if edge_attr is not None else None, edge_dtype + ) + # TODO: handle cugraph.Graph + raise TypeError diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py new file mode 100644 index 000000000..cc750cd2d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -0,0 +1,201 @@ +# 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. +from __future__ import annotations + +import networkx as nx + +import nx_cugraph as nxcg + + +class BackendInterface: + # Required conversions + @staticmethod + def convert_from_nx(graph, *args, edge_attrs=None, weight=None, **kwargs): + if weight is not None: + # MAINT: networkx 3.0, 3.1 + # For networkx 3.0 and 3.1 compatibility + if edge_attrs is not None: + raise TypeError( + "edge_attrs and weight arguments should not both be given" + ) + edge_attrs = {weight: 1} + return nxcg.from_networkx(graph, *args, edge_attrs=edge_attrs, **kwargs) + + @staticmethod + def convert_to_nx(obj, *, name: str | None = None): + if isinstance(obj, nxcg.Graph): + return nxcg.to_networkx(obj) + return obj + + @staticmethod + def on_start_tests(items): + """Modify pytest items after tests have been collected. + + This is called during ``pytest_collection_modifyitems`` phase of pytest. + We use this to set `xfail` on tests we expect to fail. See: + + https://docs.pytest.org/en/stable/reference/reference.html#std-hook-pytest_collection_modifyitems + """ + try: + import pytest + except ModuleNotFoundError: + return + + def key(testpath): + filename, path = testpath.split(":") + *names, testname = path.split(".") + if names: + [classname] = names + return (testname, frozenset({classname, filename})) + return (testname, frozenset({filename})) + + # Reasons for xfailing + no_weights = "weighted implementation not currently supported" + no_multigraph = "multigraphs not currently supported" + louvain_different = ( + "Louvain may be different due to RNG or unsupported threshold parameter" + ) + + xfail = {} + + from packaging.version import parse + + nxver = parse(nx.__version__) + if nxver.major == 3 and nxver.minor in {0, 1}: + # MAINT: networkx 3.0, 3.1 + # NetworkX 3.2 added the ability to "fallback to nx" if backend algorithms + # raise NotImplementedError or `can_run` returns False. The tests below + # exercise behavior we have not implemented yet, so we mark them as xfail + # for previous versions of NetworkX. + xfail.update( + { + key( + "test_agraph.py:TestAGraph.test_no_warnings_raised" + ): "pytest.warn(None) deprecated", + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_K5" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_P3_normalized" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_P3" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_krackhardt_kite_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality." + "test_krackhardt_kite_graph_normalized" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality." + "test_florentine_families_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_les_miserables_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_ladder_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_G" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_G2" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_G3" + ): no_multigraph, + key( + "test_betweenness_centrality.py:" + "TestWeightedBetweennessCentrality.test_G4" + ): no_multigraph, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_K5" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_C4" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_P4" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_balanced_tree" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_weighted_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality." + "test_normalized_weighted_graph" + ): no_weights, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality.test_weighted_multigraph" + ): no_multigraph, + key( + "test_betweenness_centrality.py:" + "TestWeightedEdgeBetweennessCentrality." + "test_normalized_weighted_multigraph" + ): no_multigraph, + } + ) + else: + xfail.update( + { + key( + "test_louvain.py:test_karate_club_partition" + ): louvain_different, + key("test_louvain.py:test_none_weight_param"): louvain_different, + key("test_louvain.py:test_multigraph"): louvain_different, + key("test_louvain.py:test_threshold"): louvain_different, + } + ) + + for item in items: + kset = set(item.keywords) + for (test_name, keywords), reason in xfail.items(): + if item.name == test_name and keywords.issubset(kset): + item.add_marker(pytest.mark.xfail(reason=reason)) + + @classmethod + def can_run(cls, name, args, kwargs): + """Can this backend run the specified algorithms with the given arguments? + + This is a proposed API to add to networkx dispatching machinery and may change. + """ + return ( + hasattr(cls, name) + and getattr(cls, name).can_run(*args, **kwargs) + # We don't support MultiGraphs yet + and not any(isinstance(x, nx.MultiGraph) for x in args) + and not any(isinstance(x, nx.MultiGraph) for x in kwargs.values()) + ) diff --git a/python/nx-cugraph/nx_cugraph/tests/__init__.py b/python/nx-cugraph/nx_cugraph/tests/__init__.py new file mode 100644 index 000000000..ce94db52f --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/__init__.py @@ -0,0 +1,13 @@ +# 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/python/nx-cugraph/nx_cugraph/tests/bench_convert.py b/python/nx-cugraph/nx_cugraph/tests/bench_convert.py new file mode 100644 index 000000000..7e6278661 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/bench_convert.py @@ -0,0 +1,179 @@ +# 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. +import random + +import networkx as nx +import numpy as np +import pytest + +import nx_cugraph as nxcg + +try: + import cugraph +except ModuleNotFoundError: + cugraph = None +try: + import scipy +except ModuleNotFoundError: + scipy = None + +# If the rapids-pytest-benchmark plugin is installed, the "gpubenchmark" +# fixture will be available automatically. Check that this fixture is available +# by trying to import rapids_pytest_benchmark, and if that fails, set +# "gpubenchmark" to the standard "benchmark" fixture provided by +# pytest-benchmark. +try: + import rapids_pytest_benchmark # noqa: F401 +except ModuleNotFoundError: + import pytest_benchmark + + gpubenchmark = pytest_benchmark.plugin.benchmark + + +def _bench_helper(gpubenchmark, N, attr_kind, create_using, method): + G = method(N, create_using=create_using) + if attr_kind: + skip = True + for *_ids, edgedict in G.edges(data=True): + skip = not skip + if skip and attr_kind not in {"full", "required", "required_dtype"}: + continue + edgedict["x"] = random.randint(0, 100000) + if attr_kind == "preserve": + gpubenchmark(nxcg.from_networkx, G, preserve_edge_attrs=True) + elif attr_kind == "half_missing": + gpubenchmark(nxcg.from_networkx, G, edge_attrs={"x": None}) + elif attr_kind == "required": + gpubenchmark(nxcg.from_networkx, G, edge_attrs={"x": ...}) + elif attr_kind == "required_dtype": + gpubenchmark( + nxcg.from_networkx, + G, + edge_attrs={"x": ...}, + edge_dtypes={"x": np.int32}, + ) + else: # full, half_default + gpubenchmark(nxcg.from_networkx, G, edge_attrs={"x": 0}) + else: + gpubenchmark(nxcg.from_networkx, G) + + +def _bench_helper_cugraph( + gpubenchmark, N, attr_kind, create_using, method, do_renumber +): + G = method(N, create_using=create_using) + if attr_kind: + for *_ids, edgedict in G.edges(data=True): + edgedict["x"] = random.randint(0, 100000) + gpubenchmark(cugraph.utilities.convert_from_nx, G, "x", do_renumber=do_renumber) + else: + gpubenchmark(cugraph.utilities.convert_from_nx, G, do_renumber=do_renumber) + + +def _bench_helper_scipy(gpubenchmark, N, attr_kind, create_using, method, fmt): + G = method(N, create_using=create_using) + if attr_kind: + for *_ids, edgedict in G.edges(data=True): + edgedict["x"] = random.randint(0, 100000) + gpubenchmark(nx.to_scipy_sparse_array, G, weight="x", format=fmt) + else: + gpubenchmark(nx.to_scipy_sparse_array, G, weight=None, format=fmt) + + +@pytest.mark.parametrize("N", [1, 10**6]) +@pytest.mark.parametrize( + "attr_kind", + [ + "required_dtype", + "required", + "full", + "half_missing", + "half_default", + "preserve", + None, + ], +) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +def bench_cycle_graph(gpubenchmark, N, attr_kind, create_using): + _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.cycle_graph) + + +@pytest.mark.skipif("not cugraph") +@pytest.mark.parametrize("N", [1, 10**6]) +@pytest.mark.parametrize("attr_kind", ["full", None]) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("do_renumber", [True, False]) +def bench_cycle_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_renumber): + if N == 1 and not do_renumber: + do_renumber = True + _bench_helper_cugraph( + gpubenchmark, N, attr_kind, create_using, nx.cycle_graph, do_renumber + ) + + +@pytest.mark.skipif("not scipy") +@pytest.mark.parametrize("N", [1, 10**6]) +@pytest.mark.parametrize("attr_kind", ["full", None]) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("fmt", ["coo", "csr"]) +def bench_cycle_graph_scipy(gpubenchmark, N, attr_kind, create_using, fmt): + _bench_helper_scipy(gpubenchmark, N, attr_kind, create_using, nx.cycle_graph, fmt) + + +@pytest.mark.parametrize("N", [1, 1500]) +@pytest.mark.parametrize( + "attr_kind", + [ + "required_dtype", + "required", + "full", + "half_missing", + "half_default", + "preserve", + None, + ], +) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +def bench_complete_graph_edgedata(gpubenchmark, N, attr_kind, create_using): + _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.complete_graph) + + +@pytest.mark.parametrize("N", [3000]) +@pytest.mark.parametrize("attr_kind", [None]) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +def bench_complete_graph_noedgedata(gpubenchmark, N, attr_kind, create_using): + _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.complete_graph) + + +@pytest.mark.skipif("not cugraph") +@pytest.mark.parametrize("N", [1, 1500]) +@pytest.mark.parametrize("attr_kind", ["full", None]) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("do_renumber", [True, False]) +def bench_complete_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_renumber): + if N == 1 and not do_renumber: + do_renumber = True + _bench_helper_cugraph( + gpubenchmark, N, attr_kind, create_using, nx.complete_graph, do_renumber + ) + + +@pytest.mark.skipif("not scipy") +@pytest.mark.parametrize("N", [1, 1500]) +@pytest.mark.parametrize("attr_kind", ["full", None]) +@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("fmt", ["coo", "csr"]) +def bench_complete_graph_scipy(gpubenchmark, N, attr_kind, create_using, fmt): + _bench_helper_scipy( + gpubenchmark, N, attr_kind, create_using, nx.complete_graph, fmt + ) diff --git a/python/nx-cugraph/nx_cugraph/tests/conftest.py b/python/nx-cugraph/nx_cugraph/tests/conftest.py new file mode 100644 index 000000000..e5a250784 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/conftest.py @@ -0,0 +1,31 @@ +# 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. +def pytest_configure(config): + if config.getoption("--all", False): + # Run benchmarks AND tests + config.option.benchmark_skip = False + config.option.benchmark_enable = True + elif config.getoption("--bench", False) or config.getoption( + "--benchmark-enable", False + ): + # Run benchmarks (and only benchmarks) with `--bench` argument + config.option.benchmark_skip = False + config.option.benchmark_enable = True + if not config.option.keyword: + config.option.keyword = "bench_" + else: + # Run only tests + config.option.benchmark_skip = True + config.option.benchmark_enable = False + if not config.option.keyword: + config.option.keyword = "test_" diff --git a/python/nx-cugraph/nx_cugraph/tests/test_convert.py b/python/nx-cugraph/nx_cugraph/tests/test_convert.py new file mode 100644 index 000000000..ba3cd7aae --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_convert.py @@ -0,0 +1,203 @@ +# 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. +import cupy as cp +import networkx as nx +import pytest + +import nx_cugraph as nxcg +from nx_cugraph import interface + + +@pytest.mark.parametrize("graph_class", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize( + "kwargs", + [ + {}, + {"preserve_edge_attrs": True}, + {"preserve_node_attrs": True}, + {"preserve_all_attrs": True}, + {"edge_attrs": {"x": 0}}, + {"edge_attrs": {"x": None}}, + {"edge_attrs": {"x": nxcg.convert.REQUIRED}}, + {"edge_attrs": {"x": ...}}, # sugar for REQUIRED + {"edge_attrs": "x"}, + {"node_attrs": {"x": 0}}, + {"node_attrs": {"x": None}}, + {"node_attrs": {"x": nxcg.convert.REQUIRED}}, + {"node_attrs": {"x": ...}}, # sugar for REQUIRED + {"node_attrs": "x"}, + ], +) +def test_convert_empty(graph_class, kwargs): + G = graph_class() + Gcg = nxcg.from_networkx(G, **kwargs) + H = nxcg.to_networkx(Gcg) + assert G.number_of_nodes() == Gcg.number_of_nodes() == H.number_of_nodes() == 0 + assert G.number_of_edges() == Gcg.number_of_edges() == H.number_of_edges() == 0 + assert Gcg.edge_values == Gcg.edge_masks == Gcg.node_values == Gcg.node_masks == {} + assert G.graph == Gcg.graph == H.graph == {} + + +def test_convert(): + # FIXME: can we break this into smaller tests? + G = nx.Graph() + G.add_edge(0, 1, x=2) + G.add_node(0, foo=10) + G.add_node(1, foo=20, bar=100) + for kwargs in [ + {"preserve_edge_attrs": True}, + {"preserve_all_attrs": True}, + {"edge_attrs": {"x": 0}}, + {"edge_attrs": {"x": None}, "node_attrs": {"bar": None}}, + {"edge_attrs": "x", "edge_dtypes": int}, + { + "edge_attrs": {"x": nxcg.convert.REQUIRED}, + "node_attrs": {"foo": nxcg.convert.REQUIRED}, + }, + {"edge_attrs": {"x": ...}, "node_attrs": {"foo": ...}}, # sugar for REQUIRED + ]: + # All edges have "x" attribute, so all kwargs are equivalent + Gcg = nxcg.from_networkx(G, **kwargs) + cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.edge_values["x"], [2, 2]) + assert len(Gcg.edge_values) == 1 + assert Gcg.edge_masks == {} + H = nxcg.to_networkx(Gcg) + assert G.number_of_nodes() == Gcg.number_of_nodes() == H.number_of_nodes() == 2 + assert G.number_of_edges() == Gcg.number_of_edges() == H.number_of_edges() == 1 + assert G.adj == H.adj + + with pytest.raises(KeyError, match="bar"): + nxcg.from_networkx(G, node_attrs={"bar": ...}) + + # Structure-only graph (no edge attributes) + Gcg = nxcg.from_networkx(G, preserve_node_attrs=True) + cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.node_values["foo"], [10, 20]) + assert Gcg.edge_values == Gcg.edge_masks == {} + H = nxcg.to_networkx(Gcg) + assert set(G.edges) == set(H.edges) == {(0, 1)} + assert G.nodes == H.nodes + + # Fill completely missing attribute with default value + Gcg = nxcg.from_networkx(G, edge_attrs={"y": 0}) + cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.edge_values["y"], [0, 0]) + assert len(Gcg.edge_values) == 1 + assert Gcg.edge_masks == Gcg.node_values == Gcg.node_masks == {} + H = nxcg.to_networkx(Gcg) + assert list(H.edges(data=True)) == [(0, 1, {"y": 0})] + + # If attribute is completely missing (and no default), then just ignore it + Gcg = nxcg.from_networkx(G, edge_attrs={"y": None}) + cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + assert sorted(Gcg.edge_values) == sorted(Gcg.edge_masks) == [] + H = nxcg.to_networkx(Gcg) + assert list(H.edges(data=True)) == [(0, 1, {})] + + G.add_edge(0, 2) + # Some edges are missing 'x' attribute; need to use a mask + for kwargs in [{"preserve_edge_attrs": True}, {"edge_attrs": {"x": None}}]: + Gcg = nxcg.from_networkx(G, **kwargs) + cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + assert sorted(Gcg.edge_values) == sorted(Gcg.edge_masks) == ["x"] + cp.testing.assert_array_equal(Gcg.edge_masks["x"], [True, False, True, False]) + cp.testing.assert_array_equal(Gcg.edge_values["x"][Gcg.edge_masks["x"]], [2, 2]) + H = nxcg.to_networkx(Gcg) + assert list(H.edges(data=True)) == [(0, 1, {"x": 2}), (0, 2, {})] + + with pytest.raises(KeyError, match="x"): + nxcg.from_networkx(G, edge_attrs={"x": nxcg.convert.REQUIRED}) + with pytest.raises(KeyError, match="x"): + nxcg.from_networkx(G, edge_attrs={"x": ...}) + with pytest.raises(KeyError, match="bar"): + nxcg.from_networkx(G, node_attrs={"bar": nxcg.convert.REQUIRED}) + with pytest.raises(KeyError, match="bar"): + nxcg.from_networkx(G, node_attrs={"bar": ...}) + + # Now for something more complicated... + G = nx.Graph() + G.add_edge(10, 20, x=1) + G.add_edge(10, 30, x=2, y=1.5) + G.add_node(10, foo=100) + G.add_node(20, foo=200, bar=1000) + G.add_node(30, foo=300) + # Some edges have masks, some don't + for kwargs in [ + {"preserve_edge_attrs": True}, + {"preserve_all_attrs": True}, + {"edge_attrs": {"x": None, "y": None}}, + {"edge_attrs": {"x": 0, "y": None}}, + {"edge_attrs": {"x": 0, "y": None}}, + {"edge_attrs": {"x": 0, "y": None}, "edge_dtypes": {"x": int, "y": float}}, + ]: + Gcg = nxcg.from_networkx(G, **kwargs) + assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.edge_values["x"], [1, 2, 1, 2]) + assert sorted(Gcg.edge_masks) == ["y"] + cp.testing.assert_array_equal(Gcg.edge_masks["y"], [False, True, False, True]) + cp.testing.assert_array_equal( + Gcg.edge_values["y"][Gcg.edge_masks["y"]], [1.5, 1.5] + ) + H = nxcg.to_networkx(Gcg) + assert G.adj == H.adj + + # Some nodes have masks, some don't + for kwargs in [ + {"preserve_node_attrs": True}, + {"preserve_all_attrs": True}, + {"node_attrs": {"foo": None, "bar": None}}, + {"node_attrs": {"foo": None, "bar": None}}, + {"node_attrs": {"foo": 0, "bar": None, "missing": None}}, + ]: + Gcg = nxcg.from_networkx(G, **kwargs) + assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.node_values["foo"], [100, 200, 300]) + assert sorted(Gcg.node_masks) == ["bar"] + cp.testing.assert_array_equal(Gcg.node_masks["bar"], [False, True, False]) + cp.testing.assert_array_equal( + Gcg.node_values["bar"][Gcg.node_masks["bar"]], [1000] + ) + H = nxcg.to_networkx(Gcg) + assert G.nodes == H.nodes + + # Check default values for nodes + for kwargs in [ + {"node_attrs": {"foo": None, "bar": 0}}, + {"node_attrs": {"foo": None, "bar": 0, "missing": None}}, + {"node_attrs": {"bar": 0}}, + {"node_attrs": {"bar": 0}, "node_dtypes": {"bar": int}}, + {"node_attrs": {"bar": 0, "foo": None}, "node_dtypes": int}, + ]: + Gcg = nxcg.from_networkx(G, **kwargs) + assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.node_values["bar"], [0, 1000, 0]) + assert Gcg.node_masks == {} + + with pytest.raises( + TypeError, match="edge_attrs and weight arguments should not both be given" + ): + interface.BackendInterface.convert_from_nx(G, edge_attrs={"x": 1}, weight="x") + with pytest.raises(TypeError, match="Expected networkx.Graph"): + nxcg.from_networkx({}) diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py new file mode 100644 index 000000000..64d3704dd --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py @@ -0,0 +1,106 @@ +# 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. +import importlib +import inspect + +import networkx as nx + +import nx_cugraph as nxcg +from nx_cugraph.utils import networkx_algorithm + + +def test_match_signature_and_names(): + """Simple test to ensure our signatures and basic module layout match networkx.""" + for name, func in vars(nxcg.interface.BackendInterface).items(): + if not isinstance(func, networkx_algorithm): + continue + + # nx version >=3.2 uses utils.backends, version >=3.0,<3.2 uses classes.backends + is_nx_30_or_31 = hasattr(nx.classes, "backends") + nx_backends = nx.classes.backends if is_nx_30_or_31 else nx.utils.backends + + if is_nx_30_or_31 and name in {"louvain_communities"}: + continue + dispatchable_func = nx_backends._registered_algorithms[name] + # nx version >=3.2 uses orig_func, version >=3.0,<3.2 uses _orig_func + if is_nx_30_or_31: + orig_func = dispatchable_func._orig_func + else: + orig_func = dispatchable_func.orig_func + + # Matching signatures? + orig_sig = inspect.signature(orig_func) + func_sig = inspect.signature(func) + if not func.extra_params: + assert orig_sig == func_sig + else: + # Ignore extra parameters added to nx-cugraph algorithm + assert orig_sig == func_sig.replace( + parameters=[ + p + for name, p in func_sig.parameters.items() + if name not in func.extra_params + ] + ) + if func.can_run is not nxcg.utils.decorators._default_can_run: + assert func_sig == inspect.signature(func.can_run) + + # Matching function names? + assert func.__name__ == dispatchable_func.__name__ == orig_func.__name__ + + # Matching dispatch names? + # nx version >=3.2 uses name, version >=3.0,<3.2 uses dispatchname + if is_nx_30_or_31: + dispatchname = dispatchable_func.dispatchname + else: + dispatchname = dispatchable_func.name + assert func.name == dispatchname + + # Matching modules (i.e., where function defined)? + assert ( + "networkx." + func.__module__.split(".", 1)[1] + == dispatchable_func.__module__ + == orig_func.__module__ + ) + + # Matching package layout (i.e., which modules have the function)? + nxcg_path = func.__module__ + name = func.__name__ + while "." in nxcg_path: + # This only walks up the module tree and does not check sibling modules + nxcg_path, mod_name = nxcg_path.rsplit(".", 1) + nx_path = nxcg_path.replace("nx_cugraph", "networkx") + nxcg_mod = importlib.import_module(nxcg_path) + nx_mod = importlib.import_module(nx_path) + # Is the function present in the current module? + present_in_nxcg = hasattr(nxcg_mod, name) + present_in_nx = hasattr(nx_mod, name) + if present_in_nxcg is not present_in_nx: # pragma: no cover (debug) + if present_in_nxcg: + raise AssertionError( + f"{name} exists in {nxcg_path}, but not in {nx_path}" + ) + raise AssertionError( + f"{name} exists in {nx_path}, but not in {nxcg_path}" + ) + # Is the nested module present in the current module? + present_in_nxcg = hasattr(nxcg_mod, mod_name) + present_in_nx = hasattr(nx_mod, mod_name) + if present_in_nxcg is not present_in_nx: # pragma: no cover (debug) + if present_in_nxcg: + raise AssertionError( + f"{mod_name} exists in {nxcg_path}, but not in {nx_path}" + ) + raise AssertionError( + f"{mod_name} exists in {nx_path}, but not in {nxcg_path}" + ) diff --git a/python/nx-cugraph/nx_cugraph/typing.py b/python/nx-cugraph/nx_cugraph/typing.py new file mode 100644 index 000000000..d3045ab46 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/typing.py @@ -0,0 +1,25 @@ +# 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. +from __future__ import annotations + +from collections.abc import Hashable +from typing import TypeVar + +AttrKey = TypeVar("AttrKey", bound=Hashable) +EdgeKey = TypeVar("EdgeKey", bound=Hashable) +NodeKey = TypeVar("NodeKey", bound=Hashable) +EdgeTuple = tuple[NodeKey, NodeKey] +EdgeValue = TypeVar("EdgeValue") +NodeValue = TypeVar("NodeValue") +IndexValue = TypeVar("IndexValue") +Dtype = TypeVar("Dtype") diff --git a/python/nx-cugraph/nx_cugraph/utils/__init__.py b/python/nx-cugraph/nx_cugraph/utils/__init__.py new file mode 100644 index 000000000..6df5fb609 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/utils/__init__.py @@ -0,0 +1,14 @@ +# 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. +from .decorators import * +from .misc import * diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py new file mode 100644 index 000000000..3dbdb07e8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -0,0 +1,69 @@ +# 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. +from functools import partial, update_wrapper + +from networkx.utils.decorators import not_implemented_for + +from nx_cugraph.interface import BackendInterface + +__all__ = ["not_implemented_for", "networkx_algorithm"] + + +def networkx_class(api): + def inner(func): + func.__doc__ = getattr(api, func.__name__).__doc__ + return func + + return inner + + +class networkx_algorithm: + def __new__(cls, func=None, *, name=None, extra_params=None): + if func is None: + return partial(networkx_algorithm, name=name, extra_params=extra_params) + instance = object.__new__(cls) + # update_wrapper sets __wrapped__, which will be used for the signature + update_wrapper(instance, func) + instance.__defaults__ = func.__defaults__ + instance.__kwdefaults__ = func.__kwdefaults__ + instance.name = func.__name__ if name is None else name + # TODO: should extra_params be a dict[str, str] that describes the parameters? + if extra_params is None: + instance.extra_params = None + elif isinstance(extra_params, str): + instance.extra_params = {extra_params} + else: + instance.extra_params = set(extra_params) + instance.can_run = _default_can_run + setattr(BackendInterface, instance.name, instance) + # Set methods so they are in __dict__ + instance._can_run = instance._can_run + return instance + + def _can_run(self, func): + """Set the `can_run` attribute to the decorated function.""" + self.can_run = func + + def __call__(self, /, *args, **kwargs): + return self.__wrapped__(*args, **kwargs) + + def __reduce__(self): + return _restore_networkx_dispatched, (self.name,) + + +def _default_can_run(*args, **kwargs): + return True + + +def _restore_networkx_dispatched(name): + return getattr(BackendInterface, name) diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py new file mode 100644 index 000000000..64c0be066 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -0,0 +1,60 @@ +# 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. +from __future__ import annotations + +import operator as op +import sys +from random import Random + +import cupy as cp + +__all__ = ["_groupby", "_handle_seed"] + + +def _groupby(groups: cp.ndarray, values: cp.ndarray) -> dict[int, cp.ndarray]: + """Perform a groupby operation given an array of group IDs and array of values. + + Parameters + ---------- + groups : cp.ndarray + Array that holds the group IDs. + Group IDs are assumed to be consecutive integers from 0. + values : cp.ndarray + Array of values to be grouped according to groups. + Must be the same size as groups array. + + Returns + ------- + dict with group IDs as keys and cp.ndarray as values. + """ + # It would actually be easy to support groups that aren't consecutive integers, + # but let's wait until we need it to implement it. + sorted_groups = cp.argsort(groups) + sorted_values = values[sorted_groups] + rv = {} + start = 0 + for i, end in enumerate( + [*(cp.nonzero(cp.diff(groups[sorted_groups]))[0] + 1).tolist(), groups.size] + ): + rv[i] = sorted_values[start:end] + start = end + return rv + + +def _handle_seed(seed: int | Random | None) -> int: + """Handle seed argument and ensure it is what pylibcugraph needs: an int.""" + if seed is None: + return + if isinstance(seed, Random): + return seed.randint(0, sys.maxsize) + return op.index(seed) # Ensure seed is integral diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml new file mode 100644 index 000000000..95e9c256e --- /dev/null +++ b/python/nx-cugraph/pyproject.toml @@ -0,0 +1,218 @@ +# Copyright (c) 2023, NVIDIA CORPORATION. + +[build-system] + +requires = [ + "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`. +build-backend = "setuptools.build_meta" + +[project] +name = "nx-cugraph" +version = "23.10.00" +description = "cugraph backend for NetworkX" +readme = { file = "README.md", content-type = "text/markdown" } +authors = [ + { name = "NVIDIA Corporation" }, +] +license = { text = "Apache 2.0" } +requires-python = ">=3.9" +classifiers = [ + "Development Status :: 3 - Alpha", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3 :: Only", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries :: Python Modules", +] +dependencies = [ + "cupy-cuda11x>=12.0.0", + "networkx>=3.0", + "pylibcugraph==23.10.*", +] # 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 = [ + "packaging>=21", + "pandas", + "pytest", + "pytest-benchmark", + "pytest-cov", + "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`. + +[project.urls] +Homepage = "https://github.com/rapidsai/cugraph" +Documentation = "https://docs.rapids.ai/api/cugraph/stable/" + +[project.entry-points."networkx.plugins"] +cugraph = "nx_cugraph.interface:BackendInterface" + +[tool.setuptools] +license-files = ["LICENSE"] + +[tool.setuptools.packages.find] +include = [ + "nx_cugraph*", + "nx_cugraph.*", +] + +[tool.black] +line-length = 88 +target-version = ["py39", "py310", "py311"] + +[tool.isort] +sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] +profile = "black" +skip_gitignore = true +float_to_top = true +default_section = "THIRDPARTY" +known_first_party = "nx_cugraph" +line_length = 88 + +[tool.pytest.ini_options] +minversion = "6.0" +testpaths = "nx_cugraph/tests" +xfail_strict = true +markers = [ + "slow: Skipped unless --runslow passed", +] +log_cli_level = "info" +filterwarnings = [ + # See: https://docs.python.org/3/library/warnings.html#describing-warning-filters + # and: https://docs.pytest.org/en/7.2.x/how-to/capture-warnings.html#controlling-warnings + # "error", +] +python_files = [ + "bench_*.py", + "test_*.py", +] +python_functions = [ + "bench_*", + "test_*", +] +addopts = [ + "--strict-config", # Force error if config is mispelled + "--strict-markers", # Force error if marker is mispelled (must be defined in config) + # "-ra", # Print summary of all fails/errors + "--benchmark-warmup=off", + "--benchmark-max-time=0", + "--benchmark-min-rounds=3", + "--benchmark-columns=min,median,max", +] + +[tool.coverage.run] +branch = true +source = ["nx_cugraph"] +omit = [] + +[tool.coverage.report] +ignore_errors = false +precision = 1 +fail_under = 0 +skip_covered = false # Nice to see fully covered files when running `run_nx_tests.sh` +skip_empty = true +exclude_lines = [ + "pragma: no cover", + "raise AssertionError", + "raise NotImplementedError", +] + +[tool.ruff] +# https://github.com/charliermarsh/ruff/ +line-length = 88 +target-version = "py39" +select = [ + "ALL", +] +external = [ + # noqa codes that ruff doesn't know about: https://github.com/charliermarsh/ruff#external +] +ignore = [ + # Would be nice to fix these + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D104", # Missing docstring in public package + "D105", # Missing docstring in magic method + + # Maybe consider + # "SIM300", # Yoda conditions are discouraged, use ... instead (Note: we're not this picky) + # "SIM401", # Use dict.get ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer) + # "TRY004", # Prefer `TypeError` exception for invalid type (Note: good advice, but not worth the nuisance) + # "TRY200", # Use `raise from` to specify exception cause (Note: sometimes okay to raise original exception) + + # Intentionally ignored + "A003", # Class attribute ... is shadowing a python builtin + "ANN101", # Missing type annotation for `self` in method + "ARG004", # Unused static method argument: `...` + "COM812", # Trailing comma missing + "D203", # 1 blank line required before class docstring (Note: conflicts with D211, which is preferred) + "D400", # First line should end with a period (Note: prefer D415, which also allows "?" and "!") + "F403", # `from .classes import *` used; unable to detect undefined names (Note: used to match networkx) + "N801", # Class name ... should use CapWords convention (Note:we have a few exceptions to this) + "N802", # Function name ... should be lowercase + "N803", # Argument name ... should be lowercase (Maybe okay--except in tests) + "N806", # Variable ... in function should be lowercase + "N807", # Function name should not start and end with `__` + "N818", # Exception name ... should be named with an Error suffix (Note: good advice) + "PLR0911", # Too many return statements + "PLR0912", # Too many branches + "PLR0913", # Too many arguments to function call + "PLR0915", # Too many statements + "PLR2004", # Magic number used in comparison, consider replacing magic with a constant variable + "PLW2901", # Outer for loop variable ... overwritten by inner assignment target (Note: good advice, but too strict) + "RET502", # Do not implicitly `return None` in function able to return non-`None` value + "RET503", # Missing explicit `return` at the end of function able to return non-`None` value + "RET504", # Unnecessary variable assignment before `return` statement + "S110", # `try`-`except`-`pass` detected, consider logging the exception (Note: good advice, but we don't log) + "S112", # `try`-`except`-`continue` detected, consider logging the exception (Note: good advice, but we don't log) + "SIM102", # Use a single `if` statement instead of nested `if` statements (Note: often necessary) + "SIM105", # Use contextlib.suppress(...) instead of try-except-pass (Note: try-except-pass is much faster) + "SIM108", # Use ternary operator ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer) + "TRY003", # Avoid specifying long messages outside the exception class (Note: why?) + + # Ignored categories + "C90", # mccabe (Too strict, but maybe we should make things less complex) + "I", # isort (Should we replace `isort` with this?) + "ANN", # flake8-annotations + "BLE", # flake8-blind-except (Maybe consider) + "FBT", # flake8-boolean-trap (Why?) + "DJ", # flake8-django (We don't use django) + "EM", # flake8-errmsg (Perhaps nicer, but too much work) + # "ICN", # flake8-import-conventions (Doesn't allow "_" prefix such as `_np`) + "PYI", # flake8-pyi (We don't have stub files yet) + "SLF", # flake8-self (We can use our own private variables--sheesh!) + "TID", # flake8-tidy-imports (Rely on isort and our own judgement) + # "TCH", # flake8-type-checking + "ARG", # flake8-unused-arguments (Sometimes helpful, but too strict) + "TD", # flake8-todos (Maybe okay to add some of these) + "FIX", # flake8-fixme (like flake8-todos) + "ERA", # eradicate (We like code in comments!) + "PD", # pandas-vet (Intended for scripts that use pandas, not libraries) +] + +[tool.ruff.per-file-ignores] +"__init__.py" = ["F401"] # Allow unused imports (w/o defining `__all__`) +# Allow assert, print, RNG, and no docstring +"nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"] + +[tool.ruff.flake8-annotations] +mypy-init-return = true + +[tool.ruff.flake8-builtins] +builtins-ignorelist = ["copyright"] + +[tool.ruff.flake8-pytest-style] +fixture-parentheses = false +mark-parentheses = false + +[tool.ruff.pydocstyle] +convention = "numpy" diff --git a/python/nx-cugraph/run_nx_tests.sh b/python/nx-cugraph/run_nx_tests.sh new file mode 100755 index 000000000..07c97cdf9 --- /dev/null +++ b/python/nx-cugraph/run_nx_tests.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2023, NVIDIA CORPORATION. +# +# NETWORKX_GRAPH_CONVERT=cugraph +# Used by networkx versions 3.0 and 3.1 +# Must be set to "cugraph" to test the nx-cugraph backend. +# +# NETWORKX_TEST_BACKEND=cugraph +# Replaces NETWORKX_GRAPH_CONVERT for networkx versions >=3.2 +# Must be set to "cugraph" to test the nx-cugraph backend. +# +# NETWORKX_FALLBACK_TO_NX=True (optional) +# Used by networkx versions >=3.2. With this set, input graphs will not be +# converted to nx-cugraph and the networkx algorithm will be called for +# algorithms that we don't implement or if we raise NotImplementedError. +# This is sometimes helpful to get increased testing and coverage, but +# testing takes longer. Without it, tests will xfail when encountering a +# function that we don't implement. +# +# Coverage of `nx_cugraph.algorithms` is reported and is a good sanity check +# that algorithms run. + +# Warning: cugraph has a .coveragerc file in the /python directory, +# so be mindful of its contents and the CWD when running. +# FIXME: should something be added to detect/prevent the above? + +NETWORKX_GRAPH_CONVERT=cugraph \ +NETWORKX_TEST_BACKEND=cugraph \ +NETWORKX_FALLBACK_TO_NX=True \ + pytest \ + --pyargs networkx \ + --cov=nx_cugraph.algorithms \ + --cov-report term-missing \ + --no-cov-on-fail \ + "$@" diff --git a/python/nx-cugraph/setup.py b/python/nx-cugraph/setup.py new file mode 100644 index 000000000..87c0e1064 --- /dev/null +++ b/python/nx-cugraph/setup.py @@ -0,0 +1,15 @@ +# 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. +from setuptools import setup + +setup() From a69ae14537bd4ebad83d3ec813229cd013d5b324 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Tue, 19 Sep 2023 14:20:15 -0500 Subject: [PATCH 264/384] Update to clang 16.0.6. (#3859) This PR updates cugraph to use clang 16.0.6. The previous version 16.0.1 has some minor formatting issues affecting several RAPIDS repos. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - Brad Rees (https://github.com/BradReesWork) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/3859 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0f05aedf1..865d06b20 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: additional_dependencies: - flake8==6.0.0 - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v16.0.1 + rev: v16.0.6 hooks: - id: clang-format exclude: | From 4ab0770bf735eed474bc3d781102619c9978b389 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Fri, 22 Sep 2023 10:58:08 -0400 Subject: [PATCH 265/384] v23.12 Updates [skip ci] --- docs/cugraph/source/conf.py | 4 ++-- python/nx-cugraph/README.md | 2 +- python/nx-cugraph/nx_cugraph/__init__.py | 2 +- python/nx-cugraph/pyproject.toml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index a96f0fc1e..58ecca271 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -76,9 +76,9 @@ # built documents. # # The short X.Y version. -version = '23.10' +version = '23.12' # The full version, including alpha/beta/rc tags. -release = '23.10.00' +release = '23.12.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index e7cd26218..ab267e5a7 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -6,7 +6,7 @@ with minimal dependencies (`networkx`, `cupy`, and `pylibcugraph`) to run graph ### Contribute -Follow instructions for [contributing to cugraph](https://github.com/rapidsai/cugraph/blob/branch-23.10/readme_pages/CONTRIBUTING.md) +Follow instructions for [contributing to cugraph](https://github.com/rapidsai/cugraph/blob/branch-23.12 and [building from source](https://docs.rapids.ai/api/cugraph/stable/installation/source_build/), then build nx-cugraph in develop (i.e., editable) mode: ``` $ ./build.sh nx-cugraph --pydevelop diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 28066fe2b..c23542842 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -17,4 +17,4 @@ from .classes import * from .convert import * -__version__ = "23.10.00" +__version__ = "23.12.00" diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 95e9c256e..532b52256 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta" [project] name = "nx-cugraph" -version = "23.10.00" +version = "23.12.00" description = "cugraph backend for NetworkX" readme = { file = "README.md", content-type = "text/markdown" } authors = [ @@ -32,7 +32,7 @@ classifiers = [ dependencies = [ "cupy-cuda11x>=12.0.0", "networkx>=3.0", - "pylibcugraph==23.10.*", + "pylibcugraph==23.12.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. [project.optional-dependencies] From 0a3df82a6448bf5fcf1092a1bc4a901b49e29ad5 Mon Sep 17 00:00:00 2001 From: Paul Taylor <178183+trxcllnt@users.noreply.github.com> Date: Wed, 27 Sep 2023 12:08:12 -0700 Subject: [PATCH 266/384] Add cuGraph devcontainers (#3838) This PR adds some [devcontainers](https://containers.dev/) to help simplify building the cuGraph C++ and Python libraries. It also adds an optional job to the `pr.yaml` to [build the cuGraph libs in each devcontainer](https://github.com/trxcllnt/cugraph/blob/fea/devcontainers/.github/workflows/pr.yaml#L113-L119), so the build caches are populated for devs by CI. A devcontainer can be launched by clicking the "Reopen in Container" button that VSCode shows when opening the repo (or by using the "Rebuild and Reopen in Container" command from the command palette): ![image](https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png) Clicking this button will cause VSCode to prompt the user to select one of these devcontainer variants: ![image](https://github.com/rapidsai/rmm/assets/178183/68d4b264-4fc2-4008-92b6-cb4bdd19b29f) On startup, the devcontainer creates or updates the conda/pip environment using `cugraph/dependencies.yaml`. The envs/package caches are cached on the host via volume mounts, which are described in more detail in [`.devcontainer/README.md`](https://github.com/trxcllnt/cugraph/blob/fea/devcontainers/.devcontainer/README.md). The container includes convenience functions to clean, configure, and build the various cuGraph components: ```shell $ clean-cugraph-cpp # only cleans the C++ build dir $ clean-cugraph-python # only cleans the Python build dir $ clean-cugraph # cleans both C++ and Python build dirs $ configure-cugraph-cpp # only configures cugraph C++ lib $ build-cugraph-cpp # only builds cugraph C++ lib $ build-cugraph-python # only builds cugraph Python lib $ build-cugraph # builds both C++ and Python libs ``` * The C++ build script is a small wrapper around `cmake -S ~/cugraph/cpp -B ~/cugraph/cpp/build` and `cmake --build ~/cugraph/cpp/build` * The Python build script is a small wrapper around `pip install --editable ~/cugraph/cpp` Unlike `build.sh`, these convenience scripts *don't* install the libraries after building them. Instead, they automatically inject the correct arguments to build the C++ libraries from source and use their build dirs as package roots: ```shell $ cmake -S ~/cugraph/cpp -B ~/cugraph/cpp/build $ CMAKE_ARGS="-Dcugraph_ROOT=~/cugraph/cpp/build" \ # <-- this argument is automatic pip install -e ~/cugraph/cpp ``` Authors: - Paul Taylor (https://github.com/trxcllnt) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) - Jake Awe (https://github.com/AyodeAwe) URL: https://github.com/rapidsai/cugraph/pull/3838 --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 3fda9f8a0..c6bcf6965 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,7 @@ python/cugraph/cugraph/tests/dask-worker-space docs/cugraph/source/api_docs/api/* _html _text + +# clang tooling +compile_commands.json +.clangd/ From b192ae6ddcf3b5e5cb9e91aefb457a69ba51ddb4 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Thu, 28 Sep 2023 13:09:17 -0500 Subject: [PATCH 267/384] Add entry point to tell NetworkX about nx-cugraph without importing it. (#3848) This allows NetworkX docstrings to be updated (among other things). This will have a companion PR in NetworkX. We still need to determine (and agree) on the dict returned by this entry point, and NetworkX doesn't need to use everything I have here. We should probably add a string for `"description"` that gives a very short description of the backend, and maybe `"url"` or `"homepage"` or whatever so online docs can have links. Here's how to use the entry point (Python >= 3.10) after installing it: ```python In [1]: from importlib.metadata import entry_points In [2]: items = entry_points(group="networkx.plugin_info") In [3]: [plugin] = items In [4]: plugin.load()() Out[4]: {'backend_name': 'cugraph', 'project': 'nx-cugraph', 'package': 'nx_cugraph', 'functions': {'betweenness_centrality', 'edge_betweenness_centrality', 'louvain_communities'}, 'extra_docstrings': {'betweenness_centrality': '`weight` parameter is not yet supported.', 'edge_betweenness_centrality': '`weight` parameter is not yet supported.', 'louvain_communities': '`threshold` and `seed` parameters are currently ignored.'}, 'extra_parameters': {'louvain_communities': {'max_level': 'Upper limit of the number of macro-iterations.'}}} ``` CC @rlratzel @betochimas Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/3848 --- python/nx-cugraph/.flake8 | 1 + python/nx-cugraph/Makefile | 10 +++ python/nx-cugraph/_nx_cugraph/__init__.py | 88 ++++++++++++++++++ python/nx-cugraph/_nx_cugraph/core.py | 90 +++++++++++++++++++ python/nx-cugraph/lint.yaml | 19 ++-- python/nx-cugraph/nx_cugraph/__init__.py | 16 +++- .../algorithms/centrality/betweenness.py | 6 +- .../algorithms/community/louvain.py | 17 ++-- python/nx-cugraph/nx_cugraph/interface.py | 5 +- .../nx_cugraph/tests/test_match_api.py | 5 +- .../nx-cugraph/nx_cugraph/utils/decorators.py | 41 +++++++-- python/nx-cugraph/nx_cugraph/utils/misc.py | 6 +- python/nx-cugraph/pyproject.toml | 10 +++ 13 files changed, 277 insertions(+), 37 deletions(-) create mode 100644 python/nx-cugraph/_nx_cugraph/__init__.py create mode 100644 python/nx-cugraph/_nx_cugraph/core.py diff --git a/python/nx-cugraph/.flake8 b/python/nx-cugraph/.flake8 index 3a2e3fb86..c5874e54f 100644 --- a/python/nx-cugraph/.flake8 +++ b/python/nx-cugraph/.flake8 @@ -11,3 +11,4 @@ extend-ignore = per-file-ignores = nx_cugraph/tests/*.py:T201, __init__.py:F401,F403, + _nx_cugraph/__init__.py:E501, diff --git a/python/nx-cugraph/Makefile b/python/nx-cugraph/Makefile index c9caf147d..6e1b98ee6 100644 --- a/python/nx-cugraph/Makefile +++ b/python/nx-cugraph/Makefile @@ -1,7 +1,17 @@ # Copyright (c) 2023, NVIDIA CORPORATION. SHELL= /bin/bash +.PHONY: all +all: plugin-info lint + +.PHONY: lint lint: git ls-files | xargs pre-commit run --config lint.yaml --files + +.PHONY: lint-update lint-update: pre-commit autoupdate --config lint.yaml + +.PHONY: plugin-info +plugin-info: + python _nx_cugraph/__init__.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py new file mode 100644 index 000000000..9b3332106 --- /dev/null +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -0,0 +1,88 @@ +# 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. +"""Tell NetworkX about the cugraph backend. This file can update itself: + +$ make plugin-info # Recommended method for development + +or + +$ python _nx_cugraph/__init__.py +""" + +# Entries between BEGIN and END are automatically generated +_info = { + "backend_name": "cugraph", + "project": "nx-cugraph", + "package": "nx_cugraph", + "url": "https://github.com/rapidsai/cugraph/tree/branch-23.10/python/nx-cugraph", + "short_summary": "GPU-accelerated backend.", + # "description": "TODO", + "functions": { + # BEGIN: functions + "betweenness_centrality", + "edge_betweenness_centrality", + "louvain_communities", + # END: functions + }, + "extra_docstrings": { + # BEGIN: extra_docstrings + "betweenness_centrality": "`weight` parameter is not yet supported.", + "edge_betweenness_centrality": "`weight` parameter is not yet supported.", + "louvain_communities": "`threshold` and `seed` parameters are currently ignored.", + # END: extra_docstrings + }, + "extra_parameters": { + # BEGIN: extra_parameters + "louvain_communities": { + "max_level : int, optional": "Upper limit of the number of macro-iterations.", + }, + # END: extra_parameters + }, +} + + +def get_info(): + """Target of ``networkx.plugin_info`` entry point. + + This tells NetworkX about the cugraph backend without importing nx_cugraph. + """ + # Convert to e.g. `{"functions": {"myfunc": {"extra_docstring": ...}}}` + d = _info.copy() + info_keys = { + "extra_docstrings": "extra_docstring", + "extra_parameters": "extra_parameters", + } + d["functions"] = { + func: { + new_key: vals[func] + for old_key, new_key in info_keys.items() + if func in (vals := d[old_key]) + } + for func in d["functions"] + } + for key in info_keys: + del d[key] + return d + + +__version__ = "23.10.00" + +if __name__ == "__main__": + from pathlib import Path + + from _nx_cugraph.core import main + + filepath = Path(__file__) + text = main(filepath) + with filepath.open("w") as f: + f.write(text) diff --git a/python/nx-cugraph/_nx_cugraph/core.py b/python/nx-cugraph/_nx_cugraph/core.py new file mode 100644 index 000000000..72f920389 --- /dev/null +++ b/python/nx-cugraph/_nx_cugraph/core.py @@ -0,0 +1,90 @@ +# 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. +"""Utilities to help keep _nx_cugraph up to date.""" + + +def get_functions(): + from nx_cugraph.interface import BackendInterface + from nx_cugraph.utils import networkx_algorithm + + return { + key: val + for key, val in vars(BackendInterface).items() + if isinstance(val, networkx_algorithm) + } + + +def get_extra_docstrings(functions=None): + if functions is None: + functions = get_functions() + return {key: val.extra_doc for key, val in functions.items() if val.extra_doc} + + +def get_extra_parameters(functions=None): + if functions is None: + functions = get_functions() + return {key: val.extra_params for key, val in functions.items() if val.extra_params} + + +def update_text(text, lines_to_add, target, indent=" " * 8): + begin = f"# BEGIN: {target}\n" + end = f"# END: {target}\n" + start = text.index(begin) + stop = text.index(end) + to_add = "\n".join([f"{indent}{line}" for line in lines_to_add]) + return f"{text[:start]}{begin}{to_add}\n{indent}{text[stop:]}" + + +def dict_to_lines(d, *, indent=""): + for key in sorted(d): + val = d[key] + if "\n" not in val: + yield f"{indent}{key!r}: {val!r}," + else: + yield f"{indent}{key!r}: (" + *lines, last_line = val.split("\n") + for line in lines: + line += "\n" + yield f" {indent}{line!r}" + yield f" {indent}{last_line!r}" + yield f"{indent})," + + +def main(filepath): + from pathlib import Path + + filepath = Path(filepath) + with filepath.open() as f: + orig_text = f.read() + text = orig_text + + # Update functions + functions = get_functions() + to_add = [f'"{name}",' for name in sorted(functions)] + text = update_text(text, to_add, "functions") + + # Update extra_docstrings + extra_docstrings = get_extra_docstrings(functions) + to_add = list(dict_to_lines(extra_docstrings)) + text = update_text(text, to_add, "extra_docstrings") + + # Update extra_parameters + extra_parameters = get_extra_parameters(functions) + to_add = [] + for name in sorted(extra_parameters): + params = extra_parameters[name] + to_add.append(f"{name!r}: {{") + to_add.extend(dict_to_lines(params, indent=" " * 4)) + to_add.append("},") + text = update_text(text, to_add, "extra_parameters") + return text diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index dba061bd6..6a462a6af 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -31,7 +31,7 @@ repos: - id: validate-pyproject name: Validate pyproject.toml - repo: https://github.com/PyCQA/autoflake - rev: v2.2.0 + rev: v2.2.1 hooks: - id: autoflake args: [--in-place] @@ -40,17 +40,17 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.10.1 + rev: v3.13.0 hooks: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.7.0 + rev: 23.9.1 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.286 + rev: v0.0.291 hooks: - id: ruff args: [--fix-only, --show-fixes] @@ -58,11 +58,12 @@ repos: rev: 6.1.0 hooks: - id: flake8 + args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501'] # Why is this necessary? additional_dependencies: &flake8_dependencies - # These versions need updated manually - - flake8==6.1.0 - - flake8-bugbear==23.7.10 - - flake8-simplify==0.20.0 + # These versions need updated manually + - flake8==6.1.0 + - flake8-bugbear==23.9.16 + - flake8-simplify==0.20.0 - repo: https://github.com/asottile/yesqa rev: v1.5.0 hooks: @@ -76,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.286 + rev: v0.0.291 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 28066fe2b..4a0e95a10 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -12,9 +12,21 @@ # limitations under the License. from networkx.exception import * -from . import algorithms, classes, convert, utils -from .algorithms import * +from . import utils + +from . import classes from .classes import * + +from . import convert from .convert import * +# from . import convert_matrix +# from .convert_matrix import * + +# from . import generators +# from .generators import * + +from . import algorithms +from .algorithms import * + __version__ = "23.10.00" diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py index b777919f8..104ac8741 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py @@ -13,7 +13,7 @@ import pylibcugraph as plc from nx_cugraph.convert import _to_graph -from nx_cugraph.utils import _handle_seed, networkx_algorithm +from nx_cugraph.utils import _seed_to_int, networkx_algorithm __all__ = ["betweenness_centrality", "edge_betweenness_centrality"] @@ -22,11 +22,12 @@ def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None ): + """`weight` parameter is not yet supported.""" if weight is not None: raise NotImplementedError( "Weighted implementation of betweenness centrality not currently supported" ) - seed = _handle_seed(seed) + seed = _seed_to_int(seed) G = _to_graph(G, weight) node_ids, values = plc.betweenness_centrality( resource_handle=plc.ResourceHandle(), @@ -47,6 +48,7 @@ def _(G, k=None, normalized=True, weight=None, endpoints=False, seed=None): @networkx_algorithm def edge_betweenness_centrality(G, k=None, normalized=True, weight=None, seed=None): + """`weight` parameter is not yet supported.""" if weight is not None: raise NotImplementedError( "Weighted implementation of betweenness centrality not currently supported" diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index ca5f05c20..a183b59fe 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -17,7 +17,7 @@ from nx_cugraph.convert import _to_undirected_graph from nx_cugraph.utils import ( _groupby, - _handle_seed, + _seed_to_int, networkx_algorithm, not_implemented_for, ) @@ -26,16 +26,17 @@ @not_implemented_for("directed") -@networkx_algorithm(extra_params="max_level") +@networkx_algorithm( + extra_params={ + "max_level : int, optional": "Upper limit of the number of macro-iterations." + } +) def louvain_communities( G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None ): - """`threshold` and `seed` parameters are currently ignored. - - Extra parameter: `max_level` controls the maximum number of levels of the algorithm. - """ + """`threshold` and `seed` parameters are currently ignored.""" # NetworkX allows both directed and undirected, but cugraph only allows undirected. - seed = _handle_seed(seed) # Unused, but ensure it's valid for future compatibility + seed = _seed_to_int(seed) # Unused, but ensure it's valid for future compatibility G = _to_undirected_graph(G, weight) if G.row_indices.size == 0: # TODO: PLC doesn't handle empty graphs gracefully! @@ -46,8 +47,8 @@ def louvain_communities( resource_handle=plc.ResourceHandle(), graph=G._get_plc_graph(), max_level=max_level, # TODO: add this parameter to NetworkX + threshold=threshold, resolution=resolution, - # threshold=threshold, # TODO: add this parameter to PLC do_expensive_check=False, ) groups = _groupby(clusters, vertices) diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index cc750cd2d..2ad23acd9 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -62,9 +62,7 @@ def key(testpath): # Reasons for xfailing no_weights = "weighted implementation not currently supported" no_multigraph = "multigraphs not currently supported" - louvain_different = ( - "Louvain may be different due to RNG or unsupported threshold parameter" - ) + louvain_different = "Louvain may be different due to RNG" xfail = {} @@ -176,7 +174,6 @@ def key(testpath): ): louvain_different, key("test_louvain.py:test_none_weight_param"): louvain_different, key("test_louvain.py:test_multigraph"): louvain_different, - key("test_louvain.py:test_threshold"): louvain_different, } ) diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py index 64d3704dd..ecfda1397 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py @@ -45,11 +45,14 @@ def test_match_signature_and_names(): assert orig_sig == func_sig else: # Ignore extra parameters added to nx-cugraph algorithm + # The key of func.extra_params may be like "max_level : int, optional", + # but we only want "max_level" here. + extra_params = {name.split(" ")[0] for name in func.extra_params} assert orig_sig == func_sig.replace( parameters=[ p for name, p in func_sig.parameters.items() - if name not in func.extra_params + if name not in extra_params ] ) if func.can_run is not nxcg.utils.decorators._default_can_run: diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py index 3dbdb07e8..0f15d236e 100644 --- a/python/nx-cugraph/nx_cugraph/utils/decorators.py +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -10,13 +10,21 @@ # 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. +from __future__ import annotations + from functools import partial, update_wrapper -from networkx.utils.decorators import not_implemented_for +from networkx.utils.decorators import nodes_or_number, not_implemented_for from nx_cugraph.interface import BackendInterface -__all__ = ["not_implemented_for", "networkx_algorithm"] +try: + from networkx.utils.backends import _registered_algorithms +except ModuleNotFoundError: + from networkx.classes.backends import _registered_algorithms + + +__all__ = ["not_implemented_for", "nodes_or_number", "networkx_algorithm"] def networkx_class(api): @@ -28,7 +36,17 @@ def inner(func): class networkx_algorithm: - def __new__(cls, func=None, *, name=None, extra_params=None): + name: str + extra_doc: str | None + extra_params: dict[str, str] | None + + def __new__( + cls, + func=None, + *, + name: str | None = None, + extra_params: dict[str, str] | str | None = None, + ): if func is None: return partial(networkx_algorithm, name=name, extra_params=extra_params) instance = object.__new__(cls) @@ -37,13 +55,20 @@ def __new__(cls, func=None, *, name=None, extra_params=None): instance.__defaults__ = func.__defaults__ instance.__kwdefaults__ = func.__kwdefaults__ instance.name = func.__name__ if name is None else name - # TODO: should extra_params be a dict[str, str] that describes the parameters? if extra_params is None: - instance.extra_params = None + pass elif isinstance(extra_params, str): - instance.extra_params = {extra_params} - else: - instance.extra_params = set(extra_params) + extra_params = {extra_params: ""} + elif not isinstance(extra_params, dict): + raise TypeError( + f"extra_params must be dict, str, or None; got {type(extra_params)}" + ) + instance.extra_params = extra_params + # The docstring on our function is added to the NetworkX docstring. + instance.extra_doc = func.__doc__ + # Copy __doc__ from NetworkX + if instance.name in _registered_algorithms: + instance.__doc__ = _registered_algorithms[instance.name].__doc__ instance.can_run = _default_can_run setattr(BackendInterface, instance.name, instance) # Set methods so they are in __dict__ diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py index 64c0be066..72e4094b8 100644 --- a/python/nx-cugraph/nx_cugraph/utils/misc.py +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -18,7 +18,7 @@ import cupy as cp -__all__ = ["_groupby", "_handle_seed"] +__all__ = ["_groupby", "_seed_to_int"] def _groupby(groups: cp.ndarray, values: cp.ndarray) -> dict[int, cp.ndarray]: @@ -51,8 +51,8 @@ def _groupby(groups: cp.ndarray, values: cp.ndarray) -> dict[int, cp.ndarray]: return rv -def _handle_seed(seed: int | Random | None) -> int: - """Handle seed argument and ensure it is what pylibcugraph needs: an int.""" +def _seed_to_int(seed: int | Random | None) -> int: + """Handle any valid seed argument and convert it to an int if necessary.""" if seed is None: return if isinstance(seed, Random): diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 95e9c256e..db3b3a225 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -54,6 +54,9 @@ Documentation = "https://docs.rapids.ai/api/cugraph/stable/" [project.entry-points."networkx.plugins"] cugraph = "nx_cugraph.interface:BackendInterface" +[project.entry-points."networkx.plugin_info"] +cugraph = "_nx_cugraph:get_info" + [tool.setuptools] license-files = ["LICENSE"] @@ -61,6 +64,8 @@ license-files = ["LICENSE"] include = [ "nx_cugraph*", "nx_cugraph.*", + "_nx_cugraph*", + "_nx_cugraph.*", ] [tool.black] @@ -75,6 +80,7 @@ float_to_top = true default_section = "THIRDPARTY" known_first_party = "nx_cugraph" line_length = 88 +extend_skip_glob = ["nx_cugraph/__init__.py"] [tool.pytest.ini_options] minversion = "6.0" @@ -128,6 +134,9 @@ exclude_lines = [ # https://github.com/charliermarsh/ruff/ line-length = 88 target-version = "py39" +unfixable = [ + "F841", # unused-variable (Note: can leave useless expression) +] select = [ "ALL", ] @@ -203,6 +212,7 @@ ignore = [ "__init__.py" = ["F401"] # Allow unused imports (w/o defining `__all__`) # Allow assert, print, RNG, and no docstring "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"] +"_nx_cugraph/__init__.py" = ["E501"] [tool.ruff.flake8-annotations] mypy-init-return = true From 77c75d1d8874efb1d6b3f294b431bdf3c71e8db0 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Thu, 28 Sep 2023 14:03:26 -0500 Subject: [PATCH 268/384] Updates the source build docs to include libcugraphops as a build prerequisite (#3893) closes #3722 Updates the source build docs to include `libcugraphops` as a build prerequisite. Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3893 --- docs/cugraph/source/installation/source_build.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md index 7782591f1..f5ee0741d 100644 --- a/docs/cugraph/source/installation/source_build.md +++ b/docs/cugraph/source/installation/source_build.md @@ -6,10 +6,10 @@ The cuGraph package include both a C/C++ CUDA portion and a python portion. Bot ## Prerequisites -__Compiler__: -* `gcc` version 9.3+ -* `nvcc` version 11.0+ -* `cmake` version 3.20.1+ +__Compiler:__ +* `gcc` version 9.3+ +* `nvcc` version 11.0+ +* `cmake` version 3.20.1+ __CUDA:__ * CUDA 11.0+ @@ -18,6 +18,11 @@ __CUDA:__ You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). +__Packages:__ +* `cmake` version 3.20.1+ +* `libcugraphops` (version matching source branch version, eg. `23.10`) + +You can obtain `libcugraphops` using `conda`/`mamba` from the `nvidia` channel, or using `pip` with the `--extra-index-url=https://pypi.nvidia.com` option. See the [RAPIDS docs](https://docs.rapids.ai/install#environment) for more details. ## Building cuGraph To install cuGraph from source, ensure the dependencies are met. From 439739ecee3fdad581be65c137c050dc0c8ecb34 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 3 Oct 2023 16:50:10 -0500 Subject: [PATCH 269/384] nx-cugraph: handle louvain with isolated nodes (#3897) This handles isolated nodes in `louvain_communities` similar to what is done in #3886. This is expected to be a temporary fix until pylibcugraph can handle isolated nodes. As a bonus, I added `isolates` algorithm :tada: CC @naimnv @rlratzel Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3897 --- python/nx-cugraph/_nx_cugraph/__init__.py | 7 ++- python/nx-cugraph/lint.yaml | 2 +- .../nx_cugraph/algorithms/__init__.py | 1 + .../algorithms/community/louvain.py | 28 +++++++-- .../nx_cugraph/algorithms/isolate.py | 63 +++++++++++++++++++ .../nx-cugraph/nx_cugraph/classes/digraph.py | 2 +- python/nx-cugraph/nx_cugraph/classes/graph.py | 6 +- python/nx-cugraph/nx_cugraph/convert.py | 2 +- .../nx_cugraph/tests/test_community.py | 53 ++++++++++++++++ 9 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/isolate.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_community.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 9b3332106..ebd13dade 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -31,20 +31,23 @@ # BEGIN: functions "betweenness_centrality", "edge_betweenness_centrality", + "is_isolate", + "isolates", "louvain_communities", + "number_of_isolates", # END: functions }, "extra_docstrings": { # BEGIN: extra_docstrings "betweenness_centrality": "`weight` parameter is not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported.", - "louvain_communities": "`threshold` and `seed` parameters are currently ignored.", + "louvain_communities": "`seed` parameter is currently ignored.", # END: extra_docstrings }, "extra_parameters": { # BEGIN: extra_parameters "louvain_communities": { - "max_level : int, optional": "Upper limit of the number of macro-iterations.", + "max_level : int, optional": "Upper limit of the number of macro-iterations (max: 500).", }, # END: extra_parameters }, diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 6a462a6af..338ca7b23 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -63,7 +63,7 @@ repos: # These versions need updated manually - flake8==6.1.0 - flake8-bugbear==23.9.16 - - flake8-simplify==0.20.0 + - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa rev: v1.5.0 hooks: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 3a585452d..dfd9adfc6 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -12,3 +12,4 @@ # limitations under the License. from . import centrality, community from .centrality import * +from .isolate import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index a183b59fe..dc209870c 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -10,7 +10,7 @@ # 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. -import sys +import warnings import pylibcugraph as plc @@ -22,19 +22,23 @@ not_implemented_for, ) +from ..isolate import _isolates + __all__ = ["louvain_communities"] @not_implemented_for("directed") @networkx_algorithm( extra_params={ - "max_level : int, optional": "Upper limit of the number of macro-iterations." + "max_level : int, optional": ( + "Upper limit of the number of macro-iterations (max: 500)." + ) } ) def louvain_communities( G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None ): - """`threshold` and `seed` parameters are currently ignored.""" + """`seed` parameter is currently ignored.""" # NetworkX allows both directed and undirected, but cugraph only allows undirected. seed = _seed_to_int(seed) # Unused, but ensure it's valid for future compatibility G = _to_undirected_graph(G, weight) @@ -42,7 +46,14 @@ def louvain_communities( # TODO: PLC doesn't handle empty graphs gracefully! return [{key} for key in G._nodeiter_to_iter(range(len(G)))] if max_level is None: - max_level = sys.maxsize + max_level = 500 + elif max_level > 500: + warnings.warn( + f"max_level is set too high (={max_level}), setting it to 500.", + UserWarning, + stacklevel=2, + ) + max_level = 500 vertices, clusters, modularity = plc.louvain( resource_handle=plc.ResourceHandle(), graph=G._get_plc_graph(), @@ -52,7 +63,14 @@ def louvain_communities( do_expensive_check=False, ) groups = _groupby(clusters, vertices) - return [set(G._nodearray_to_list(node_ids)) for node_ids in groups.values()] + rv = [set(G._nodearray_to_list(node_ids)) for node_ids in groups.values()] + # TODO: PLC doesn't handle isolated vertices yet, so this is a temporary fix + isolates = _isolates(G) + if isolates.size > 0: + isolates = isolates[isolates > vertices.max()] + if isolates.size > 0: + rv.extend({node} for node in G._nodearray_to_list(isolates)) + return rv @louvain_communities._can_run diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py new file mode 100644 index 000000000..774627e84 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py @@ -0,0 +1,63 @@ +# 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. +from __future__ import annotations + +from typing import TYPE_CHECKING + +import cupy as cp + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import networkx_algorithm + +if TYPE_CHECKING: # pragma: no cover + from nx_cugraph.typing import IndexValue + +__all__ = ["is_isolate", "isolates", "number_of_isolates"] + + +@networkx_algorithm +def is_isolate(G, n): + G = _to_graph(G) + index = n if G.key_to_id is None else G.key_to_id[n] + return not ( + (G.row_indices == index).any().tolist() + or G.is_directed() + and (G.col_indices == index).any().tolist() + ) + + +def _mark_isolates(G) -> cp.ndarray[bool]: + """Return a boolean mask array indicating indices of isolated nodes.""" + mark_isolates = cp.ones(len(G), bool) + mark_isolates[G.row_indices] = False + if G.is_directed(): + mark_isolates[G.col_indices] = False + return mark_isolates + + +def _isolates(G) -> cp.ndarray[IndexValue]: + """Like isolates, but return an array of indices instead of an iterator of nodes.""" + G = _to_graph(G) + return cp.nonzero(_mark_isolates(G))[0] + + +@networkx_algorithm +def isolates(G): + G = _to_graph(G) + return G._nodeiter_to_iter(iter(_isolates(G).tolist())) + + +@networkx_algorithm +def number_of_isolates(G): + G = _to_graph(G) + return _mark_isolates(G).sum().tolist() diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index 0aaf88fd7..72a1bff21 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -20,7 +20,7 @@ from .graph import Graph -if TYPE_CHECKING: +if TYPE_CHECKING: # pragma: no cover from nx_cugraph.typing import NodeKey __all__ = ["DiGraph"] diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 1432f68c7..ded4cc394 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -23,7 +23,7 @@ import nx_cugraph as nxcg -if TYPE_CHECKING: +if TYPE_CHECKING: # pragma: no cover from collections.abc import Iterable, Iterator from nx_cugraph.typing import ( @@ -245,9 +245,9 @@ def from_dcsc( def __new__(cls, incoming_graph_data=None, **attr) -> Graph: if incoming_graph_data is None: new_graph = cls.from_coo(0, cp.empty(0, np.int32), cp.empty(0, np.int32)) - elif incoming_graph_data.__class__ is new_graph.__class__: + elif incoming_graph_data.__class__ is cls: new_graph = incoming_graph_data.copy() - elif incoming_graph_data.__class__ is new_graph.to_networkx_class(): + elif incoming_graph_data.__class__ is cls.to_networkx_class(): new_graph = nxcg.from_networkx(incoming_graph_data, preserve_all_attrs=True) else: raise NotImplementedError diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index 9be8cac78..1240ea71d 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -24,7 +24,7 @@ import nx_cugraph as nxcg -if TYPE_CHECKING: +if TYPE_CHECKING: # pragma: no cover from nx_cugraph.typing import AttrKey, Dtype, EdgeValue, NodeValue __all__ = [ diff --git a/python/nx-cugraph/nx_cugraph/tests/test_community.py b/python/nx-cugraph/nx_cugraph/tests/test_community.py new file mode 100644 index 000000000..126f45c14 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_community.py @@ -0,0 +1,53 @@ +# 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. +import networkx as nx +import pytest + +import nx_cugraph as nxcg + + +def test_louvain_isolated_nodes(): + is_nx_30_or_31 = hasattr(nx.classes, "backends") + + def check(left, right): + assert len(left) == len(right) + assert set(map(frozenset, left)) == set(map(frozenset, right)) + + # Empty graph (no nodes) + G = nx.Graph() + if is_nx_30_or_31: + with pytest.raises(ZeroDivisionError): + nx.community.louvain_communities(G) + else: + nx_result = nx.community.louvain_communities(G) + cg_result = nxcg.community.louvain_communities(G) + check(nx_result, cg_result) + # Graph with no edges + G.add_nodes_from(range(5)) + if is_nx_30_or_31: + with pytest.raises(ZeroDivisionError): + nx.community.louvain_communities(G) + else: + nx_result = nx.community.louvain_communities(G) + cg_result = nxcg.community.louvain_communities(G) + check(nx_result, cg_result) + # Graph with isolated nodes + G.add_edge(1, 2) + nx_result = nx.community.louvain_communities(G) + cg_result = nxcg.community.louvain_communities(G) + check(nx_result, cg_result) + # Another one + G.add_edge(4, 4) + nx_result = nx.community.louvain_communities(G) + cg_result = nxcg.community.louvain_communities(G) + check(nx_result, cg_result) From c3b9d9712ea9ee6741a63dcc1462fc058db38375 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 6 Oct 2023 12:18:24 -0500 Subject: [PATCH 270/384] Adds benchmarks for `nx-cugraph` (#3854) closes rapidsai/graph_dl#299 This PR adds new benchmarks for `nx-cugraph` which can be used to compare performance for NetworkX with and without the `cugraph` backend. These benchmarks depend on `pytest`, `pytest-benchmark`, `networkx>=3.0`, `cugraph` (only for the Dataset APIs), and `nx-cugraph` Some results can be seen here: ![image](https://github.com/rapidsai/cugraph/assets/3039903/d595eb3f-2ae6-4b2e-a0b1-a0f0bcb050a8) ![image](https://github.com/rapidsai/cugraph/assets/3039903/3ca367b4-14b8-4673-91d2-f83a947163e7) ### Other changes: * `black` is now run on all python sources under `benchmarks`, which resulted in several format-only changes. * Several other updates to versions, etc. were applied to various .yaml files in order to resolve CI errors. * Merged in changes from [jnke2016/branch-23.10_increase-timeout](https://github.com/rapidsai/cugraph/pull/3854/commits/cbdbd8a6d22903f251c64b1b0321ba41ec03fcb3) to get changes needed to fix dask CI failure. Authors: - Rick Ratzel (https://github.com/rlratzel) - Joseph Nke (https://github.com/jnke2016) - AJ Schmidt (https://github.com/ajschmidt8) - Naim (https://github.com/naimnv) - Seunghwa Kang (https://github.com/seunghwak) - https://github.com/lmeyerov - Erik Welch (https://github.com/eriknw) - Alex Barghi (https://github.com/alexbarghi-nv) - Vyas Ramasubramani (https://github.com/vyasr) - Divye Gala (https://github.com/divyegala) - Tingyu Wang (https://github.com/tingyu66) - Chuck Hastings (https://github.com/ChuckHastings) - ralph (https://github.com/nv-rliu) - Paul Taylor (https://github.com/trxcllnt) Approvers: - Erik Welch (https://github.com/eriknw) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/3854 --- .pre-commit-config.yaml | 2 +- .../nx-cugraph/pytest-based/bench_algos.py | 212 ++++++++++++++++++ benchmarks/pytest.ini | 4 +- python/nx-cugraph/_nx_cugraph/__init__.py | 2 +- 4 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 benchmarks/nx-cugraph/pytest-based/bench_algos.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 865d06b20..bab39557c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: - id: black language_version: python3 args: [--target-version=py38] - files: ^python/ + files: ^(python/.*|benchmarks/.*)$ - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 hooks: diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py new file mode 100644 index 000000000..971c3ff10 --- /dev/null +++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py @@ -0,0 +1,212 @@ +# 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. + +import networkx as nx +import pandas as pd +import pytest +from cugraph import datasets + +# FIXME: promote these to cugraph.datasets so the following steps aren't +# necessary +# +# These datasets can be downloaded using the script in the 'datasets' dir: +# +# cd /datasets +# ./get_test_data.sh --benchmark +# +# Then set the following env var so the dataset utils can find their location: +# +# export RAPIDS_DATASET_ROOT_DIR=/datasets +# +from cugraph_benchmarking.params import ( + hollywood, + europe_osm, + cit_patents, + soc_livejournal, +) + +# Attempt to import the NetworkX dispatching module, which is only needed when +# testing with NX <3.2 in order to dynamically switch backends. NX >=3.2 allows +# the backend to be specified directly in the API call. +try: + from networkx.classes import backends # NX <3.2 +except ImportError: + backends = None + + +################################################################################ +# Fixtures and helpers +backend_params = ["cugraph", None] + +dataset_params = [ + pytest.param(datasets.karate, marks=[pytest.mark.small, pytest.mark.undirected]), + pytest.param(datasets.netscience, marks=[pytest.mark.small, pytest.mark.directed]), + pytest.param( + datasets.email_Eu_core, marks=[pytest.mark.small, pytest.mark.directed] + ), + pytest.param(cit_patents, marks=[pytest.mark.medium, pytest.mark.directed]), + pytest.param(hollywood, marks=[pytest.mark.medium, pytest.mark.undirected]), + pytest.param(europe_osm, marks=[pytest.mark.medium, pytest.mark.undirected]), + pytest.param(soc_livejournal, marks=[pytest.mark.large, pytest.mark.directed]), +] + + +def nx_graph_from_dataset(dataset_obj): + """ + Read the dataset specified by the dataset_obj and create and return a + nx.Graph or nx.DiGraph instance based on the dataset is_directed metadata. + """ + create_using = nx.DiGraph if dataset_obj.metadata["is_directed"] else nx.Graph + names = dataset_obj.metadata["col_names"] + dtypes = dataset_obj.metadata["col_types"] + if isinstance(dataset_obj.metadata["header"], int): + header = dataset_obj.metadata["header"] + else: + header = None + + pandas_edgelist = pd.read_csv( + dataset_obj.get_path(), + delimiter=dataset_obj.metadata["delim"], + names=names, + dtype=dict(zip(names, dtypes)), + header=header, + ) + G = nx.from_pandas_edgelist( + pandas_edgelist, source=names[0], target=names[1], create_using=create_using + ) + return G + + +# Test IDs are generated using the lambda assigned to the ids arg to provide an +# easier-to-read name from the Dataset obj string repr. +# See: https://docs.pytest.org/en/stable/reference/reference.html#pytest-fixture +@pytest.fixture(scope="module", params=dataset_params, ids=lambda ds: f"ds={str(ds)}") +def graph_obj(request): + """ + Returns a NX Graph or DiGraph obj from the dataset instance parameter. + """ + dataset = request.param + return nx_graph_from_dataset(dataset) + + +def get_legacy_backend_selector(backend_name): + """ + Returns a callable that wraps an algo function with either the default + dispatch decorator, or the "testing" decorator which unconditionally + dispatches. + This is only supported for NetworkX <3.2 + """ + backends.plugin_name = "cugraph" + orig_dispatch = backends._dispatch + testing_dispatch = backends.test_override_dispatch + + # Testing with the networkx <3.2 dispatch mechanism is based on decorating + # networkx APIs. The decorator is either one that only uses a backend if + # the input graph type is for that backend (the default decorator), or the + # "testing" decorator, which unconditionally converts a graph type to the + # type needed by the backend then calls the backend. If the cugraph backend + # is specified, create a callable that decorates the benchmarked function + # with the testing decorator. + # + # Because both the default and testing decorators assume they are only + # applied once and do bookkeeping to ensure algos are not registered + # multiple times, the callable also clears bookkeeping so the decorators + # can be reapplied multiple times. This is obviously a hack and networkx + # >=3.2 makes this use case properly supported. + if backend_name == "cugraph": + + def wrapper(*args, **kwargs): + backends._registered_algorithms = {} + return testing_dispatch(*args, **kwargs) + + else: + + def wrapper(*args, **kwargs): + backends._registered_algorithms = {} + return orig_dispatch(*args, **kwargs) + + return wrapper + + +def get_backend_selector(backend_name): + """ + Returns a callable that wraps an algo function in order to set the + "backend" kwarg on it. + This is only supported for NetworkX >= 3.2 + """ + + def get_callable_for_func(func): + def wrapper(*args, **kwargs): + kwargs["backend"] = backend_name + return func(*args, **kwargs) + + return wrapper + + return get_callable_for_func + + +@pytest.fixture( + scope="module", params=backend_params, ids=lambda backend: f"backend={backend}" +) +def backend_selector(request): + """ + Returns a callable that takes a function algo and wraps it in another + function that calls the algo using the appropriate backend. + """ + backend_name = request.param + if backends is not None: + return get_legacy_backend_selector(backend_name) + else: + return get_backend_selector(backend_name) + + +################################################################################ +# Benchmarks +normalized_params = [True, False] +k_params = [10, 100] + + +@pytest.mark.parametrize("normalized", normalized_params, ids=lambda norm: f"{norm=}") +@pytest.mark.parametrize("k", k_params, ids=lambda k: f"{k=}") +def bench_betweenness_centrality(benchmark, graph_obj, backend_selector, normalized, k): + result = benchmark( + backend_selector(nx.betweenness_centrality), + graph_obj, + weight=None, + normalized=normalized, + k=k, + ) + assert type(result) is dict + + +@pytest.mark.parametrize("normalized", normalized_params, ids=lambda norm: f"{norm=}") +def bench_edge_betweenness_centrality( + benchmark, graph_obj, backend_selector, normalized +): + result = benchmark( + backend_selector(nx.edge_betweenness_centrality), + graph_obj, + weight=None, + normalized=normalized, + ) + assert type(result) is dict + + +def bench_louvain_communities(benchmark, graph_obj, backend_selector): + # The cugraph backend for louvain_communities only supports undirected graphs + if isinstance(graph_obj, nx.DiGraph): + G = graph_obj.to_undirected() + else: + G = graph_obj + result = benchmark(backend_selector(nx.community.louvain_communities), G) + assert type(result) is list diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 6af3aab27..b3d8a8bb3 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -14,8 +14,10 @@ markers = managedmem_off: RMM managed memory disabled poolallocator_on: RMM pool allocator enabled poolallocator_off: RMM pool allocator disabled - small: small datasets tiny: tiny datasets + small: small datasets + medium: medium datasets + large: large datasets directed: directed datasets undirected: undirected datasets matrix_types: inputs are matrices diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 9b3332106..ba7fe5e91 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -75,7 +75,7 @@ def get_info(): return d -__version__ = "23.10.00" +__version__ = "23.12.00" if __name__ == "__main__": from pathlib import Path From ea39d0fc51647861f2d065d40eda3f004fdac18b Mon Sep 17 00:00:00 2001 From: Jake Awe <50372925+AyodeAwe@users.noreply.github.com> Date: Wed, 11 Oct 2023 08:16:36 -0500 Subject: [PATCH 271/384] Link wholegrah and cugraphops XML docs (#3906) Configures `breathe` and links the uploaded `wholegraph` and `cugraph-ops` XML docs artifacts. Authors: - Jake Awe (https://github.com/AyodeAwe) Approvers: - Brad Rees (https://github.com/BradReesWork) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/3906 --- docs/cugraph/source/conf.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 58ecca271..470086b4f 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -37,6 +37,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ + "breathe", "sphinx.ext.intersphinx", "sphinx.ext.autodoc", "sphinx.ext.autosummary", @@ -205,4 +206,10 @@ 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}" -) \ No newline at end of file +) + +breathe_projects = { + 'libcugraphops': os.environ['XML_DIR_LIBCUGRAPHOPS'], + 'libwholegraph': os.environ['XML_DIR_LIBWHOLEGRAPH'] +} +breathe_default_project = "libcugraph" From d525a79e9113c37ad77f676abf65bea9fcac4e3d Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Wed, 11 Oct 2023 14:08:24 -0400 Subject: [PATCH 272/384] REL v23.10.00 release From eb6a3b496bd3327e46ed43994fe0181eea409fb1 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Thu, 12 Oct 2023 12:57:24 -0700 Subject: [PATCH 273/384] TODO: revert this commit for re-running ci --- print_env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/print_env.sh b/print_env.sh index 6f2d33b0e..f117efb3b 100644 --- a/print_env.sh +++ b/print_env.sh @@ -84,4 +84,4 @@ echo " " print_env | while read -r line; do echo " $line" done -echo "" +echo "" From 6aaa6ad94c0b6592a4d6c41a9bdedfed9793dbdf Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Thu, 12 Oct 2023 12:57:46 -0700 Subject: [PATCH 274/384] DONE: reverted to re-run ci --- print_env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/print_env.sh b/print_env.sh index f117efb3b..6f2d33b0e 100644 --- a/print_env.sh +++ b/print_env.sh @@ -84,4 +84,4 @@ echo " " print_env | while read -r line; do echo " $line" done -echo "" +echo "" From f50791842f0d3e39f91c1ed4e10826c461bd323b Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Mon, 16 Oct 2023 09:44:21 -0400 Subject: [PATCH 275/384] Updating Docs (#3923) starting with all the packages in a table Authors: - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3923 --- docs/cugraph/source/images/cugraph_logo_2.png | Bin 0 -> 4952011 bytes docs/cugraph/source/index.rst | 49 +++++++++++++----- 2 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 docs/cugraph/source/images/cugraph_logo_2.png diff --git a/docs/cugraph/source/images/cugraph_logo_2.png b/docs/cugraph/source/images/cugraph_logo_2.png new file mode 100644 index 0000000000000000000000000000000000000000..62dd79c4b988ad58771e893c117b6e0a3b2c7074 GIT binary patch literal 4952011 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

rp2Dp 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 z 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𝔍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 z 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

!vo>l|fD5q&$q<55duT4JbV;+7#!Gx~KVB(b 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%0AmZ_rb~N9K(;X14mRbDvCB}2n#PMmI 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

k{X)4vDN<9Np*6WL*L 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

_BCZ{TpC5+Q~Hi%ex^HLtoo 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 Q}QmWiTF2df0Oq(^wbWRE!~vc{PW%A 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�wy>x*gU#-!W)%xi4wLt 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

g##_C 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

_zSQIyTZjXnvQ`DqY}WVzhZ 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%0Db?qu9e$P3na@>1EY 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≫`y%hM=5`b(1}EoBi@ryca>%qq}rHsn|p5 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

2qzX?@q$hwUS@R@ld+l^&c7qsa*5C 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

<=OMLJ? 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 Dm(Bgel67uGR& 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

<97g@cX-LyEe{Mi5T1oM9y#UIH&^ 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

-NE11M%(xn?UHszIQ4R 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�p|8@0u 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 i6wP>1l&+pYPt`w! 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 sSRSi7Ig5WmQ`VZOl{G0&O1u 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
cGyk?NnM8NIBP=y}u8? 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

LW;Z9&0AZ?E%Fo;g_i@FnywZ$m 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

Wvh>+84i) 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 Date: Tue, 17 Oct 2023 06:28:14 -0400 Subject: [PATCH 276/384] Updates to 23.12 (#3905) A couple PRs were merged after `branch-23.12` was created and contained RAPIDS versions that need to be updated in `branch-23.12`. Ref: - https://github.com/rapidsai/cugraph/pull/3838 - https://github.com/rapidsai/cugraph/pull/3852 Authors: - Ray Douglass (https://github.com/raydouglass) - Rick Ratzel (https://github.com/rlratzel) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3905 --- python/nx-cugraph/_nx_cugraph/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 227caea29..886d7a19f 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -24,7 +24,7 @@ "backend_name": "cugraph", "project": "nx-cugraph", "package": "nx_cugraph", - "url": "https://github.com/rapidsai/cugraph/tree/branch-23.10/python/nx-cugraph", + "url": "https://github.com/rapidsai/cugraph/tree/branch-23.12/python/nx-cugraph", "short_summary": "GPU-accelerated backend.", # "description": "TODO", "functions": { From a92d2f28db1db771277a2ae94d62e20a1ecb6578 Mon Sep 17 00:00:00 2001 From: Dylan Chima-Sanchez <97180625+betochimas@users.noreply.github.com> Date: Tue, 17 Oct 2023 07:22:59 -0700 Subject: [PATCH 277/384] Add nx-cugraph notebook for showing accelerated networkX APIs (#3830) This PR adds a notebook showing how to use the `nx-cugraph` package to accelerate your NetworkX workflow. closes rapidsai/graph_dl#277 Authors: - Dylan Chima-Sanchez (https://github.com/betochimas) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/3830 --- notebooks/demo/nx_cugraph_demo.ipynb | 672 +++++++++++++++++++++++++++ 1 file changed, 672 insertions(+) create mode 100644 notebooks/demo/nx_cugraph_demo.ipynb diff --git a/notebooks/demo/nx_cugraph_demo.ipynb b/notebooks/demo/nx_cugraph_demo.ipynb new file mode 100644 index 000000000..6e50370ed --- /dev/null +++ b/notebooks/demo/nx_cugraph_demo.ipynb @@ -0,0 +1,672 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `nx-cugraph`: a NetworkX backend that provides GPU acceleration with RAPIDS cuGraph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook will demonstrate the `nx-cugraph` NetworkX backend using the NetworkX betweenness_centrality algorithm.\n", + "\n", + "## Background\n", + "Networkx version 3.0 introduced a dispatching mechanism that allows users to configure NetworkX to dispatch various algorithms to third-party backends. Backends can provide different implementations of graph algorithms, allowing users to take advantage of capabilities not available in NetworkX. `nx-cugraph` is a NetworkX backend provided by the [RAPIDS](https://rapids.ai) cuGraph project that adds GPU acceleration to greatly improve performance.\n", + "\n", + "## System Requirements\n", + "Using `nx-cugraph` with this notebook requires the following: \n", + "- NVIDIA GPU, Pascal architecture or later\n", + "- CUDA 11.2, 11.4, 11.5, 11.8, or 12.0\n", + "- Python versions 3.9, 3.10, or 3.11\n", + "- NetworkX >= version 3.2\n", + " - _NetworkX 3.0 supports dispatching and is compatible with `nx-cugraph`, but this notebook will demonstrate features added in 3.2_\n", + " - At the time of this writing, NetworkX 3.2 is only available from source and can be installed by following the [development version install instructions](https://github.com/networkx/networkx/blob/main/INSTALL.rst#install-the-development-version).\n", + "- Pandas\n", + "\n", + "More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Assuming NetworkX >= 3.2 has been installed using the [development version install instructions](https://github.com/networkx/networkx/blob/main/INSTALL.rst#install-the-development-version), `nx-cugraph` can be installed using either `conda` or `pip`. \n", + "\n", + "#### conda\n", + "```\n", + "conda install -c rapidsai-nightly -c conda-forge -c nvidia nx-cugraph\n", + "```\n", + "#### pip\n", + "```\n", + "python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.nvidia.com\n", + "```\n", + "#### _Notes:_\n", + " * nightly wheel builds will not be available until the 23.12 release, therefore the index URL for the stable release version is being used in the pip install command above.\n", + " * Additional information relevant to installing any RAPIDS package can be found [here](https://rapids.ai/#quick-start).\n", + " * If you installed any of the packages described here since running this notebook, you may need to restart the kernel to have them visible to this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Notebook Helper Functions\n", + "\n", + "A few helper functions will be defined here that will be used in order to help keep this notebook easy to read." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "def reimport_networkx():\n", + " \"\"\"\n", + " Re-imports networkx for demonstrating different backend configuration\n", + " options applied at import-time. This is only needed for demonstration\n", + " purposes since other mechanisms are available for runtime configuration.\n", + " \"\"\"\n", + " # Using importlib.reload(networkx) has several caveats (described here:\n", + " # https://docs.python.org/3/library/imp.html?highlight=reload#imp.reload)\n", + " # which result in backend configuration not being re-applied correctly.\n", + " # Instead, manually remove all modules and re-import\n", + " nx_mods = [m for m in sys.modules.keys()\n", + " if (m.startswith(\"networkx\") or m.startswith(\"nx_cugraph\"))]\n", + " for m in nx_mods:\n", + " sys.modules.pop(m)\n", + " import networkx\n", + " return networkx\n", + "\n", + "\n", + "from pathlib import Path\n", + "import requests\n", + "import gzip\n", + "import pandas as pd\n", + "def create_cit_patents_graph(verbose=True):\n", + " \"\"\"\n", + " Downloads the cit-Patents dataset (if not previously downloaded), reads\n", + " it, and creates a nx.DiGraph from it and returns it.\n", + " cit-Patents is described here:\n", + " https://snap.stanford.edu/data/cit-Patents.html\n", + " \"\"\"\n", + " url = \"https://snap.stanford.edu/data/cit-Patents.txt.gz\"\n", + " gz_file_name = Path(url.split(\"/\")[-1])\n", + " csv_file_name = Path(gz_file_name.stem)\n", + " if csv_file_name.exists():\n", + " if verbose: print(f\"{csv_file_name} already exists, not downloading.\")\n", + " else:\n", + " if verbose: print(f\"downloading {url}...\", end=\"\", flush=True)\n", + " req = requests.get(url)\n", + " open(gz_file_name, \"wb\").write(req.content)\n", + " if verbose: print(\"done\")\n", + " if verbose: print(f\"unzipping {gz_file_name}...\", end=\"\", flush=True)\n", + " with gzip.open(gz_file_name, \"rb\") as gz_in:\n", + " with open(csv_file_name, \"wb\") as txt_out:\n", + " txt_out.write(gz_in.read())\n", + " if verbose: print(\"done\")\n", + "\n", + " if verbose: print(\"reading csv to dataframe...\", end=\"\", flush=True)\n", + " pandas_edgelist = pd.read_csv(\n", + " csv_file_name.name,\n", + " skiprows=4,\n", + " delimiter=\"\\t\",\n", + " names=[\"src\", \"dst\"],\n", + " dtype={\"src\":\"int32\", \"dst\":\"int32\"},\n", + " )\n", + " if verbose: print(\"done\")\n", + " if verbose: print(\"creating NX graph from dataframe...\", end=\"\", flush=True)\n", + " G = nx.from_pandas_edgelist(\n", + " pandas_edgelist, source=\"src\", target=\"dst\", create_using=nx.DiGraph\n", + " )\n", + " if verbose: print(\"done\")\n", + " return G" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Running `betweenness_centrality`\n", + "Let's start by running `betweenness_centrality` on the Karate Club graph using the default NetworkX implementation." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Zachary's Karate Club\n", + "\n", + "Zachary's Karate Club is a small dataset consisting of 34 nodes and 78 edges which represent the friendships between members of a karate club. This dataset is small enough to make comparing results between NetworkX and `nx-cugraph` easy." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "karate_club_graph = nx.karate_club_graph()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Having NetworkX compute the `betweenness_centrality` values for each node on this graph is quick and easy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.51 ms ± 1.02 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "%%timeit global karate_nx_bc_results\n", + "karate_nx_bc_results = nx.betweenness_centrality(karate_club_graph)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Automatic GPU acceleration\n", + "When `nx-cugraph` is installed, NetworkX will detect it on import and make it available as a backend for APIs supported by that backend. However, NetworkX does not assume the user always wants to use a particular backend, and instead looks at various configuration mechanisms in place for users to specify how NetworkX should use installed backends. Since NetworkX was not configured to use a backend for the above `betweenness_centrality` call, it used the default implementation provided by NetworkX.\n", + "\n", + "The first configuration mechanism to be demonstrated below is the `NETWORKX_AUTOMATIC_BACKENDS` environment variable. This environment variable directs NetworkX to use the backend specified everywhere it's supported and does not require the user to modify any of their existing NetworkX code.\n", + "\n", + "To use it, a user sets `NETWORKX_AUTOMATIC_BACKENDS` in their shell to the backend they'd like to use. If a user has more than one backend installed, the environment variable can also accept a comma-separated list of backends, ordered by priority in which NetworkX should use them, where the first backend that supports a particular API call will be used. For example:\n", + "```\n", + "bash> export NETWORKX_AUTOMATIC_BACKENDS=cugraph\n", + "bash> python my_nx_app.py # uses nx-cugraph wherever possible, then falls back to default implementation where it's not.\n", + "```\n", + "or in the case of multiple backends installed\n", + "```\n", + "bash> export NETWORKX_AUTOMATIC_BACKENDS=cugraph,graphblas\n", + "bash> python my_nx_app.py # uses nx-cugraph if possible, then nx-graphblas if possible, then default implementation.\n", + "```\n", + "\n", + "NetworkX looks at the environment variable and the installed backends at import time, and will not re-examine the environment after that. Because `networkx` was already imported in this notebook, the `reimport_nx()` utility will be called after the `os.environ` dictionary is updated to simulate an environment variable being set in the shell.\n", + "\n", + "**Please note, this is only needed for demonstration purposes to compare runs both with and without fully-automatic backend use enabled.**" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"NETWORKX_AUTOMATIC_BACKENDS\"] = \"cugraph\"\n", + "nx = reimport_networkx()\n", + "# reimporting nx requires reinstantiating Graphs since python considers\n", + "# types from the prior nx import != types from the reimported nx\n", + "karate_club_graph = nx.karate_club_graph()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Once the environment is updated, re-running the same `betweenness_centrality` call on the same graph requires no code changes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "43.9 ms ± 222 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit global karate_cg_bc_results\n", + "karate_cg_bc_results = nx.betweenness_centrality(karate_club_graph)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "We may see that the same computation actually took *longer* using `nx-cugraph`. This is not too surprising given how small the graph is, since there's a small amount of overhead to copy data to and from the GPU which becomes more obvious on very small graphs. We'll see with a larger graph how this overhead becomes negligible." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Results Comparison\n", + "\n", + "Let's examine the results of each run to see how they compare. \n", + "The `betweenness_centrality` results are a dictionary mapping vertex IDs to betweenness_centrality scores. The score itself is usually not as important as the relative rank of each vertex ID (e.g. vertex A is ranked higher than vertex B in both sets of results)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NX: (0, 0.437635), CG: (0, 0.437635)\n", + "NX: (33, 0.304075), CG: (33, 0.304075)\n", + "NX: (32, 0.145247), CG: (32, 0.145247)\n", + "NX: (2, 0.143657), CG: (2, 0.143657)\n", + "NX: (31, 0.138276), CG: (31, 0.138276)\n", + "NX: (8, 0.055927), CG: (8, 0.055927)\n", + "NX: (1, 0.053937), CG: (1, 0.053937)\n", + "NX: (13, 0.045863), CG: (13, 0.045863)\n", + "NX: (19, 0.032475), CG: (19, 0.032475)\n", + "NX: (5, 0.029987), CG: (5, 0.029987)\n", + "NX: (6, 0.029987), CG: (6, 0.029987)\n", + "NX: (27, 0.022333), CG: (27, 0.022333)\n", + "NX: (23, 0.017614), CG: (23, 0.017614)\n", + "NX: (30, 0.014412), CG: (30, 0.014412)\n", + "NX: (3, 0.011909), CG: (3, 0.011909)\n", + "NX: (25, 0.003840), CG: (25, 0.003840)\n", + "NX: (29, 0.002922), CG: (29, 0.002922)\n", + "NX: (24, 0.002210), CG: (24, 0.002210)\n", + "NX: (28, 0.001795), CG: (28, 0.001795)\n", + "NX: (9, 0.000848), CG: (9, 0.000848)\n", + "NX: (4, 0.000631), CG: (4, 0.000631)\n", + "NX: (10, 0.000631), CG: (10, 0.000631)\n", + "NX: (7, 0.000000), CG: (7, 0.000000)\n", + "NX: (11, 0.000000), CG: (11, 0.000000)\n", + "NX: (12, 0.000000), CG: (12, 0.000000)\n", + "NX: (14, 0.000000), CG: (14, 0.000000)\n", + "NX: (15, 0.000000), CG: (15, 0.000000)\n", + "NX: (16, 0.000000), CG: (16, 0.000000)\n", + "NX: (17, 0.000000), CG: (17, 0.000000)\n", + "NX: (18, 0.000000), CG: (18, 0.000000)\n", + "NX: (20, 0.000000), CG: (20, 0.000000)\n", + "NX: (21, 0.000000), CG: (21, 0.000000)\n", + "NX: (22, 0.000000), CG: (22, 0.000000)\n", + "NX: (26, 0.000000), CG: (26, 0.000000)\n" + ] + } + ], + "source": [ + "# The lists contain tuples of (vertex ID, betweenness_centrality score),\n", + "# sorted based on the score.\n", + "nx_sorted = sorted(karate_nx_bc_results.items(), key=lambda t:t[1], reverse=True)\n", + "cg_sorted = sorted(karate_cg_bc_results.items(), key=lambda t:t[1], reverse=True)\n", + "\n", + "for i in range(len(nx_sorted)):\n", + " print(\"NX: (%d, %.6f), CG: (%d, %.6f)\" % (nx_sorted[i] + cg_sorted[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Here we can see that the results match exactly as expected. \n", + "\n", + "For larger graphs, results are harder to compare given that `betweenness_centrality` is an approximation algorithm influenced by the random selection of paths used to compute the betweenness_centrality score of each vertex. The argument `k` is used for limiting the number of paths used in the computation, since using every path for every vertex would be prohibitively expensive for large graphs. For small graphs, `k` need not be specified, which allows `betweenness_centrality` to use all paths for all vertices and makes for an easier comparison." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### `betweenness_centrality` on larger graphs - The U.S. Patent Citation Network1\n", + "\n", + "The U.S. Patent Citation Network dataset is much larger with over 3.7M nodes and over 16.5M edges and demonstrates how `nx-cugraph` enables NetworkX to run `betweenness_centrality` on graphs this large (and larger) in seconds instead of minutes.\n", + "\n", + "#### NetworkX default implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "downloading https://snap.stanford.edu/data/cit-Patents.txt.gz...done\n", + "unzipping cit-Patents.txt.gz...done\n", + "reading csv to dataframe...done\n", + "creating NX graph from dataframe...done\n" + ] + } + ], + "source": [ + "import os\n", + "# Unset NETWORKX_AUTOMATIC_BACKENDS so the default NetworkX implementation is used\n", + "os.environ.pop(\"NETWORKX_AUTOMATIC_BACKENDS\", None)\n", + "nx = reimport_networkx()\n", + "# Create the cit-Patents graph - this will also download the dataset if not previously downloaded\n", + "cit_patents_graph = create_cit_patents_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Since this is a large graph, a k value must be set so the computation returns in a reasonable time\n", + "k = 40" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Because this run will take time, `%%timeit` is restricted to a single pass.\n", + "\n", + "*NOTE: this run may take approximately 1 minute*" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1min 4s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 1\n", + "results = nx.betweenness_centrality(cit_patents_graph, k=k)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Something to note is that `%%timeit` disables garbage collection by default, which may not be something a user is able to do. To see a more realistic real-world run time, `gc` can be enabled." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# import and run the garbage collector upfront prior to using it in the benchmark\n", + "import gc\n", + "gc.collect()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*NOTE: this run may take approximately 7 minutes!*" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6min 50s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 1 gc.enable()\n", + "nx.betweenness_centrality(cit_patents_graph, k=k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `nx-cugraph`\n", + "\n", + "Running on a GPU using `nx-cugraph` can result in a tremendous speedup, especially when graphs reach sizes larger than a few thousand nodes or `k` values become larger to increase accuracy.\n", + "\n", + "Rather than setting the `NETWORKX_AUTOMATIC_BACKENDS` environment variable and re-importing again, this example will demonstrate the `backend=` keyword argument to explicitly direct the NetworkX dispatcher to use the `cugraph` backend." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10.1 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 1 gc.enable()\n", + "nx.betweenness_centrality(cit_patents_graph, k=k, backend=\"cugraph\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "k = 150" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11.6 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 1 gc.enable()\n", + "nx.betweenness_centrality(cit_patents_graph, k=k, backend=\"cugraph\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "For the same graph and the same `k` value, the `\"cugraph\"` backend returns results in seconds instead of minutes. Increasing the `k` value has very little relative impact to runtime due to the high parallel processing ability of the GPU, allowing the user to get improved accuracy for virtually no additional cost." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Type-based dispatching\n", + "\n", + "NetworkX also supports automatically dispatching to backends associated with specific graph types. This requires the user to write code for a specific backend, and therefore requires the backend to be installed, but has the advantage of ensuring a particular behavior without the potential for runtime conversions.\n", + "\n", + "To use type-based dispatching with `nx-cugraph`, the user must import the backend directly in their code to access the utilities provided to create a Graph instance specifically for the `nx-cugraph` backend." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "import nx_cugraph as nxcg" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "The `from_networkx()` API will copy the data from the NetworkX graph instance to the GPU and return a new `nx-cugraph` graph instance. By passing an explicit `nx-cugraph` graph, the NetworkX dispatcher will automatically call the `\"cugraph\"` backend (and only the `\"cugraph\"` backend) without requiring future conversions to copy data to the GPU." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7.92 s ± 2.85 ms per loop (mean ± std. dev. of 2 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 2 global nxcg_cit_patents_graph\n", + "nxcg_cit_patents_graph = nxcg.from_networkx(cit_patents_graph)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.14 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit -r 1 gc.enable()\n", + "nx.betweenness_centrality(nxcg_cit_patents_graph, k=k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "This notebook demonstrated `nx-cugraph`'s support for `betweenness_centrality`. At the time of this writing, `nx-cugraph` also provides support for `edge_netweenness_centrality` and `louvain_communities`. Other algorithms are scheduled to be supported based on their availability in the cuGraph [pylibcugraph](https://github.com/rapidsai/cugraph/tree/branch-23.10/python/pylibcugraph/pylibcugraph) package and demand by the NetworkX community.\n", + "\n", + "#### Benchmark Results\n", + "The results included in this notebook were generated on a workstation with the following hardware:\n", + "\n", + "\n", + " \n", + " \n", + "
CPU:Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz, 45GB
GPU:Quatro RTX 8000, 50GB
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1 Information on the U.S. Patent Citation Network dataset used in this notebook is as follows:\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
Authors:Jure Leskovec and Andrej Krevl
Title:SNAP Datasets, Stanford Large Network Dataset Collection
URL:http://snap.stanford.edu/data
Date:June 2014
\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 565be2f11e667db5c4bfd952af1c1a0937940c26 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 17 Oct 2023 23:06:00 -0500 Subject: [PATCH 278/384] Add multigraph support to nx-cugraph (#3934) Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3934 --- python/nx-cugraph/lint.yaml | 14 +- .../nx-cugraph/nx_cugraph/classes/__init__.py | 2 + python/nx-cugraph/nx_cugraph/classes/graph.py | 28 +- .../nx_cugraph/classes/multidigraph.py | 30 ++ .../nx_cugraph/classes/multigraph.py | 453 ++++++++++++++++++ python/nx-cugraph/nx_cugraph/convert.py | 167 +++++-- python/nx-cugraph/nx_cugraph/interface.py | 12 +- .../nx_cugraph/tests/bench_convert.py | 16 +- .../nx_cugraph/tests/test_convert.py | 39 +- .../nx_cugraph/tests/test_multigraph.py | 72 +++ python/nx-cugraph/pyproject.toml | 3 +- 11 files changed, 750 insertions(+), 86 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/classes/multidigraph.py create mode 100644 python/nx-cugraph/nx_cugraph/classes/multigraph.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_multigraph.py diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 338ca7b23..4f604fbeb 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -11,7 +11,7 @@ default_language_version: python: python3 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-added-large-files - id: check-case-conflict @@ -26,7 +26,7 @@ repos: - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.14 + rev: v0.15 hooks: - id: validate-pyproject name: Validate pyproject.toml @@ -40,7 +40,7 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.13.0 + rev: v3.15.0 hooks: - id: pyupgrade args: [--py39-plus] @@ -50,7 +50,7 @@ repos: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.291 + rev: v0.0.292 hooks: - id: ruff args: [--fix-only, --show-fixes] @@ -70,18 +70,18 @@ repos: - id: yesqa additional_dependencies: *flake8_dependencies - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.2.6 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.0.291 + rev: v0.0.292 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: no-commit-to-branch args: [-p, "^branch-2....$"] diff --git a/python/nx-cugraph/nx_cugraph/classes/__init__.py b/python/nx-cugraph/nx_cugraph/classes/__init__.py index e47641ae8..9916bcbe2 100644 --- a/python/nx-cugraph/nx_cugraph/classes/__init__.py +++ b/python/nx-cugraph/nx_cugraph/classes/__init__.py @@ -11,5 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from .graph import Graph +from .multigraph import MultiGraph from .digraph import DiGraph # isort:skip +from .multidigraph import MultiDiGraph # isort:skip diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index ded4cc394..f1e85c836 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -43,7 +43,8 @@ class Graph: # Tell networkx to dispatch calls with this object to nx-cugraph - __networkx_plugin__: ClassVar[str] = "cugraph" + __networkx_backend__: ClassVar[str] = "cugraph" # nx >=3.2 + __networkx_plugin__: ClassVar[str] = "cugraph" # nx <3.2 # networkx properties graph: dict @@ -58,7 +59,7 @@ class Graph: node_values: dict[AttrKey, cp.ndarray[NodeValue]] node_masks: dict[AttrKey, cp.ndarray[bool]] key_to_id: dict[NodeKey, IndexValue] | None - _id_to_key: dict[IndexValue, NodeKey] | None + _id_to_key: list[NodeKey] | None _N: int #################### @@ -77,7 +78,7 @@ def from_coo( node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, - id_to_key: dict[IndexValue, NodeKey] | None = None, + id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: new_graph = object.__new__(cls) @@ -88,7 +89,7 @@ def from_coo( new_graph.node_values = {} if node_values is None else dict(node_values) new_graph.node_masks = {} if node_masks is None else dict(node_masks) new_graph.key_to_id = None if key_to_id is None else dict(key_to_id) - new_graph._id_to_key = None if id_to_key is None else dict(id_to_key) + new_graph._id_to_key = None if id_to_key is None else list(id_to_key) new_graph._N = op.index(N) # Ensure N is integral new_graph.graph = new_graph.graph_attr_dict_factory() new_graph.graph.update(attr) @@ -123,7 +124,7 @@ def from_csr( node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, - id_to_key: dict[IndexValue, NodeKey] | None = None, + id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: N = indptr.size - 1 @@ -155,7 +156,7 @@ def from_csc( node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, - id_to_key: dict[IndexValue, NodeKey] | None = None, + id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: N = indptr.size - 1 @@ -189,7 +190,7 @@ def from_dcsr( node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, - id_to_key: dict[IndexValue, NodeKey] | None = None, + id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: row_indices = cp.array( @@ -222,7 +223,7 @@ def from_dcsc( node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, - id_to_key: dict[IndexValue, NodeKey] | None = None, + id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: col_indices = cp.array( @@ -295,11 +296,11 @@ def node_dtypes(self) -> dict[AttrKey, Dtype]: return {key: val.dtype for key, val in self.node_values.items()} @property - def id_to_key(self) -> dict[IndexValue, NodeKey] | None: + def id_to_key(self) -> [NodeKey] | None: if self.key_to_id is None: return None if self._id_to_key is None: - self._id_to_key = {val: key for key, val in self.key_to_id.items()} + self._id_to_key = sorted(self.key_to_id, key=self.key_to_id.__getitem__) return self._id_to_key name = nx.Graph.name @@ -370,6 +371,12 @@ def get_edge_data( v = self.key_to_id[v] except KeyError: return default + else: + try: + if u < 0 or v < 0 or u >= self._N or v >= self._N: + return default + except TypeError: + return default index = cp.nonzero((self.row_indices == u) & (self.col_indices == v))[0] if index.size == 0: return default @@ -447,6 +454,7 @@ def to_undirected(self, as_view: bool = False) -> Graph: ################### def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): + # DRY warning: see also MultiGraph._copy indptr = self.indptr row_indices = self.row_indices col_indices = self.col_indices diff --git a/python/nx-cugraph/nx_cugraph/classes/multidigraph.py b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py new file mode 100644 index 000000000..5629e2c9c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py @@ -0,0 +1,30 @@ +# 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. +from __future__ import annotations + +import networkx as nx + +import nx_cugraph as nxcg + +from .digraph import DiGraph +from .multigraph import MultiGraph + +__all__ = ["MultiDiGraph"] + +networkx_api = nxcg.utils.decorators.networkx_class(nx.MultiDiGraph) + + +class MultiDiGraph(MultiGraph, DiGraph): + @classmethod + def to_networkx_class(cls) -> type[nx.MultiDiGraph]: + return nx.MultiDiGraph diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py new file mode 100644 index 000000000..499ca7ce2 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -0,0 +1,453 @@ +# 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. +from __future__ import annotations + +from copy import deepcopy +from typing import TYPE_CHECKING, ClassVar + +import cupy as cp +import networkx as nx +import numpy as np + +import nx_cugraph as nxcg + +from .graph import Graph + +if TYPE_CHECKING: + from nx_cugraph.typing import ( + AttrKey, + EdgeKey, + EdgeValue, + IndexValue, + NodeKey, + NodeValue, + ) +__all__ = ["MultiGraph"] + +networkx_api = nxcg.utils.decorators.networkx_class(nx.MultiGraph) + + +class MultiGraph(Graph): + # networkx properties + edge_key_dict_factory: ClassVar[type] = dict + + # Not networkx properties + + # In a MultiGraph, each edge has a unique `(row, col, key)` key. + # By default, `key` is 0 if possible, else 1, else 2, etc. + # This key can be any hashable Python object in NetworkX. + # We don't use a dict for our data structure here, because + # that would require a `(row, col, key)` key. + # Instead, we keep `edge_keys` and/or `edge_indices`. + # `edge_keys` is the list of Python objects for each edge. + # `edge_indices` is for the common case of default multiedge keys, + # in which case we can store it as a cupy array. + # `edge_indices` is generally preferred. It is possible to provide + # both where edge_indices is the default and edge_keys is anything. + # It is also possible for them both to be None, which means the + # default edge indices has not yet been calculated. + edge_indices: cp.ndarray[IndexValue] | None + edge_keys: list[EdgeKey] | None + + #################### + # Creation methods # + #################### + + @classmethod + def from_coo( + cls, + N: int, + row_indices: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_indices: cp.ndarray[IndexValue] | None = None, + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: list[NodeKey] | None = None, + edge_keys: list[EdgeKey] | None = None, + **attr, + ) -> MultiGraph: + new_graph = super().from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + **attr, + ) + new_graph.edge_indices = edge_indices + new_graph.edge_keys = edge_keys + # Easy and fast sanity checks + if ( + new_graph.edge_keys is not None + and len(new_graph.edge_keys) != row_indices.size + ): + raise ValueError + return new_graph + + @classmethod + def from_csr( + cls, + indptr: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_indices: cp.ndarray[IndexValue] | None = None, + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: list[NodeKey] | None = None, + edge_keys: list[EdgeKey] | None = None, + **attr, + ) -> MultiGraph: + N = indptr.size - 1 + row_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + edge_keys=edge_keys, + **attr, + ) + + @classmethod + def from_csc( + cls, + indptr: cp.ndarray[IndexValue], + row_indices: cp.ndarray[IndexValue], + edge_indices: cp.ndarray[IndexValue] | None = None, + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: list[NodeKey] | None = None, + edge_keys: list[EdgeKey] | None = None, + **attr, + ) -> MultiGraph: + N = indptr.size - 1 + col_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + edge_keys=edge_keys, + **attr, + ) + + @classmethod + def from_dcsr( + cls, + N: int, + compressed_rows: cp.ndarray[IndexValue], + indptr: cp.ndarray[IndexValue], + col_indices: cp.ndarray[IndexValue], + edge_indices: cp.ndarray[IndexValue] | None = None, + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: list[NodeKey] | None = None, + edge_keys: list[EdgeKey] | None = None, + **attr, + ) -> MultiGraph: + row_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(compressed_rows.get(), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + edge_keys=edge_keys, + **attr, + ) + + @classmethod + def from_dcsc( + cls, + N: int, + compressed_cols: cp.ndarray[IndexValue], + indptr: cp.ndarray[IndexValue], + row_indices: cp.ndarray[IndexValue], + edge_indices: cp.ndarray[IndexValue] | None = None, + edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, + edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + *, + key_to_id: dict[NodeKey, IndexValue] | None = None, + id_to_key: list[NodeKey] | None = None, + edge_keys: list[EdgeKey] | None = None, + **attr, + ) -> Graph: + col_indices = cp.array( + # cp.repeat is slow to use here, so use numpy instead + np.repeat(compressed_cols.get(), cp.diff(indptr).get()) + ) + return cls.from_coo( + N, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + edge_keys=edge_keys, + **attr, + ) + + def __new__( + cls, incoming_graph_data=None, multigraph_input=None, **attr + ) -> MultiGraph: + if isinstance(incoming_graph_data, dict) and multigraph_input is not False: + new_graph = nxcg.from_networkx( + nx.MultiGraph(incoming_graph_data, multigraph_input=multigraph_input), + preserve_all_attrs=True, + ) + else: + new_graph = super().__new__(cls, incoming_graph_data) + new_graph.graph.update(attr) + return new_graph + + ################# + # Class methods # + ################# + + @classmethod + @networkx_api + def is_directed(cls) -> bool: + return False + + @classmethod + @networkx_api + def is_multigraph(cls) -> bool: + return True + + @classmethod + @networkx_api + def to_directed_class(cls) -> type[nxcg.MultiDiGraph]: + return nxcg.MultiDiGraph + + @classmethod + def to_networkx_class(cls) -> type[nx.MultiGraph]: + return nx.MultiGraph + + @classmethod + @networkx_api + def to_undirected_class(cls) -> type[MultiGraph]: + return MultiGraph + + ########################## + # NetworkX graph methods # + ########################## + + @networkx_api + def clear(self) -> None: + super().clear() + self.edge_indices = None + self.edge_keys = None + + @networkx_api + def clear_edges(self) -> None: + super().clear_edges() + self.edge_indices = None + self.edge_keys = None + + @networkx_api + def copy(self, as_view: bool = False) -> MultiGraph: + # Does shallow copy in networkx + return self._copy(as_view, self.__class__) + + @networkx_api + def get_edge_data( + self, + u: NodeKey, + v: NodeKey, + key: EdgeKey | None = None, + default: EdgeValue | None = None, + ): + if self.key_to_id is not None: + try: + u = self.key_to_id[u] + v = self.key_to_id[v] + except KeyError: + return default + else: + try: + if u < 0 or v < 0 or u >= self._N or v >= self._N: + return default + except TypeError: + return default + mask = (self.row_indices == u) & (self.col_indices == v) + if not mask.any(): + return default + if self.edge_keys is None: + if self.edge_indices is None: + self._calculate_edge_indices() + if key is not None: + try: + mask = mask & (self.edge_indices == key) + except TypeError: + return default + indices = cp.nonzero(mask)[0] + if indices.size == 0: + return default + edge_keys = self.edge_keys + if key is not None and edge_keys is not None: + mask[[i for i in indices.tolist() if edge_keys[i] != key]] = False + indices = cp.nonzero(mask)[0] + if indices.size == 0: + return default + if key is not None: + [index] = indices.tolist() + return { + k: v[index].tolist() + for k, v in self.edge_values.items() + if k not in self.edge_masks or self.edge_masks[k][index] + } + return { + edge_keys[index] + if edge_keys is not None + else index: { + k: v[index].tolist() + for k, v in self.edge_values.items() + if k not in self.edge_masks or self.edge_masks[k][index] + } + for index in indices.tolist() + } + + @networkx_api + def has_edge(self, u: NodeKey, v: NodeKey, key: EdgeKey | None = None) -> bool: + if self.key_to_id is not None: + try: + u = self.key_to_id[u] + v = self.key_to_id[v] + except KeyError: + return False + mask = (self.row_indices == u) & (self.col_indices == v) + if key is None or (self.edge_indices is None and self.edge_keys is None): + return bool(mask.any()) + if self.edge_keys is None: + try: + return bool((mask & (self.edge_indices == key)).any()) + except TypeError: + return False + indices = cp.nonzero(mask)[0] + if indices.size == 0: + return False + edge_keys = self.edge_keys + return any(edge_keys[i] == key for i in indices.tolist()) + + @networkx_api + def to_directed(self, as_view: bool = False) -> nxcg.MultiDiGraph: + return self._copy(as_view, self.to_directed_class()) + + @networkx_api + def to_undirected(self, as_view: bool = False) -> MultiGraph: + # Does deep copy in networkx + return self.copy(as_view) + + ################### + # Private methods # + ################### + + def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): + # DRY warning: see also Graph._copy + indptr = self.indptr + row_indices = self.row_indices + col_indices = self.col_indices + edge_indices = self.edge_indices + edge_values = self.edge_values + edge_masks = self.edge_masks + node_values = self.node_values + node_masks = self.node_masks + key_to_id = self.key_to_id + id_to_key = None if key_to_id is None else self._id_to_key + edge_keys = self.edge_keys + if not as_view: + indptr = indptr.copy() + row_indices = row_indices.copy() + col_indices = col_indices.copy() + edge_indices = edge_indices.copy() + edge_values = {key: val.copy() for key, val in edge_values.items()} + edge_masks = {key: val.copy() for key, val in edge_masks.items()} + node_values = {key: val.copy() for key, val in node_values.items()} + node_masks = {key: val.copy() for key, val in node_masks.items()} + if key_to_id is not None: + key_to_id = key_to_id.copy() + if id_to_key is not None: + id_to_key = id_to_key.copy() + if edge_keys is not None: + edge_keys = edge_keys.copy() + if reverse: + row_indices, col_indices = col_indices, row_indices + rv = cls.from_coo( + indptr, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + edge_keys=edge_keys, + ) + if as_view: + rv.graph = self.graph + else: + rv.graph.update(deepcopy(self.graph)) + return rv diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index 1240ea71d..e82286e5e 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -122,8 +122,6 @@ def from_networkx( graph = G else: raise TypeError(f"Expected networkx.Graph; got {type(graph)}") - elif graph.is_multigraph(): - raise NotImplementedError("MultiGraph support is not yet implemented") if preserve_all_attrs: preserve_edge_attrs = True @@ -144,7 +142,7 @@ def from_networkx( else: node_attrs = {node_attrs: None} - if graph.__class__ in {nx.Graph, nx.DiGraph}: + if graph.__class__ in {nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph}: # This is a NetworkX private attribute, but is much faster to use adj = graph._adj else: @@ -163,7 +161,11 @@ def from_networkx( edge_attrs = None elif preserve_edge_attrs: # Using comprehensions should be just as fast starting in Python 3.11 - attr_sets = set(map(frozenset, concat(map(dict.values, adj.values())))) + it = concat(map(dict.values, adj.values())) + if graph.is_multigraph(): + it = concat(map(dict.values, it)) + # PERF: should we add `filter(None, ...)` to remove empty data dicts? + attr_sets = set(map(frozenset, it)) attrs = frozenset.union(*attr_sets) edge_attrs = dict.fromkeys(attrs, REQUIRED) if len(attr_sets) > 1: @@ -180,11 +182,19 @@ def from_networkx( if len(required) == 1: # Fast path for the common case of a single attribute with no default [attr] = required - it = ( - attr in edgedata - for rowdata in adj.values() - for edgedata in rowdata.values() - ) + if graph.is_multigraph(): + it = ( + attr in edgedata + for rowdata in adj.values() + for multiedges in rowdata.values() + for edgedata in multiedges.values() + ) + else: + it = ( + attr in edgedata + for rowdata in adj.values() + for edgedata in rowdata.values() + ) if next(it): if all(it): # All edges have data @@ -195,9 +205,10 @@ def from_networkx( del edge_attrs[attr] # Else some edges have attribute (default already None) else: - attr_sets = set( - map(required.intersection, concat(map(dict.values, adj.values()))) - ) + it = concat(map(dict.values, adj.values())) + if graph.is_multigraph(): + it = concat(map(dict.values, it)) + attr_sets = set(map(required.intersection, it)) for attr in required - frozenset.union(*attr_sets): # No edges have these attributes del edge_attrs[attr] @@ -254,7 +265,23 @@ def from_networkx( key_to_id = None else: col_iter = map(key_to_id.__getitem__, col_iter) - col_indices = cp.fromiter(col_iter, np.int32) + if graph.is_multigraph(): + col_indices = np.fromiter(col_iter, np.int32) + num_multiedges = np.fromiter( + map(len, concat(map(dict.values, adj.values()))), np.int32 + ) + # cp.repeat is slow to use here, so use numpy instead + col_indices = cp.array(np.repeat(col_indices, num_multiedges)) + # Determine edge keys and edge ids for multigraphs + edge_keys = list(concat(concat(map(dict.values, adj.values())))) + edge_indices = cp.fromiter( + concat(map(range, map(len, concat(map(dict.values, adj.values()))))), + np.int32, + ) + if edge_keys == edge_indices.tolist(): + edge_keys = None # Prefer edge_indices + else: + col_indices = cp.fromiter(col_iter, np.int32) edge_values = {} edge_masks = {} @@ -268,16 +295,29 @@ def from_networkx( if edge_default is None: vals = [] append = vals.append - iter_mask = ( - append( - edgedata[edge_attr] - if (present := edge_attr in edgedata) - else False + if graph.is_multigraph(): + iter_mask = ( + append( + edgedata[edge_attr] + if (present := edge_attr in edgedata) + else False + ) + or present + for rowdata in adj.values() + for multiedges in rowdata.values() + for edgedata in multiedges.values() + ) + else: + iter_mask = ( + append( + edgedata[edge_attr] + if (present := edge_attr in edgedata) + else False + ) + or present + for rowdata in adj.values() + for edgedata in rowdata.values() ) - or present - for rowdata in adj.values() - for edgedata in rowdata.values() - ) edge_masks[edge_attr] = cp.fromiter(iter_mask, bool) edge_values[edge_attr] = cp.array(vals, dtype) # if vals.ndim > 1: ... @@ -289,8 +329,16 @@ def from_networkx( # for rowdata in adj.values() # for edgedata in rowdata.values() # ) - iter_values = map( - op.itemgetter(edge_attr), concat(map(dict.values, adj.values())) + it = concat(map(dict.values, adj.values())) + if graph.is_multigraph(): + it = concat(map(dict.values, it)) + iter_values = map(op.itemgetter(edge_attr), it) + elif graph.is_multigraph(): + iter_values = ( + edgedata.get(edge_attr, edge_default) + for rowdata in adj.values() + for multiedges in rowdata.values() + for edgedata in multiedges.values() ) else: iter_values = ( @@ -304,13 +352,13 @@ def from_networkx( edge_values[edge_attr] = cp.fromiter(iter_values, dtype) # if vals.ndim > 1: ... - row_indices = cp.array( - # cp.repeat is slow to use here, so use numpy instead - np.repeat( - np.arange(N, dtype=np.int32), - np.fromiter(map(len, adj.values()), np.int32), - ) + # cp.repeat is slow to use here, so use numpy instead + row_indices = np.repeat( + np.arange(N, dtype=np.int32), np.fromiter(map(len, adj.values()), np.int32) ) + if graph.is_multigraph(): + row_indices = np.repeat(row_indices, num_multiedges) + row_indices = cp.array(row_indices) node_values = {} node_masks = {} @@ -350,21 +398,38 @@ def from_networkx( else: node_values[node_attr] = cp.fromiter(iter_values, dtype) # if vals.ndim > 1: ... - - if graph.is_directed() or as_directed: - klass = nxcg.DiGraph + if graph.is_multigraph(): + if graph.is_directed() or as_directed: + klass = nxcg.MultiDiGraph + else: + klass = nxcg.MultiGraph + rv = klass.from_coo( + N, + row_indices, + col_indices, + edge_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + edge_keys=edge_keys, + ) else: - klass = nxcg.Graph - rv = klass.from_coo( - N, - row_indices, - col_indices, - edge_values, - edge_masks, - node_values, - node_masks, - key_to_id=key_to_id, - ) + if graph.is_directed() or as_directed: + klass = nxcg.DiGraph + else: + klass = nxcg.Graph + rv = klass.from_coo( + N, + row_indices, + col_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + ) if preserve_graph_attrs: rv.graph.update(graph.graph) # deepcopy? return rv @@ -427,7 +492,7 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: full_node_dicts = _iter_attr_dicts(node_values, node_masks) rv.add_nodes_from(zip(node_iter, full_node_dicts)) elif id_to_key is not None: - rv.add_nodes_from(id_to_key.values()) + rv.add_nodes_from(id_to_key) else: rv.add_nodes_from(range(len(G))) @@ -448,7 +513,17 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: if id_to_key is not None: row_iter = map(id_to_key.__getitem__, row_indices) col_iter = map(id_to_key.__getitem__, col_indices) - if edge_values: + if G.is_multigraph() and (G.edge_keys is not None or G.edge_indices is not None): + if G.edge_keys is not None: + edge_keys = G.edge_keys + else: + edge_keys = G.edge_indices.tolist() + if edge_values: + full_edge_dicts = _iter_attr_dicts(edge_values, edge_masks) + rv.add_edges_from(zip(row_iter, col_iter, edge_keys, full_edge_dicts)) + else: + rv.add_edges_from(zip(row_iter, col_iter, edge_keys)) + elif edge_values: full_edge_dicts = _iter_attr_dicts(edge_values, edge_masks) rv.add_edges_from(zip(row_iter, col_iter, full_edge_dicts)) else: diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 2ad23acd9..124b86a4a 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -174,6 +174,10 @@ def key(testpath): ): louvain_different, key("test_louvain.py:test_none_weight_param"): louvain_different, key("test_louvain.py:test_multigraph"): louvain_different, + # See networkx#6630 + key( + "test_louvain.py:test_undirected_selfloops" + ): "self-loops not handled in Louvain", } ) @@ -189,10 +193,4 @@ def can_run(cls, name, args, kwargs): This is a proposed API to add to networkx dispatching machinery and may change. """ - return ( - hasattr(cls, name) - and getattr(cls, name).can_run(*args, **kwargs) - # We don't support MultiGraphs yet - and not any(isinstance(x, nx.MultiGraph) for x in args) - and not any(isinstance(x, nx.MultiGraph) for x in kwargs.values()) - ) + return hasattr(cls, name) and getattr(cls, name).can_run(*args, **kwargs) diff --git a/python/nx-cugraph/nx_cugraph/tests/bench_convert.py b/python/nx-cugraph/nx_cugraph/tests/bench_convert.py index 7e6278661..2eb432230 100644 --- a/python/nx-cugraph/nx_cugraph/tests/bench_convert.py +++ b/python/nx-cugraph/nx_cugraph/tests/bench_convert.py @@ -39,6 +39,8 @@ gpubenchmark = pytest_benchmark.plugin.benchmark +CREATE_USING = [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph] + def _bench_helper(gpubenchmark, N, attr_kind, create_using, method): G = method(N, create_using=create_using) @@ -103,7 +105,7 @@ def _bench_helper_scipy(gpubenchmark, N, attr_kind, create_using, method, fmt): None, ], ) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) def bench_cycle_graph(gpubenchmark, N, attr_kind, create_using): _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.cycle_graph) @@ -111,7 +113,7 @@ def bench_cycle_graph(gpubenchmark, N, attr_kind, create_using): @pytest.mark.skipif("not cugraph") @pytest.mark.parametrize("N", [1, 10**6]) @pytest.mark.parametrize("attr_kind", ["full", None]) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) @pytest.mark.parametrize("do_renumber", [True, False]) def bench_cycle_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_renumber): if N == 1 and not do_renumber: @@ -124,7 +126,7 @@ def bench_cycle_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_renum @pytest.mark.skipif("not scipy") @pytest.mark.parametrize("N", [1, 10**6]) @pytest.mark.parametrize("attr_kind", ["full", None]) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) @pytest.mark.parametrize("fmt", ["coo", "csr"]) def bench_cycle_graph_scipy(gpubenchmark, N, attr_kind, create_using, fmt): _bench_helper_scipy(gpubenchmark, N, attr_kind, create_using, nx.cycle_graph, fmt) @@ -143,14 +145,14 @@ def bench_cycle_graph_scipy(gpubenchmark, N, attr_kind, create_using, fmt): None, ], ) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) def bench_complete_graph_edgedata(gpubenchmark, N, attr_kind, create_using): _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.complete_graph) @pytest.mark.parametrize("N", [3000]) @pytest.mark.parametrize("attr_kind", [None]) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) def bench_complete_graph_noedgedata(gpubenchmark, N, attr_kind, create_using): _bench_helper(gpubenchmark, N, attr_kind, create_using, nx.complete_graph) @@ -158,7 +160,7 @@ def bench_complete_graph_noedgedata(gpubenchmark, N, attr_kind, create_using): @pytest.mark.skipif("not cugraph") @pytest.mark.parametrize("N", [1, 1500]) @pytest.mark.parametrize("attr_kind", ["full", None]) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) @pytest.mark.parametrize("do_renumber", [True, False]) def bench_complete_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_renumber): if N == 1 and not do_renumber: @@ -171,7 +173,7 @@ def bench_complete_graph_cugraph(gpubenchmark, N, attr_kind, create_using, do_re @pytest.mark.skipif("not scipy") @pytest.mark.parametrize("N", [1, 1500]) @pytest.mark.parametrize("attr_kind", ["full", None]) -@pytest.mark.parametrize("create_using", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize("create_using", CREATE_USING) @pytest.mark.parametrize("fmt", ["coo", "csr"]) def bench_complete_graph_scipy(gpubenchmark, N, attr_kind, create_using, fmt): _bench_helper_scipy( diff --git a/python/nx-cugraph/nx_cugraph/tests/test_convert.py b/python/nx-cugraph/nx_cugraph/tests/test_convert.py index ba3cd7aae..83820f762 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_convert.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_convert.py @@ -18,7 +18,9 @@ from nx_cugraph import interface -@pytest.mark.parametrize("graph_class", [nx.Graph, nx.DiGraph]) +@pytest.mark.parametrize( + "graph_class", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph] +) @pytest.mark.parametrize( "kwargs", [ @@ -48,9 +50,10 @@ def test_convert_empty(graph_class, kwargs): assert G.graph == Gcg.graph == H.graph == {} -def test_convert(): +@pytest.mark.parametrize("graph_class", [nx.Graph, nx.MultiGraph]) +def test_convert(graph_class): # FIXME: can we break this into smaller tests? - G = nx.Graph() + G = graph_class() G.add_edge(0, 1, x=2) G.add_node(0, foo=10) G.add_node(1, foo=20, bar=100) @@ -88,7 +91,10 @@ def test_convert(): cp.testing.assert_array_equal(Gcg.node_values["foo"], [10, 20]) assert Gcg.edge_values == Gcg.edge_masks == {} H = nxcg.to_networkx(Gcg) - assert set(G.edges) == set(H.edges) == {(0, 1)} + if G.is_multigraph(): + assert set(G.edges) == set(H.edges) == {(0, 1, 0)} + else: + assert set(G.edges) == set(H.edges) == {(0, 1)} assert G.nodes == H.nodes # Fill completely missing attribute with default value @@ -100,6 +106,8 @@ def test_convert(): assert Gcg.edge_masks == Gcg.node_values == Gcg.node_masks == {} H = nxcg.to_networkx(Gcg) assert list(H.edges(data=True)) == [(0, 1, {"y": 0})] + if Gcg.is_multigraph(): + assert set(H.edges) == {(0, 1, 0)} # If attribute is completely missing (and no default), then just ignore it Gcg = nxcg.from_networkx(G, edge_attrs={"y": None}) @@ -108,6 +116,8 @@ def test_convert(): assert sorted(Gcg.edge_values) == sorted(Gcg.edge_masks) == [] H = nxcg.to_networkx(Gcg) assert list(H.edges(data=True)) == [(0, 1, {})] + if Gcg.is_multigraph(): + assert set(H.edges) == {(0, 1, 0)} G.add_edge(0, 2) # Some edges are missing 'x' attribute; need to use a mask @@ -120,6 +130,8 @@ def test_convert(): cp.testing.assert_array_equal(Gcg.edge_values["x"][Gcg.edge_masks["x"]], [2, 2]) H = nxcg.to_networkx(Gcg) assert list(H.edges(data=True)) == [(0, 1, {"x": 2}), (0, 2, {})] + if Gcg.is_multigraph(): + assert set(H.edges) == {(0, 1, 0), (0, 2, 0)} with pytest.raises(KeyError, match="x"): nxcg.from_networkx(G, edge_attrs={"x": nxcg.convert.REQUIRED}) @@ -131,7 +143,7 @@ def test_convert(): nxcg.from_networkx(G, node_attrs={"bar": ...}) # Now for something more complicated... - G = nx.Graph() + G = graph_class() G.add_edge(10, 20, x=1) G.add_edge(10, 30, x=2, y=1.5) G.add_node(10, foo=100) @@ -147,7 +159,7 @@ def test_convert(): {"edge_attrs": {"x": 0, "y": None}, "edge_dtypes": {"x": int, "y": float}}, ]: Gcg = nxcg.from_networkx(G, **kwargs) - assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.edge_values["x"], [1, 2, 1, 2]) @@ -168,7 +180,7 @@ def test_convert(): {"node_attrs": {"foo": 0, "bar": None, "missing": None}}, ]: Gcg = nxcg.from_networkx(G, **kwargs) - assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.node_values["foo"], [100, 200, 300]) @@ -189,7 +201,7 @@ def test_convert(): {"node_attrs": {"bar": 0, "foo": None}, "node_dtypes": int}, ]: Gcg = nxcg.from_networkx(G, **kwargs) - assert Gcg.id_to_key == {0: 10, 1: 20, 2: 30} # Remap node IDs to 0, 1, ... + assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.node_values["bar"], [0, 1000, 0]) @@ -201,3 +213,14 @@ def test_convert(): interface.BackendInterface.convert_from_nx(G, edge_attrs={"x": 1}, weight="x") with pytest.raises(TypeError, match="Expected networkx.Graph"): nxcg.from_networkx({}) + + +@pytest.mark.parametrize("graph_class", [nx.MultiGraph, nx.MultiDiGraph]) +def test_multigraph(graph_class): + G = graph_class() + G.add_edge(0, 1, "key1", x=10) + G.add_edge(0, 1, "key2", y=20) + Gcg = nxcg.from_networkx(G, preserve_edge_attrs=True) + H = nxcg.to_networkx(Gcg) + assert type(G) is type(H) + assert nx.utils.graphs_equal(G, H) diff --git a/python/nx-cugraph/nx_cugraph/tests/test_multigraph.py b/python/nx-cugraph/nx_cugraph/tests/test_multigraph.py new file mode 100644 index 000000000..a8f189a47 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_multigraph.py @@ -0,0 +1,72 @@ +# 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. +import networkx as nx +import pytest + +import nx_cugraph as nxcg + + +@pytest.mark.parametrize("test_nxcugraph", [False, True]) +def test_get_edge_data(test_nxcugraph): + G = nx.MultiGraph() + G.add_edge(0, 1, 0, x=10) + G.add_edge(0, 1, 1, y=20) + G.add_edge(0, 2, "a", x=100) + G.add_edge(0, 2, "b", y=200) + G.add_edge(0, 3) + G.add_edge(0, 3) + if test_nxcugraph: + G = nxcg.MultiGraph(G) + default = object() + assert G.get_edge_data(0, 0, default=default) is default + assert G.get_edge_data("a", "b", default=default) is default + assert G.get_edge_data(0, 1, 2, default=default) is default + assert G.get_edge_data(-1, 1, default=default) is default + assert G.get_edge_data(0, 1, 0, default=default) == {"x": 10} + assert G.get_edge_data(0, 1, 1, default=default) == {"y": 20} + assert G.get_edge_data(0, 1, default=default) == {0: {"x": 10}, 1: {"y": 20}} + assert G.get_edge_data(0, 2, "a", default=default) == {"x": 100} + assert G.get_edge_data(0, 2, "b", default=default) == {"y": 200} + assert G.get_edge_data(0, 2, default=default) == {"a": {"x": 100}, "b": {"y": 200}} + assert G.get_edge_data(0, 3, 0, default=default) == {} + assert G.get_edge_data(0, 3, 1, default=default) == {} + assert G.get_edge_data(0, 3, 2, default=default) is default + assert G.get_edge_data(0, 3, default=default) == {0: {}, 1: {}} + assert G.has_edge(0, 1) + assert G.has_edge(0, 1, 0) + assert G.has_edge(0, 1, 1) + assert not G.has_edge(0, 1, 2) + assert not G.has_edge(0, 1, "a") + assert not G.has_edge(0, -1) + assert G.has_edge(0, 2) + assert G.has_edge(0, 2, "a") + assert G.has_edge(0, 2, "b") + assert not G.has_edge(0, 2, "c") + assert not G.has_edge(0, 2, 0) + assert G.has_edge(0, 3) + assert not G.has_edge(0, 0) + assert not G.has_edge(0, 0, 0) + + G = nx.MultiGraph() + G.add_edge(0, 1) + if test_nxcugraph: + G = nxcg.MultiGraph(G) + assert G.get_edge_data(0, 1, default=default) == {0: {}} + assert G.get_edge_data(0, 1, 0, default=default) == {} + assert G.get_edge_data(0, 1, 1, default=default) is default + assert G.get_edge_data(0, 1, "b", default=default) is default + assert G.get_edge_data(-1, 2, default=default) is default + assert G.has_edge(0, 1) + assert G.has_edge(0, 1, 0) + assert not G.has_edge(0, 1, 1) + assert not G.has_edge(0, 1, "a") diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 98adbb439..2478a02df 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -32,6 +32,7 @@ classifiers = [ dependencies = [ "cupy-cuda11x>=12.0.0", "networkx>=3.0", + "numpy>=1.21", "pylibcugraph==23.12.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. @@ -109,7 +110,7 @@ addopts = [ # "-ra", # Print summary of all fails/errors "--benchmark-warmup=off", "--benchmark-max-time=0", - "--benchmark-min-rounds=3", + "--benchmark-min-rounds=1", "--benchmark-columns=min,median,max", ] From 95fb896b0d6e3cb68b7d12da9f0cf90821714dd1 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Mon, 23 Oct 2023 17:14:44 -0500 Subject: [PATCH 279/384] nx-cugraph: xfail test_louvain.py:test_threshold in Python 3.9 (#3944) This test is flaky b/c Louvain in PLC does not have a seed or random state parameter. This test holds the seed fixed and changes the threshold, but clearly this may not work if we can't set the seed. Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Naim (https://github.com/naimnv) URL: https://github.com/rapidsai/cugraph/pull/3944 --- python/nx-cugraph/nx_cugraph/interface.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 124b86a4a..a7b88b72e 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -12,6 +12,8 @@ # limitations under the License. from __future__ import annotations +import sys + import networkx as nx import nx_cugraph as nxcg @@ -180,6 +182,11 @@ def key(testpath): ): "self-loops not handled in Louvain", } ) + if sys.version_info[:2] == (3, 9): + # This test is sensitive to RNG, which depends on Python version + xfail[ + key("test_louvain.py:test_threshold") + ] = "Louvain does not support seed parameter" for item in items: kset = set(item.keywords) From 53ddf09e76a796988e13980a0c8502affad6a4a5 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 25 Oct 2023 16:16:00 -0500 Subject: [PATCH 280/384] nx-cugraph: add k_truss and degree centralities (#3945) New algorithms: - `degree_centrality` - `in_degree_centrality` - `k_truss` - `number_of_selfloops` - `out_degree_centrality` Also, rename `row_indices, col_indices` to `src_indices, dst_indices` Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3945 --- python/nx-cugraph/_nx_cugraph/__init__.py | 5 + python/nx-cugraph/lint.yaml | 6 +- .../nx_cugraph/algorithms/__init__.py | 1 + .../algorithms/centrality/__init__.py | 1 + .../algorithms/centrality/degree_alg.py | 48 ++++++++ .../algorithms/community/louvain.py | 2 +- .../nx-cugraph/nx_cugraph/algorithms/core.py | 96 ++++++++++++++++ .../nx_cugraph/algorithms/isolate.py | 8 +- .../nx-cugraph/nx_cugraph/classes/__init__.py | 5 +- .../nx-cugraph/nx_cugraph/classes/digraph.py | 13 ++- .../nx-cugraph/nx_cugraph/classes/function.py | 23 ++++ python/nx-cugraph/nx_cugraph/classes/graph.py | 105 ++++++++++-------- .../nx_cugraph/classes/multigraph.py | 64 ++++++----- python/nx-cugraph/nx_cugraph/convert.py | 38 +++---- .../nx_cugraph/tests/test_convert.py | 32 +++--- .../nx_cugraph/tests/test_match_api.py | 3 + python/nx-cugraph/pyproject.toml | 5 +- 17 files changed, 330 insertions(+), 125 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/core.py create mode 100644 python/nx-cugraph/nx_cugraph/classes/function.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 886d7a19f..965b5b232 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -30,11 +30,16 @@ "functions": { # BEGIN: functions "betweenness_centrality", + "degree_centrality", "edge_betweenness_centrality", + "in_degree_centrality", "is_isolate", "isolates", + "k_truss", "louvain_communities", "number_of_isolates", + "number_of_selfloops", + "out_degree_centrality", # END: functions }, "extra_docstrings": { diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 4f604fbeb..fef2cebc7 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -45,12 +45,12 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.9.1 + rev: 23.10.0 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.292 + rev: v0.1.1 hooks: - id: ruff args: [--fix-only, --show-fixes] @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.292 + rev: v0.1.1 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index dfd9adfc6..22600bfdc 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -12,4 +12,5 @@ # limitations under the License. from . import centrality, community from .centrality import * +from .core import * from .isolate import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py index 2ac6242e8..af91f2278 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py @@ -11,3 +11,4 @@ # See the License for the specific language governing permissions and # limitations under the License. from .betweenness import * +from .degree_alg import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py new file mode 100644 index 000000000..0b2fd24af --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py @@ -0,0 +1,48 @@ +# 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. +from nx_cugraph.convert import _to_directed_graph, _to_graph +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +__all__ = ["degree_centrality", "in_degree_centrality", "out_degree_centrality"] + + +@networkx_algorithm +def degree_centrality(G): + G = _to_graph(G) + if len(G) <= 1: + return dict.fromkeys(G, 1) + deg = G._degrees_array() + centrality = deg * (1 / (len(G) - 1)) + return G._nodearray_to_dict(centrality) + + +@not_implemented_for("undirected") +@networkx_algorithm +def in_degree_centrality(G): + G = _to_directed_graph(G) + if len(G) <= 1: + return dict.fromkeys(G, 1) + deg = G._in_degrees_array() + centrality = deg * (1 / (len(G) - 1)) + return G._nodearray_to_dict(centrality) + + +@not_implemented_for("undirected") +@networkx_algorithm +def out_degree_centrality(G): + G = _to_directed_graph(G) + if len(G) <= 1: + return dict.fromkeys(G, 1) + deg = G._out_degrees_array() + centrality = deg * (1 / (len(G) - 1)) + return G._nodearray_to_dict(centrality) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index dc209870c..62261d109 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -42,7 +42,7 @@ def louvain_communities( # NetworkX allows both directed and undirected, but cugraph only allows undirected. seed = _seed_to_int(seed) # Unused, but ensure it's valid for future compatibility G = _to_undirected_graph(G, weight) - if G.row_indices.size == 0: + if G.src_indices.size == 0: # TODO: PLC doesn't handle empty graphs gracefully! return [{key} for key in G._nodeiter_to_iter(range(len(G)))] if max_level is None: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py new file mode 100644 index 000000000..0a64dd71c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -0,0 +1,96 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +import nx_cugraph as nxcg +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +__all__ = ["k_truss"] + + +@not_implemented_for("directed") +@not_implemented_for("multigraph") +@networkx_algorithm +def k_truss(G, k): + if is_nx := isinstance(G, nx.Graph): + G = nxcg.from_networkx(G, preserve_all_attrs=True) + if nxcg.number_of_selfloops(G) > 0: + raise nx.NetworkXError( + "Input graph has self loops which is not permitted; " + "Consider using G.remove_edges_from(nx.selfloop_edges(G))." + ) + # TODO: create renumbering helper function(s) + if k < 3: + # k-truss graph is comprised of nodes incident on k-2 triangles, so k<3 is a + # boundary condition. Here, all we need to do is drop nodes with zero degree. + # Technically, it would be okay to delete this branch of code, because + # plc.k_truss_subgraph behaves the same for 0 <= k < 3. We keep this branch b/c + # it's faster and has an "early return" if there are no nodes with zero degree. + degrees = G._degrees_array() + # Renumber step 0: node indices + node_indices = degrees.nonzero()[0] + if degrees.size == node_indices.size: + # No change + return G if is_nx else G.copy() + src_indices = G.src_indices + dst_indices = G.dst_indices + # Renumber step 1: edge values (no changes needed) + edge_values = {key: val.copy() for key, val in G.edge_values.items()} + edge_masks = {key: val.copy() for key, val in G.edge_masks.items()} + else: + # int dtype for edge_indices would be preferred + edge_indices = cp.arange(G.src_indices.size, dtype=np.float64) + src_indices, dst_indices, edge_indices, _ = plc.k_truss_subgraph( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(edge_array=edge_indices), + k=k, + do_expensive_check=False, + ) + # Renumber step 0: node indices + node_indices = cp.unique(cp.concatenate([src_indices, dst_indices])) + # Renumber step 1: edge values + edge_indices = edge_indices.astype(np.int64) + edge_values = {key: val[edge_indices] for key, val in G.edge_values.items()} + edge_masks = {key: val[edge_indices] for key, val in G.edge_masks.items()} + # Renumber step 2: edge indices + mapper = cp.zeros(len(G), src_indices.dtype) + mapper[node_indices] = cp.arange(node_indices.size, dtype=mapper.dtype) + src_indices = mapper[src_indices] + dst_indices = mapper[dst_indices] + # Renumber step 3: node values + node_values = {key: val[node_indices] for key, val in G.node_values.items()} + node_masks = {key: val[node_indices] for key, val in G.node_masks.items()} + # Renumber step 4: key_to_id + if (id_to_key := G.id_to_key) is not None: + key_to_id = { + id_to_key[old_index]: new_index + for new_index, old_index in enumerate(node_indices.tolist()) + } + else: + key_to_id = None + # Same as calling `G.from_coo`, but use __class__ to indicate it's a classmethod. + new_graph = G.__class__.from_coo( + node_indices.size, + src_indices, + dst_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + ) + new_graph.graph.update(G.graph) + return new_graph diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py index 774627e84..d32223fb3 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py @@ -30,18 +30,18 @@ def is_isolate(G, n): G = _to_graph(G) index = n if G.key_to_id is None else G.key_to_id[n] return not ( - (G.row_indices == index).any().tolist() + (G.src_indices == index).any().tolist() or G.is_directed() - and (G.col_indices == index).any().tolist() + and (G.dst_indices == index).any().tolist() ) def _mark_isolates(G) -> cp.ndarray[bool]: """Return a boolean mask array indicating indices of isolated nodes.""" mark_isolates = cp.ones(len(G), bool) - mark_isolates[G.row_indices] = False + mark_isolates[G.src_indices] = False if G.is_directed(): - mark_isolates[G.col_indices] = False + mark_isolates[G.dst_indices] = False return mark_isolates diff --git a/python/nx-cugraph/nx_cugraph/classes/__init__.py b/python/nx-cugraph/nx_cugraph/classes/__init__.py index 9916bcbe2..19a5357da 100644 --- a/python/nx-cugraph/nx_cugraph/classes/__init__.py +++ b/python/nx-cugraph/nx_cugraph/classes/__init__.py @@ -11,7 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. from .graph import Graph +from .digraph import DiGraph from .multigraph import MultiGraph +from .multidigraph import MultiDiGraph -from .digraph import DiGraph # isort:skip -from .multidigraph import MultiDiGraph # isort:skip +from .function import * diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index 72a1bff21..52ea2334c 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -14,6 +14,7 @@ from typing import TYPE_CHECKING +import cupy as cp import networkx as nx import nx_cugraph as nxcg @@ -48,7 +49,7 @@ def number_of_edges( ) -> int: if u is not None or v is not None: raise NotImplementedError - return self.row_indices.size + return self.src_indices.size ########################## # NetworkX graph methods # @@ -59,3 +60,13 @@ def reverse(self, copy: bool = True) -> DiGraph: return self._copy(not copy, self.__class__, reverse=True) # Many more methods to implement... + + ################### + # Private methods # + ################### + + def _in_degrees_array(self): + return cp.bincount(self.dst_indices, minlength=self._N) + + def _out_degrees_array(self): + return cp.bincount(self.src_indices, minlength=self._N) diff --git a/python/nx-cugraph/nx_cugraph/classes/function.py b/python/nx-cugraph/nx_cugraph/classes/function.py new file mode 100644 index 000000000..633e4abd7 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/classes/function.py @@ -0,0 +1,23 @@ +# 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. +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import networkx_algorithm + +__all__ = ["number_of_selfloops"] + + +@networkx_algorithm +def number_of_selfloops(G): + G = _to_graph(G) + is_selfloop = G.src_indices == G.dst_indices + return is_selfloop.sum().tolist() diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index f1e85c836..166b6b9dc 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -52,8 +52,8 @@ class Graph: # Not networkx properties # We store edge data in COO format with {row,col}_indices and edge_values. - row_indices: cp.ndarray[IndexValue] - col_indices: cp.ndarray[IndexValue] + src_indices: cp.ndarray[IndexValue] + dst_indices: cp.ndarray[IndexValue] edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] edge_masks: dict[AttrKey, cp.ndarray[bool]] node_values: dict[AttrKey, cp.ndarray[NodeValue]] @@ -70,8 +70,8 @@ class Graph: def from_coo( cls, N: int, - row_indices: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, @@ -82,8 +82,8 @@ def from_coo( **attr, ) -> Graph: new_graph = object.__new__(cls) - new_graph.row_indices = row_indices - new_graph.col_indices = col_indices + new_graph.src_indices = src_indices + new_graph.dst_indices = dst_indices new_graph.edge_values = {} if edge_values is None else dict(edge_values) new_graph.edge_masks = {} if edge_masks is None else dict(edge_masks) new_graph.node_values = {} if node_values is None else dict(node_values) @@ -93,9 +93,9 @@ def from_coo( new_graph._N = op.index(N) # Ensure N is integral new_graph.graph = new_graph.graph_attr_dict_factory() new_graph.graph.update(attr) - size = new_graph.row_indices.size + size = new_graph.src_indices.size # Easy and fast sanity checks - if size != new_graph.col_indices.size: + if size != new_graph.dst_indices.size: raise ValueError for attr in ["edge_values", "edge_masks"]: if datadict := getattr(new_graph, attr): @@ -117,7 +117,7 @@ def from_coo( def from_csr( cls, indptr: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, @@ -128,14 +128,14 @@ def from_csr( **attr, ) -> Graph: N = indptr.size - 1 - row_indices = cp.array( + src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -149,7 +149,7 @@ def from_csr( def from_csc( cls, indptr: cp.ndarray[IndexValue], - row_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, @@ -160,14 +160,14 @@ def from_csc( **attr, ) -> Graph: N = indptr.size - 1 - col_indices = cp.array( + dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -183,7 +183,7 @@ def from_dcsr( N: int, compressed_rows: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, @@ -193,14 +193,14 @@ def from_dcsr( id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: - row_indices = cp.array( + src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(compressed_rows.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -216,7 +216,7 @@ def from_dcsc( N: int, compressed_cols: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], - row_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, @@ -226,14 +226,14 @@ def from_dcsc( id_to_key: list[NodeKey] | None = None, **attr, ) -> Graph: - col_indices = cp.array( + dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(compressed_cols.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -343,8 +343,8 @@ def clear(self) -> None: self.node_values.clear() self.node_masks.clear() self.graph.clear() - self.row_indices = cp.empty(0, self.row_indices.dtype) - self.col_indices = cp.empty(0, self.col_indices.dtype) + self.src_indices = cp.empty(0, self.src_indices.dtype) + self.dst_indices = cp.empty(0, self.dst_indices.dtype) self._N = 0 self.key_to_id = None self._id_to_key = None @@ -353,8 +353,8 @@ def clear(self) -> None: def clear_edges(self) -> None: self.edge_values.clear() self.edge_masks.clear() - self.row_indices = cp.empty(0, self.row_indices.dtype) - self.col_indices = cp.empty(0, self.col_indices.dtype) + self.src_indices = cp.empty(0, self.src_indices.dtype) + self.dst_indices = cp.empty(0, self.dst_indices.dtype) @networkx_api def copy(self, as_view: bool = False) -> Graph: @@ -377,7 +377,7 @@ def get_edge_data( return default except TypeError: return default - index = cp.nonzero((self.row_indices == u) & (self.col_indices == v))[0] + index = cp.nonzero((self.src_indices == u) & (self.dst_indices == v))[0] if index.size == 0: return default [index] = index.tolist() @@ -397,7 +397,7 @@ def has_edge(self, u: NodeKey, v: NodeKey) -> bool: v = self.key_to_id[v] except KeyError: return False - return bool(((self.row_indices == u) & (self.col_indices == v)).any()) + return bool(((self.src_indices == u) & (self.dst_indices == v)).any()) @networkx_api def has_node(self, n: NodeKey) -> bool: @@ -431,8 +431,8 @@ def order(self) -> int: def size(self, weight: AttrKey | None = None) -> int: if weight is not None: raise NotImplementedError - # If no self-edges, then `self.row_indices.size // 2` - return int((self.row_indices <= self.col_indices).sum()) + # If no self-edges, then `self.src_indices.size // 2` + return int((self.src_indices <= self.dst_indices).sum()) @networkx_api def to_directed(self, as_view: bool = False) -> nxcg.DiGraph: @@ -455,9 +455,8 @@ def to_undirected(self, as_view: bool = False) -> Graph: def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): # DRY warning: see also MultiGraph._copy - indptr = self.indptr - row_indices = self.row_indices - col_indices = self.col_indices + src_indices = self.src_indices + dst_indices = self.dst_indices edge_values = self.edge_values edge_masks = self.edge_masks node_values = self.node_values @@ -465,9 +464,8 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): key_to_id = self.key_to_id id_to_key = None if key_to_id is None else self._id_to_key if not as_view: - indptr = indptr.copy() - row_indices = row_indices.copy() - col_indices = col_indices.copy() + src_indices = src_indices.copy() + dst_indices = dst_indices.copy() edge_values = {key: val.copy() for key, val in edge_values.items()} edge_masks = {key: val.copy() for key, val in edge_masks.items()} node_values = {key: val.copy() for key, val in node_values.items()} @@ -477,11 +475,11 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): if id_to_key is not None: id_to_key = id_to_key.copy() if reverse: - row_indices, col_indices = col_indices, row_indices + src_indices, dst_indices = dst_indices, src_indices rv = cls.from_coo( - indptr, - row_indices, - col_indices, + self._N, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -502,8 +500,11 @@ def _get_plc_graph( edge_dtype: Dtype | None = None, *, store_transposed: bool = False, + edge_array: cp.ndarray[EdgeValue] | None = None, ): - if edge_attr is None: + if edge_array is not None: + pass + elif edge_attr is None: edge_array = None elif edge_attr not in self.edge_values: raise KeyError("Graph has no edge attribute {edge_attr!r}") @@ -532,14 +533,20 @@ def _get_plc_graph( is_multigraph=self.is_multigraph(), is_symmetric=not self.is_directed(), ), - src_or_offset_array=self.row_indices, - dst_or_index_array=self.col_indices, + src_or_offset_array=self.src_indices, + dst_or_index_array=self.dst_indices, weight_array=edge_array, store_transposed=store_transposed, renumber=False, do_expensive_check=False, ) + def _degrees_array(self): + degrees = cp.bincount(self.src_indices, minlength=self._N) + if self.is_directed(): + degrees += cp.bincount(self.dst_indices, minlength=self._N) + return degrees + def _nodeiter_to_iter(self, node_ids: Iterable[IndexValue]) -> Iterable[NodeKey]: """Convert an iterable of node IDs to an iterable of node keys.""" if (id_to_key := self.id_to_key) is not None: @@ -551,6 +558,14 @@ def _nodearray_to_list(self, node_ids: cp.ndarray[IndexValue]) -> list[NodeKey]: return node_ids.tolist() return list(self._nodeiter_to_iter(node_ids.tolist())) + def _nodearray_to_dict( + self, values: cp.ndarray[NodeValue] + ) -> dict[NodeKey, NodeValue]: + it = enumerate(values.tolist()) + if (id_to_key := self.id_to_key) is not None: + return {id_to_key[key]: val for key, val in it} + return dict(it) + def _nodearrays_to_dict( self, node_ids: cp.ndarray[IndexValue], values: cp.ndarray[NodeValue] ) -> dict[NodeKey, NodeValue]: diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py index 499ca7ce2..3d90861a3 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -67,8 +67,8 @@ class MultiGraph(Graph): def from_coo( cls, N: int, - row_indices: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, @@ -82,8 +82,8 @@ def from_coo( ) -> MultiGraph: new_graph = super().from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -97,7 +97,7 @@ def from_coo( # Easy and fast sanity checks if ( new_graph.edge_keys is not None - and len(new_graph.edge_keys) != row_indices.size + and len(new_graph.edge_keys) != src_indices.size ): raise ValueError return new_graph @@ -106,7 +106,7 @@ def from_coo( def from_csr( cls, indptr: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, @@ -119,14 +119,14 @@ def from_csr( **attr, ) -> MultiGraph: N = indptr.size - 1 - row_indices = cp.array( + src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, @@ -142,7 +142,7 @@ def from_csr( def from_csc( cls, indptr: cp.ndarray[IndexValue], - row_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, @@ -155,14 +155,14 @@ def from_csc( **attr, ) -> MultiGraph: N = indptr.size - 1 - col_indices = cp.array( + dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, @@ -180,7 +180,7 @@ def from_dcsr( N: int, compressed_rows: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], - col_indices: cp.ndarray[IndexValue], + dst_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, @@ -192,14 +192,14 @@ def from_dcsr( edge_keys: list[EdgeKey] | None = None, **attr, ) -> MultiGraph: - row_indices = cp.array( + src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(compressed_rows.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, @@ -217,7 +217,7 @@ def from_dcsc( N: int, compressed_cols: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], - row_indices: cp.ndarray[IndexValue], + src_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, @@ -229,14 +229,14 @@ def from_dcsc( edge_keys: list[EdgeKey] | None = None, **attr, ) -> Graph: - col_indices = cp.array( + dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead np.repeat(compressed_cols.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, @@ -330,7 +330,7 @@ def get_edge_data( return default except TypeError: return default - mask = (self.row_indices == u) & (self.col_indices == v) + mask = (self.src_indices == u) & (self.dst_indices == v) if not mask.any(): return default if self.edge_keys is None: @@ -376,7 +376,7 @@ def has_edge(self, u: NodeKey, v: NodeKey, key: EdgeKey | None = None) -> bool: v = self.key_to_id[v] except KeyError: return False - mask = (self.row_indices == u) & (self.col_indices == v) + mask = (self.src_indices == u) & (self.dst_indices == v) if key is None or (self.edge_indices is None and self.edge_keys is None): return bool(mask.any()) if self.edge_keys is None: @@ -405,9 +405,8 @@ def to_undirected(self, as_view: bool = False) -> MultiGraph: def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): # DRY warning: see also Graph._copy - indptr = self.indptr - row_indices = self.row_indices - col_indices = self.col_indices + src_indices = self.src_indices + dst_indices = self.dst_indices edge_indices = self.edge_indices edge_values = self.edge_values edge_masks = self.edge_masks @@ -417,9 +416,8 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): id_to_key = None if key_to_id is None else self._id_to_key edge_keys = self.edge_keys if not as_view: - indptr = indptr.copy() - row_indices = row_indices.copy() - col_indices = col_indices.copy() + src_indices = src_indices.copy() + dst_indices = dst_indices.copy() edge_indices = edge_indices.copy() edge_values = {key: val.copy() for key, val in edge_values.items()} edge_masks = {key: val.copy() for key, val in edge_masks.items()} @@ -432,11 +430,11 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): if edge_keys is not None: edge_keys = edge_keys.copy() if reverse: - row_indices, col_indices = col_indices, row_indices + src_indices, dst_indices = dst_indices, src_indices rv = cls.from_coo( - indptr, - row_indices, - col_indices, + self._N, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index e82286e5e..d117c8e5c 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -266,12 +266,12 @@ def from_networkx( else: col_iter = map(key_to_id.__getitem__, col_iter) if graph.is_multigraph(): - col_indices = np.fromiter(col_iter, np.int32) + dst_indices = np.fromiter(col_iter, np.int32) num_multiedges = np.fromiter( map(len, concat(map(dict.values, adj.values()))), np.int32 ) # cp.repeat is slow to use here, so use numpy instead - col_indices = cp.array(np.repeat(col_indices, num_multiedges)) + dst_indices = cp.array(np.repeat(dst_indices, num_multiedges)) # Determine edge keys and edge ids for multigraphs edge_keys = list(concat(concat(map(dict.values, adj.values())))) edge_indices = cp.fromiter( @@ -281,7 +281,7 @@ def from_networkx( if edge_keys == edge_indices.tolist(): edge_keys = None # Prefer edge_indices else: - col_indices = cp.fromiter(col_iter, np.int32) + dst_indices = cp.fromiter(col_iter, np.int32) edge_values = {} edge_masks = {} @@ -353,12 +353,12 @@ def from_networkx( # if vals.ndim > 1: ... # cp.repeat is slow to use here, so use numpy instead - row_indices = np.repeat( + src_indices = np.repeat( np.arange(N, dtype=np.int32), np.fromiter(map(len, adj.values()), np.int32) ) if graph.is_multigraph(): - row_indices = np.repeat(row_indices, num_multiedges) - row_indices = cp.array(row_indices) + src_indices = np.repeat(src_indices, num_multiedges) + src_indices = cp.array(src_indices) node_values = {} node_masks = {} @@ -405,8 +405,8 @@ def from_networkx( klass = nxcg.MultiGraph rv = klass.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_indices, edge_values, edge_masks, @@ -422,8 +422,8 @@ def from_networkx( klass = nxcg.Graph rv = klass.from_coo( N, - row_indices, - col_indices, + src_indices, + dst_indices, edge_values, edge_masks, node_values, @@ -496,23 +496,23 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: else: rv.add_nodes_from(range(len(G))) - row_indices = G.row_indices - col_indices = G.col_indices + src_indices = G.src_indices + dst_indices = G.dst_indices edge_values = G.edge_values edge_masks = G.edge_masks if edge_values and not G.is_directed(): # Only add upper triangle of the adjacency matrix so we don't double-add edges - mask = row_indices <= col_indices - row_indices = row_indices[mask] - col_indices = col_indices[mask] + mask = src_indices <= dst_indices + src_indices = src_indices[mask] + dst_indices = dst_indices[mask] edge_values = {k: v[mask] for k, v in edge_values.items()} if edge_masks: edge_masks = {k: v[mask] for k, v in edge_masks.items()} - row_indices = row_iter = row_indices.tolist() - col_indices = col_iter = col_indices.tolist() + src_indices = row_iter = src_indices.tolist() + dst_indices = col_iter = dst_indices.tolist() if id_to_key is not None: - row_iter = map(id_to_key.__getitem__, row_indices) - col_iter = map(id_to_key.__getitem__, col_indices) + row_iter = map(id_to_key.__getitem__, src_indices) + col_iter = map(id_to_key.__getitem__, dst_indices) if G.is_multigraph() and (G.edge_keys is not None or G.edge_indices is not None): if G.edge_keys is not None: edge_keys = G.edge_keys diff --git a/python/nx-cugraph/nx_cugraph/tests/test_convert.py b/python/nx-cugraph/nx_cugraph/tests/test_convert.py index 83820f762..1a71b7968 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_convert.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_convert.py @@ -71,8 +71,8 @@ def test_convert(graph_class): ]: # All edges have "x" attribute, so all kwargs are equivalent Gcg = nxcg.from_networkx(G, **kwargs) - cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 0]) cp.testing.assert_array_equal(Gcg.edge_values["x"], [2, 2]) assert len(Gcg.edge_values) == 1 assert Gcg.edge_masks == {} @@ -86,8 +86,8 @@ def test_convert(graph_class): # Structure-only graph (no edge attributes) Gcg = nxcg.from_networkx(G, preserve_node_attrs=True) - cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 0]) cp.testing.assert_array_equal(Gcg.node_values["foo"], [10, 20]) assert Gcg.edge_values == Gcg.edge_masks == {} H = nxcg.to_networkx(Gcg) @@ -99,8 +99,8 @@ def test_convert(graph_class): # Fill completely missing attribute with default value Gcg = nxcg.from_networkx(G, edge_attrs={"y": 0}) - cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 0]) cp.testing.assert_array_equal(Gcg.edge_values["y"], [0, 0]) assert len(Gcg.edge_values) == 1 assert Gcg.edge_masks == Gcg.node_values == Gcg.node_masks == {} @@ -111,8 +111,8 @@ def test_convert(graph_class): # If attribute is completely missing (and no default), then just ignore it Gcg = nxcg.from_networkx(G, edge_attrs={"y": None}) - cp.testing.assert_array_equal(Gcg.row_indices, [0, 1]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 1]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 0]) assert sorted(Gcg.edge_values) == sorted(Gcg.edge_masks) == [] H = nxcg.to_networkx(Gcg) assert list(H.edges(data=True)) == [(0, 1, {})] @@ -123,8 +123,8 @@ def test_convert(graph_class): # Some edges are missing 'x' attribute; need to use a mask for kwargs in [{"preserve_edge_attrs": True}, {"edge_attrs": {"x": None}}]: Gcg = nxcg.from_networkx(G, **kwargs) - cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 2, 0, 0]) assert sorted(Gcg.edge_values) == sorted(Gcg.edge_masks) == ["x"] cp.testing.assert_array_equal(Gcg.edge_masks["x"], [True, False, True, False]) cp.testing.assert_array_equal(Gcg.edge_values["x"][Gcg.edge_masks["x"]], [2, 2]) @@ -160,8 +160,8 @@ def test_convert(graph_class): ]: Gcg = nxcg.from_networkx(G, **kwargs) assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... - cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.edge_values["x"], [1, 2, 1, 2]) assert sorted(Gcg.edge_masks) == ["y"] cp.testing.assert_array_equal(Gcg.edge_masks["y"], [False, True, False, True]) @@ -181,8 +181,8 @@ def test_convert(graph_class): ]: Gcg = nxcg.from_networkx(G, **kwargs) assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... - cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.node_values["foo"], [100, 200, 300]) assert sorted(Gcg.node_masks) == ["bar"] cp.testing.assert_array_equal(Gcg.node_masks["bar"], [False, True, False]) @@ -202,8 +202,8 @@ def test_convert(graph_class): ]: Gcg = nxcg.from_networkx(G, **kwargs) assert Gcg.id_to_key == [10, 20, 30] # Remap node IDs to 0, 1, ... - cp.testing.assert_array_equal(Gcg.row_indices, [0, 0, 1, 2]) - cp.testing.assert_array_equal(Gcg.col_indices, [1, 2, 0, 0]) + cp.testing.assert_array_equal(Gcg.src_indices, [0, 0, 1, 2]) + cp.testing.assert_array_equal(Gcg.dst_indices, [1, 2, 0, 0]) cp.testing.assert_array_equal(Gcg.node_values["bar"], [0, 1000, 0]) assert Gcg.node_masks == {} diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py index ecfda1397..a654ff343 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py @@ -31,6 +31,9 @@ def test_match_signature_and_names(): if is_nx_30_or_31 and name in {"louvain_communities"}: continue + if name not in nx_backends._registered_algorithms: + print(f"{name} not dispatched from networkx") + continue dispatchable_func = nx_backends._registered_algorithms[name] # nx version >=3.2 uses orig_func, version >=3.0,<3.2 uses _orig_func if is_nx_30_or_31: diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 2478a02df..9fec8fa02 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -81,7 +81,10 @@ float_to_top = true default_section = "THIRDPARTY" known_first_party = "nx_cugraph" line_length = 88 -extend_skip_glob = ["nx_cugraph/__init__.py"] +extend_skip_glob = [ + "nx_cugraph/__init__.py", + "nx_cugraph/classes/__init__.py", +] [tool.pytest.ini_options] minversion = "6.0" From f7e821534ebdaa6f9626baca80c8769eab382984 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Mon, 30 Oct 2023 14:01:25 -0500 Subject: [PATCH 281/384] nx-cugraph: handle seed argument in edge_betweenness_centrality (#3943) CC @rlratzel who brought this to my attention and can test this fix Authors: - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3943 --- .../nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py index 104ac8741..210e1f0a2 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py @@ -53,6 +53,7 @@ def edge_betweenness_centrality(G, k=None, normalized=True, weight=None, seed=No raise NotImplementedError( "Weighted implementation of betweenness centrality not currently supported" ) + seed = _seed_to_int(seed) G = _to_graph(G, weight) src_ids, dst_ids, values, _edge_ids = plc.edge_betweenness_centrality( resource_handle=plc.ResourceHandle(), From 27263cbda5816f1a379f79e929b1e966f52671aa Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 31 Oct 2023 14:10:20 -0500 Subject: [PATCH 282/384] Add many graph generators to nx-cugraph (#3954) Also, better handle dtypes for edge values passed to pylibcugraph, which only takes float32 and float64 atm. I also defined `index_dtype` (currently int32) to globally control the dtype of indices. Authors: - Erik Welch (https://github.com/eriknw) - Ralph Liu (https://github.com/nv-rliu) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3954 --- python/nx-cugraph/_nx_cugraph/__init__.py | 45 ++ python/nx-cugraph/lint.yaml | 8 +- python/nx-cugraph/nx_cugraph/__init__.py | 8 +- .../nx_cugraph/algorithms/__init__.py | 3 +- .../algorithms/bipartite/__init__.py | 13 + .../algorithms/bipartite/generators.py | 62 ++ .../nx-cugraph/nx_cugraph/algorithms/core.py | 11 +- python/nx-cugraph/nx_cugraph/classes/graph.py | 188 +++++- .../nx_cugraph/classes/multidigraph.py | 5 + .../nx_cugraph/classes/multigraph.py | 74 ++- python/nx-cugraph/nx_cugraph/convert.py | 78 ++- .../nx-cugraph/nx_cugraph/convert_matrix.py | 146 ++++ .../nx_cugraph/generators/__init__.py | 16 + .../nx_cugraph/generators/_utils.py | 136 ++++ .../nx_cugraph/generators/classic.py | 423 ++++++++++++ .../nx_cugraph/generators/community.py | 45 ++ .../nx-cugraph/nx_cugraph/generators/small.py | 622 ++++++++++++++++++ .../nx_cugraph/generators/social.py | 294 +++++++++ python/nx-cugraph/nx_cugraph/interface.py | 35 + .../nx_cugraph/tests/test_generators.py | 277 ++++++++ .../nx-cugraph/nx_cugraph/tests/test_utils.py | 87 +++ python/nx-cugraph/nx_cugraph/typing.py | 8 + python/nx-cugraph/nx_cugraph/utils/misc.py | 72 +- python/nx-cugraph/pyproject.toml | 3 +- 24 files changed, 2573 insertions(+), 86 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py create mode 100644 python/nx-cugraph/nx_cugraph/convert_matrix.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/_utils.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/classic.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/community.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/small.py create mode 100644 python/nx-cugraph/nx_cugraph/generators/social.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_generators.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_utils.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 965b5b232..af1df0464 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -29,23 +29,68 @@ # "description": "TODO", "functions": { # BEGIN: functions + "barbell_graph", "betweenness_centrality", + "bull_graph", + "caveman_graph", + "chvatal_graph", + "circular_ladder_graph", + "complete_bipartite_graph", + "complete_graph", + "complete_multipartite_graph", + "cubical_graph", + "cycle_graph", + "davis_southern_women_graph", "degree_centrality", + "desargues_graph", + "diamond_graph", + "dodecahedral_graph", "edge_betweenness_centrality", + "empty_graph", + "florentine_families_graph", + "from_pandas_edgelist", + "from_scipy_sparse_array", + "frucht_graph", + "heawood_graph", + "house_graph", + "house_x_graph", + "icosahedral_graph", "in_degree_centrality", "is_isolate", "isolates", "k_truss", + "karate_club_graph", + "krackhardt_kite_graph", + "ladder_graph", + "les_miserables_graph", + "lollipop_graph", "louvain_communities", + "moebius_kantor_graph", + "null_graph", "number_of_isolates", "number_of_selfloops", + "octahedral_graph", "out_degree_centrality", + "pappus_graph", + "path_graph", + "petersen_graph", + "sedgewick_maze_graph", + "star_graph", + "tadpole_graph", + "tetrahedral_graph", + "trivial_graph", + "truncated_cube_graph", + "truncated_tetrahedron_graph", + "turan_graph", + "tutte_graph", + "wheel_graph", # END: functions }, "extra_docstrings": { # BEGIN: extra_docstrings "betweenness_centrality": "`weight` parameter is not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported.", + "from_pandas_edgelist": "cudf.DataFrame inputs also supported.", "louvain_communities": "`seed` parameter is currently ignored.", # END: extra_docstrings }, diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index fef2cebc7..01a806e61 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -45,12 +45,12 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.10.0 + rev: 23.10.1 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.1 + rev: v0.1.3 hooks: - id: ruff args: [--fix-only, --show-fixes] @@ -58,7 +58,7 @@ repos: rev: 6.1.0 hooks: - id: flake8 - args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501'] # Why is this necessary? + args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501', '--extend-ignore=SIM105'] # Why is this necessary? additional_dependencies: &flake8_dependencies # These versions need updated manually - flake8==6.1.0 @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.1 + rev: v0.1.3 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 1eaf3ec6b..25d442122 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -20,11 +20,11 @@ from . import convert from .convert import * -# from . import convert_matrix -# from .convert_matrix import * +from . import convert_matrix +from .convert_matrix import * -# from . import generators -# from .generators import * +from . import generators +from .generators import * from . import algorithms from .algorithms import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 22600bfdc..69feb8f64 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -10,7 +10,8 @@ # 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. -from . import centrality, community +from . import bipartite, centrality, community +from .bipartite import complete_bipartite_graph from .centrality import * from .core import * from .isolate import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py new file mode 100644 index 000000000..062be973d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .generators import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py new file mode 100644 index 000000000..1d3e762b4 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py @@ -0,0 +1,62 @@ +# 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. +from numbers import Integral + +import cupy as cp +import networkx as nx +import numpy as np + +from nx_cugraph.generators._utils import _create_using_class, _number_and_nodes +from nx_cugraph.utils import index_dtype, networkx_algorithm, nodes_or_number + +__all__ = [ + "complete_bipartite_graph", +] + + +@nodes_or_number([0, 1]) +@networkx_algorithm +def complete_bipartite_graph(n1, n2, create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + orig_n1, unused_nodes1 = n1 + orig_n2, unused_nodes2 = n2 + n1, nodes1 = _number_and_nodes(n1) + n2, nodes2 = _number_and_nodes(n2) + all_indices = cp.indices((n1, n2), dtype=index_dtype) + indices0 = all_indices[0].ravel() + indices1 = all_indices[1].ravel() + n1 + del all_indices + src_indices = cp.hstack((indices0, indices1)) + dst_indices = cp.hstack((indices1, indices0)) + bipartite = cp.zeros(n1 + n2, np.int8) + bipartite[n1:] = 1 + if isinstance(orig_n1, Integral) and isinstance(orig_n2, Integral): + nodes = None + else: + nodes = list(range(n1)) if nodes1 is None else nodes1 + nodes.extend(range(n2) if nodes2 is None else nodes2) + if len(set(nodes)) != len(nodes): + raise nx.NetworkXError("Inputs n1 and n2 must contain distinct nodes") + G = graph_class.from_coo( + n1 + n2, + src_indices, + dst_indices, + node_values={"bipartite": bipartite}, + id_to_key=nodes, + name=f"complete_bipartite_graph({orig_n1}, {orig_n2})", + ) + if inplace: + return create_using._become(G) + return G diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index 0a64dd71c..33e797935 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -12,11 +12,10 @@ # limitations under the License. import cupy as cp import networkx as nx -import numpy as np import pylibcugraph as plc import nx_cugraph as nxcg -from nx_cugraph.utils import networkx_algorithm, not_implemented_for +from nx_cugraph.utils import _get_int_dtype, networkx_algorithm, not_implemented_for __all__ = ["k_truss"] @@ -51,8 +50,8 @@ def k_truss(G, k): edge_values = {key: val.copy() for key, val in G.edge_values.items()} edge_masks = {key: val.copy() for key, val in G.edge_masks.items()} else: - # int dtype for edge_indices would be preferred - edge_indices = cp.arange(G.src_indices.size, dtype=np.float64) + edge_dtype = _get_int_dtype(G.src_indices.size - 1) + edge_indices = cp.arange(G.src_indices.size, dtype=edge_dtype) src_indices, dst_indices, edge_indices, _ = plc.k_truss_subgraph( resource_handle=plc.ResourceHandle(), graph=G._get_plc_graph(edge_array=edge_indices), @@ -62,7 +61,9 @@ def k_truss(G, k): # Renumber step 0: node indices node_indices = cp.unique(cp.concatenate([src_indices, dst_indices])) # Renumber step 1: edge values - edge_indices = edge_indices.astype(np.int64) + if edge_indices.dtype != edge_dtype: + # The returned edge_indices may have different dtype (and float) + edge_indices = edge_indices.astype(edge_dtype) edge_values = {key: val[edge_indices] for key, val in G.edge_values.items()} edge_masks = {key: val[edge_indices] for key, val in G.edge_masks.items()} # Renumber step 2: edge indices diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 166b6b9dc..2048c4c3d 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -14,7 +14,7 @@ import operator as op from copy import deepcopy -from typing import TYPE_CHECKING, ClassVar +from typing import TYPE_CHECKING import cupy as cp import networkx as nx @@ -23,8 +23,11 @@ import nx_cugraph as nxcg +from ..utils import index_dtype + if TYPE_CHECKING: # pragma: no cover from collections.abc import Iterable, Iterator + from typing import ClassVar from nx_cugraph.typing import ( AttrKey, @@ -34,6 +37,7 @@ IndexValue, NodeKey, NodeValue, + any_ndarray, ) __all__ = ["Graph"] @@ -51,17 +55,38 @@ class Graph: graph_attr_dict_factory: ClassVar[type] = dict # Not networkx properties - # We store edge data in COO format with {row,col}_indices and edge_values. + # We store edge data in COO format with {src,dst}_indices and edge_values. src_indices: cp.ndarray[IndexValue] dst_indices: cp.ndarray[IndexValue] edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] edge_masks: dict[AttrKey, cp.ndarray[bool]] - node_values: dict[AttrKey, cp.ndarray[NodeValue]] - node_masks: dict[AttrKey, cp.ndarray[bool]] + node_values: dict[AttrKey, any_ndarray[NodeValue]] + node_masks: dict[AttrKey, any_ndarray[bool]] key_to_id: dict[NodeKey, IndexValue] | None _id_to_key: list[NodeKey] | None _N: int + # Used by graph._get_plc_graph + _plc_type_map: ClassVar[dict[np.dtype, np.dtype]] = { + # signed int + np.dtype(np.int8): np.dtype(np.float32), + np.dtype(np.int16): np.dtype(np.float32), + np.dtype(np.int32): np.dtype(np.float64), + np.dtype(np.int64): np.dtype(np.float64), # raise if abs(x) > 2**53 + # unsigned int + np.dtype(np.uint8): np.dtype(np.float32), + np.dtype(np.uint16): np.dtype(np.float32), + np.dtype(np.uint32): np.dtype(np.float64), + np.dtype(np.uint64): np.dtype(np.float64), # raise if x > 2**53 + # other + np.dtype(np.bool_): np.dtype(np.float16), + np.dtype(np.float16): np.dtype(np.float32), + } + _plc_allowed_edge_types: ClassVar[set[np.dtype]] = { + np.dtype(np.float32), + np.dtype(np.float64), + } + #################### # Creation methods # #################### @@ -74,8 +99,8 @@ def from_coo( dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -111,6 +136,27 @@ def from_coo( raise ValueError if new_graph._id_to_key is not None and len(new_graph._id_to_key) != N: raise ValueError + if new_graph._id_to_key is not None and new_graph.key_to_id is None: + try: + new_graph.key_to_id = dict(zip(new_graph._id_to_key, range(N))) + except TypeError as exc: + raise ValueError("Bad type of a node value") from exc + if new_graph.src_indices.dtype != index_dtype: + src_indices = new_graph.src_indices.astype(index_dtype) + if not (new_graph.src_indices == src_indices).all(): + raise ValueError( + f"Unable to convert src_indices to {src_indices.dtype.name} " + f"(got {new_graph.src_indices.dtype.name})." + ) + new_graph.src_indices = src_indices + if new_graph.dst_indices.dtype != index_dtype: + dst_indices = new_graph.dst_indices.astype(index_dtype) + if not (new_graph.dst_indices == dst_indices).all(): + raise ValueError( + f"Unable to convert dst_indices to {dst_indices.dtype.name} " + f"(got {new_graph.dst_indices.dtype.name})." + ) + new_graph.dst_indices = dst_indices return new_graph @classmethod @@ -120,8 +166,8 @@ def from_csr( dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -130,7 +176,7 @@ def from_csr( N = indptr.size - 1 src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + np.repeat(np.arange(N, dtype=index_dtype), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -152,8 +198,8 @@ def from_csc( src_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -162,7 +208,7 @@ def from_csc( N = indptr.size - 1 dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + np.repeat(np.arange(N, dtype=index_dtype), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -181,13 +227,13 @@ def from_csc( def from_dcsr( cls, N: int, - compressed_rows: cp.ndarray[IndexValue], + compressed_srcs: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], dst_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -195,7 +241,7 @@ def from_dcsr( ) -> Graph: src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(compressed_rows.get(), cp.diff(indptr).get()) + np.repeat(compressed_srcs.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -214,13 +260,13 @@ def from_dcsr( def from_dcsc( cls, N: int, - compressed_cols: cp.ndarray[IndexValue], + compressed_dsts: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], src_indices: cp.ndarray[IndexValue], edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -228,7 +274,7 @@ def from_dcsc( ) -> Graph: dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(compressed_cols.get(), cp.diff(indptr).get()) + np.repeat(compressed_dsts.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -245,7 +291,9 @@ def from_dcsc( def __new__(cls, incoming_graph_data=None, **attr) -> Graph: if incoming_graph_data is None: - new_graph = cls.from_coo(0, cp.empty(0, np.int32), cp.empty(0, np.int32)) + new_graph = cls.from_coo( + 0, cp.empty(0, index_dtype), cp.empty(0, index_dtype) + ) elif incoming_graph_data.__class__ is cls: new_graph = incoming_graph_data.copy() elif incoming_graph_data.__class__ is cls.to_networkx_class(): @@ -336,6 +384,17 @@ def __len__(self) -> int: # NetworkX graph methods # ########################## + @networkx_api + def add_nodes_from(self, nodes_for_adding: Iterable[NodeKey], **attr) -> None: + if self._N != 0: + raise NotImplementedError( + "add_nodes_from is not implemented for graph that already has nodes." + ) + G = self.to_networkx_class()() + G.add_nodes_from(nodes_for_adding, **attr) + G = nxcg.from_networkx(G, preserve_node_attrs=True) + self._become(G) + @networkx_api def clear(self) -> None: self.edge_values.clear() @@ -522,11 +581,38 @@ def _get_plc_graph( # Mask is all True; don't need anymore del self.edge_masks[edge_attr] edge_array = self.edge_values[edge_attr] + if edge_array is not None: + if edge_dtype is not None: + edge_dtype = np.dtype(edge_dtype) + if edge_array.dtype != edge_dtype: + edge_array = edge_array.astype(edge_dtype) + # PLC doesn't handle int edge weights right now, so cast int to float + if edge_array.dtype in self._plc_type_map: + if edge_array.dtype == np.int64: + if (val := edge_array.max().tolist()) > 2**53: + raise ValueError( + f"Integer value of value is too large (> 2**53): {val}; " + "pylibcugraph only supports float16 and float32 dtypes." + ) + if (val := edge_array.min().tolist()) < -(2**53): + raise ValueError( + f"Integer value of value is small large (< -2**53): {val}; " + "pylibcugraph only supports float16 and float32 dtypes." + ) + elif ( + edge_array.dtype == np.uint64 + and edge_array.max().tolist() > 2**53 + ): + raise ValueError( + f"Integer value of value is too large (> 2**53): {val}; " + "pylibcugraph only supports float16 and float32 dtypes." + ) + # Consider warning here if we add algorithms that may + # introduce roundoff errors when using floats as ints. + edge_array = edge_array.astype(self._plc_type_map[edge_array.dtype]) + elif edge_array.dtype not in self._plc_allowed_edge_types: + raise TypeError(edge_array.dtype) # Should we cache PLC graph? - if edge_dtype is not None: - edge_dtype = np.dtype(edge_dtype) - if edge_array.dtype != edge_dtype: - edge_array = edge_array.astype(edge_dtype) return plc.SGGraph( resource_handle=plc.ResourceHandle(), graph_properties=plc.GraphProperties( @@ -541,12 +627,60 @@ def _get_plc_graph( do_expensive_check=False, ) + def _sort_edge_indices(self, primary="src"): + # DRY warning: see also MultiGraph._sort_edge_indices + if primary == "src": + stacked = cp.vstack((self.dst_indices, self.src_indices)) + elif primary == "dst": + stacked = cp.vstack((self.src_indices, self.dst_indices)) + else: + raise ValueError( + f'Bad `primary` argument; expected "src" or "dst", got {primary!r}' + ) + indices = cp.lexsort(stacked) + if (cp.diff(indices) > 0).all(): + # Already sorted + return + self.src_indices = self.src_indices[indices] + self.dst_indices = self.dst_indices[indices] + self.edge_values.update( + {key: val[indices] for key, val in self.edge_values.items()} + ) + self.edge_masks.update( + {key: val[indices] for key, val in self.edge_masks.items()} + ) + + def _become(self, other: Graph): + if self.__class__ is not other.__class__: + raise TypeError( + "Attempting to update graph inplace with graph of different type!" + ) + self.clear() + edge_values = self.edge_values + edge_masks = self.edge_masks + node_values = self.node_values + node_masks = self.node_masks + graph = self.graph + edge_values.update(other.edge_values) + edge_masks.update(other.edge_masks) + node_values.update(other.node_values) + node_masks.update(other.node_masks) + graph.update(other.graph) + self.__dict__.update(other.__dict__) + self.edge_values = edge_values + self.edge_masks = edge_masks + self.node_values = node_values + self.node_masks = node_masks + self.graph = graph + return self + def _degrees_array(self): degrees = cp.bincount(self.src_indices, minlength=self._N) if self.is_directed(): degrees += cp.bincount(self.dst_indices, minlength=self._N) return degrees + # Data conversions def _nodeiter_to_iter(self, node_ids: Iterable[IndexValue]) -> Iterable[NodeKey]: """Convert an iterable of node IDs to an iterable of node keys.""" if (id_to_key := self.id_to_key) is not None: @@ -567,7 +701,7 @@ def _nodearray_to_dict( return dict(it) def _nodearrays_to_dict( - self, node_ids: cp.ndarray[IndexValue], values: cp.ndarray[NodeValue] + self, node_ids: cp.ndarray[IndexValue], values: any_ndarray[NodeValue] ) -> dict[NodeKey, NodeValue]: it = zip(node_ids.tolist(), values.tolist()) if (id_to_key := self.id_to_key) is not None: @@ -597,7 +731,7 @@ def _dict_to_nodearrays( indices_iter = d else: indices_iter = map(self.key_to_id.__getitem__, d) - node_ids = cp.fromiter(indices_iter, np.int32) + node_ids = cp.fromiter(indices_iter, index_dtype) if dtype is None: values = cp.array(list(d.values())) else: diff --git a/python/nx-cugraph/nx_cugraph/classes/multidigraph.py b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py index 5629e2c9c..2c7bfc007 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multidigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py @@ -25,6 +25,11 @@ class MultiDiGraph(MultiGraph, DiGraph): + @classmethod + @networkx_api + def is_directed(cls) -> bool: + return True + @classmethod def to_networkx_class(cls) -> type[nx.MultiDiGraph]: return nx.MultiDiGraph diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py index 3d90861a3..23466dc7d 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -21,6 +21,7 @@ import nx_cugraph as nxcg +from ..utils import index_dtype from .graph import Graph if TYPE_CHECKING: @@ -31,6 +32,7 @@ IndexValue, NodeKey, NodeValue, + any_ndarray, ) __all__ = ["MultiGraph"] @@ -43,11 +45,11 @@ class MultiGraph(Graph): # Not networkx properties - # In a MultiGraph, each edge has a unique `(row, col, key)` key. + # In a MultiGraph, each edge has a unique `(src, dst, key)` key. # By default, `key` is 0 if possible, else 1, else 2, etc. # This key can be any hashable Python object in NetworkX. # We don't use a dict for our data structure here, because - # that would require a `(row, col, key)` key. + # that would require a `(src, dst, key)` key. # Instead, we keep `edge_keys` and/or `edge_indices`. # `edge_keys` is the list of Python objects for each edge. # `edge_indices` is for the common case of default multiedge keys, @@ -72,8 +74,8 @@ def from_coo( edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -110,8 +112,8 @@ def from_csr( edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -121,7 +123,7 @@ def from_csr( N = indptr.size - 1 src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + np.repeat(np.arange(N, dtype=index_dtype), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -146,8 +148,8 @@ def from_csc( edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -157,7 +159,7 @@ def from_csc( N = indptr.size - 1 dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(np.arange(N, dtype=np.int32), cp.diff(indptr).get()) + np.repeat(np.arange(N, dtype=index_dtype), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -178,14 +180,14 @@ def from_csc( def from_dcsr( cls, N: int, - compressed_rows: cp.ndarray[IndexValue], + compressed_srcs: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], dst_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -194,7 +196,7 @@ def from_dcsr( ) -> MultiGraph: src_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(compressed_rows.get(), cp.diff(indptr).get()) + np.repeat(compressed_srcs.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -215,14 +217,14 @@ def from_dcsr( def from_dcsc( cls, N: int, - compressed_cols: cp.ndarray[IndexValue], + compressed_dsts: cp.ndarray[IndexValue], indptr: cp.ndarray[IndexValue], src_indices: cp.ndarray[IndexValue], edge_indices: cp.ndarray[IndexValue] | None = None, edge_values: dict[AttrKey, cp.ndarray[EdgeValue]] | None = None, edge_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, - node_values: dict[AttrKey, cp.ndarray[NodeValue]] | None = None, - node_masks: dict[AttrKey, cp.ndarray[bool]] | None = None, + node_values: dict[AttrKey, any_ndarray[NodeValue]] | None = None, + node_masks: dict[AttrKey, any_ndarray[bool]] | None = None, *, key_to_id: dict[NodeKey, IndexValue] | None = None, id_to_key: list[NodeKey] | None = None, @@ -231,7 +233,7 @@ def from_dcsc( ) -> Graph: dst_indices = cp.array( # cp.repeat is slow to use here, so use numpy instead - np.repeat(compressed_cols.get(), cp.diff(indptr).get()) + np.repeat(compressed_dsts.get(), cp.diff(indptr).get()) ) return cls.from_coo( N, @@ -449,3 +451,39 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): else: rv.graph.update(deepcopy(self.graph)) return rv + + def _sort_edge_indices(self, primary="src"): + # DRY warning: see also Graph._sort_edge_indices + if self.edge_indices is None and self.edge_keys is None: + return super()._sort_edge_indices(primary=primary) + if primary == "src": + if self.edge_indices is None: + stacked = (self.dst_indices, self.src_indices) + else: + stacked = (self.edge_indices, self.dst_indices, self.src_indices) + elif primary == "dst": + if self.edge_indices is None: + stacked = (self.src_indices, self.dst_indices) + else: + stacked = (self.edge_indices, self.dst_indices, self.src_indices) + else: + raise ValueError( + f'Bad `primary` argument; expected "src" or "dst", got {primary!r}' + ) + indices = cp.lexsort(cp.vstack(stacked)) + if (cp.diff(indices) > 0).all(): + # Already sorted + return + self.src_indices = self.src_indices[indices] + self.dst_indices = self.dst_indices[indices] + self.edge_values.update( + {key: val[indices] for key, val in self.edge_values.items()} + ) + self.edge_masks.update( + {key: val[indices] for key, val in self.edge_masks.items()} + ) + if self.edge_indices is not None: + self.edge_indices = self.edge_indices[indices] + if self.edge_keys is not None: + edge_keys = self.edge_keys + self.edge_keys = [edge_keys[i] for i in indices.tolist()] diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index d117c8e5c..3c0814370 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -24,8 +24,10 @@ import nx_cugraph as nxcg +from .utils import index_dtype + if TYPE_CHECKING: # pragma: no cover - from nx_cugraph.typing import AttrKey, Dtype, EdgeValue, NodeValue + from nx_cugraph.typing import AttrKey, Dtype, EdgeValue, NodeValue, any_ndarray __all__ = [ "from_networkx", @@ -256,7 +258,7 @@ def from_networkx( node_attrs[attr] = REQUIRED key_to_id = dict(zip(adj, range(N))) - col_iter = concat(adj.values()) + dst_iter = concat(adj.values()) try: no_renumber = all(k == v for k, v in key_to_id.items()) except Exception: @@ -264,11 +266,11 @@ def from_networkx( if no_renumber: key_to_id = None else: - col_iter = map(key_to_id.__getitem__, col_iter) + dst_iter = map(key_to_id.__getitem__, dst_iter) if graph.is_multigraph(): - dst_indices = np.fromiter(col_iter, np.int32) + dst_indices = np.fromiter(dst_iter, index_dtype) num_multiedges = np.fromiter( - map(len, concat(map(dict.values, adj.values()))), np.int32 + map(len, concat(map(dict.values, adj.values()))), index_dtype ) # cp.repeat is slow to use here, so use numpy instead dst_indices = cp.array(np.repeat(dst_indices, num_multiedges)) @@ -276,12 +278,12 @@ def from_networkx( edge_keys = list(concat(concat(map(dict.values, adj.values())))) edge_indices = cp.fromiter( concat(map(range, map(len, concat(map(dict.values, adj.values()))))), - np.int32, + index_dtype, ) if edge_keys == edge_indices.tolist(): edge_keys = None # Prefer edge_indices else: - dst_indices = cp.fromiter(col_iter, np.int32) + dst_indices = cp.fromiter(dst_iter, index_dtype) edge_values = {} edge_masks = {} @@ -354,7 +356,8 @@ def from_networkx( # cp.repeat is slow to use here, so use numpy instead src_indices = np.repeat( - np.arange(N, dtype=np.int32), np.fromiter(map(len, adj.values()), np.int32) + np.arange(N, dtype=index_dtype), + np.fromiter(map(len, adj.values()), index_dtype), ) if graph.is_multigraph(): src_indices = np.repeat(src_indices, num_multiedges) @@ -383,8 +386,18 @@ def from_networkx( or present for node_id in adj ) - node_masks[node_attr] = cp.fromiter(iter_mask, bool) - node_values[node_attr] = cp.array(vals, dtype) + # Node values may be numpy or cupy arrays (useful for str, object, etc). + # Someday we'll let the user choose np or cp, and support edge values. + node_mask = np.fromiter(iter_mask, bool) + node_value = np.array(vals, dtype) + try: + node_value = cp.array(node_value) + except ValueError: + pass + else: + node_mask = cp.array(node_mask) + node_values[node_attr] = node_value + node_masks[node_attr] = node_mask # if vals.ndim > 1: ... else: if node_default is REQUIRED: @@ -393,10 +406,17 @@ def from_networkx( iter_values = ( nodes[node_id].get(node_attr, node_default) for node_id in adj ) + # Node values may be numpy or cupy arrays (useful for str, object, etc). + # Someday we'll let the user choose np or cp, and support edge values. if dtype is None: - node_values[node_attr] = cp.array(list(iter_values)) + node_value = np.array(list(iter_values)) else: - node_values[node_attr] = cp.fromiter(iter_values, dtype) + node_value = np.fromiter(iter_values, dtype) + try: + node_value = cp.array(node_value) + except ValueError: + pass + node_values[node_attr] = node_value # if vals.ndim > 1: ... if graph.is_multigraph(): if graph.is_directed() or as_directed: @@ -436,8 +456,8 @@ def from_networkx( def _iter_attr_dicts( - values: dict[AttrKey, cp.ndarray[EdgeValue | NodeValue]], - masks: dict[AttrKey, cp.ndarray[bool]], + values: dict[AttrKey, any_ndarray[EdgeValue | NodeValue]], + masks: dict[AttrKey, any_ndarray[bool]], ): full_attrs = list(values.keys() - masks.keys()) if full_attrs: @@ -463,7 +483,7 @@ def _iter_attr_dicts( return full_dicts -def to_networkx(G: nxcg.Graph) -> nx.Graph: +def to_networkx(G: nxcg.Graph, *, sort_edges: bool = False) -> nx.Graph: """Convert a nx_cugraph graph to networkx graph. All edge and node attributes and ``G.graph`` properties are converted. @@ -471,6 +491,11 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: Parameters ---------- G : nx_cugraph.Graph + sort_edges : bool, default False + Whether to sort the edge data of the input graph by (src, dst) indices + before converting. This can be useful to convert to networkx graphs + that iterate over edges consistently since edges are stored in dicts + in the order they were added. Returns ------- @@ -482,6 +507,8 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: """ rv = G.to_networkx_class()() id_to_key = G.id_to_key + if sort_edges: + G._sort_edge_indices() node_values = G.node_values node_masks = G.node_masks @@ -500,19 +527,20 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: dst_indices = G.dst_indices edge_values = G.edge_values edge_masks = G.edge_masks - if edge_values and not G.is_directed(): + if not G.is_directed(): # Only add upper triangle of the adjacency matrix so we don't double-add edges mask = src_indices <= dst_indices src_indices = src_indices[mask] dst_indices = dst_indices[mask] - edge_values = {k: v[mask] for k, v in edge_values.items()} + if edge_values: + edge_values = {k: v[mask] for k, v in edge_values.items()} if edge_masks: edge_masks = {k: v[mask] for k, v in edge_masks.items()} - src_indices = row_iter = src_indices.tolist() - dst_indices = col_iter = dst_indices.tolist() + src_indices = src_iter = src_indices.tolist() + dst_indices = dst_iter = dst_indices.tolist() if id_to_key is not None: - row_iter = map(id_to_key.__getitem__, src_indices) - col_iter = map(id_to_key.__getitem__, dst_indices) + src_iter = map(id_to_key.__getitem__, src_indices) + dst_iter = map(id_to_key.__getitem__, dst_indices) if G.is_multigraph() and (G.edge_keys is not None or G.edge_indices is not None): if G.edge_keys is not None: edge_keys = G.edge_keys @@ -520,14 +548,14 @@ def to_networkx(G: nxcg.Graph) -> nx.Graph: edge_keys = G.edge_indices.tolist() if edge_values: full_edge_dicts = _iter_attr_dicts(edge_values, edge_masks) - rv.add_edges_from(zip(row_iter, col_iter, edge_keys, full_edge_dicts)) + rv.add_edges_from(zip(src_iter, dst_iter, edge_keys, full_edge_dicts)) else: - rv.add_edges_from(zip(row_iter, col_iter, edge_keys)) + rv.add_edges_from(zip(src_iter, dst_iter, edge_keys)) elif edge_values: full_edge_dicts = _iter_attr_dicts(edge_values, edge_masks) - rv.add_edges_from(zip(row_iter, col_iter, full_edge_dicts)) + rv.add_edges_from(zip(src_iter, dst_iter, full_edge_dicts)) else: - rv.add_edges_from(zip(row_iter, col_iter)) + rv.add_edges_from(zip(src_iter, dst_iter)) rv.graph.update(G.graph) return rv diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py new file mode 100644 index 000000000..6c8b8fb4a --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py @@ -0,0 +1,146 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np + +from .generators._utils import _create_using_class +from .utils import index_dtype, networkx_algorithm + +__all__ = [ + "from_pandas_edgelist", + "from_scipy_sparse_array", +] + + +@networkx_algorithm +def from_pandas_edgelist( + df, + source="source", + target="target", + edge_attr=None, + create_using=None, + edge_key=None, +): + """cudf.DataFrame inputs also supported.""" + graph_class, inplace = _create_using_class(create_using) + src_array = df[source].to_numpy() + dst_array = df[target].to_numpy() + # Renumber step 0: node keys + nodes = np.unique(np.concatenate([src_array, dst_array])) + N = nodes.size + kwargs = {} + if N > 0 and ( + nodes[0] != 0 + or nodes[N - 1] != N - 1 + or ( + nodes.dtype.kind not in {"i", "u"} + and not (nodes == np.arange(N, dtype=np.int64)).all() + ) + ): + # We need to renumber indices--np.searchsorted to the rescue! + kwargs["id_to_key"] = nodes.tolist() + src_indices = cp.array(np.searchsorted(nodes, src_array), index_dtype) + dst_indices = cp.array(np.searchsorted(nodes, dst_array), index_dtype) + else: + src_indices = cp.array(src_array) + dst_indices = cp.array(dst_array) + + if not graph_class.is_directed(): + # Symmetrize the edges + mask = src_indices != dst_indices + if mask.all(): + mask = None + src_indices, dst_indices = ( + cp.hstack( + (src_indices, dst_indices[mask] if mask is not None else dst_indices) + ), + cp.hstack( + (dst_indices, src_indices[mask] if mask is not None else src_indices) + ), + ) + + if edge_attr is not None: + # Additional columns requested for edge data + if edge_attr is True: + attr_col_headings = df.columns.difference({source, target}).to_list() + elif isinstance(edge_attr, (list, tuple)): + attr_col_headings = edge_attr + else: + attr_col_headings = [edge_attr] + if len(attr_col_headings) == 0: + raise nx.NetworkXError( + "Invalid edge_attr argument: No columns found with name: " + f"{attr_col_headings}" + ) + try: + edge_values = { + key: cp.array(val.to_numpy()) + for key, val in df[attr_col_headings].items() + } + except (KeyError, TypeError) as exc: + raise nx.NetworkXError(f"Invalid edge_attr argument: {edge_attr}") from exc + + if not graph_class.is_directed(): + # Symmetrize the edges + edge_values = { + key: cp.hstack((val, val[mask] if mask is not None else val)) + for key, val in edge_values.items() + } + kwargs["edge_values"] = edge_values + + if graph_class.is_multigraph() and edge_key is not None: + try: + edge_keys = df[edge_key].to_list() + except (KeyError, TypeError) as exc: + raise nx.NetworkXError( + f"Invalid edge_key argument: {edge_key}" + ) from exc + if not graph_class.is_directed(): + # Symmetrize the edges + edge_keys = cp.hstack( + (edge_keys, edge_keys[mask] if mask is not None else edge_keys) + ) + kwargs["edge_keys"] = edge_keys + + G = graph_class.from_coo(N, src_indices, dst_indices, **kwargs) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def from_scipy_sparse_array( + A, parallel_edges=False, create_using=None, edge_attribute="weight" +): + graph_class, inplace = _create_using_class(create_using) + m, n = A.shape + if m != n: + raise nx.NetworkXError(f"Adjacency matrix not square: nx,ny={A.shape}") + if A.format != "coo": + A = A.tocoo() + if A.dtype.kind in {"i", "u"} and graph_class.is_multigraph() and parallel_edges: + src_indices = cp.array(np.repeat(A.row, A.data), index_dtype) + dst_indices = cp.array(np.repeat(A.col, A.data), index_dtype) + weight = cp.empty(src_indices.size, A.data.dtype) + weight[:] = 1 + else: + src_indices = cp.array(A.row, index_dtype) + dst_indices = cp.array(A.col, index_dtype) + weight = cp.array(A.data) + G = graph_class.from_coo( + n, src_indices, dst_indices, edge_values={"weight": weight} + ) + if inplace: + return create_using._become(G) + return G diff --git a/python/nx-cugraph/nx_cugraph/generators/__init__.py b/python/nx-cugraph/nx_cugraph/generators/__init__.py new file mode 100644 index 000000000..c1834a4de --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/__init__.py @@ -0,0 +1,16 @@ +# 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. +from .classic import * +from .community import * +from .small import * +from .social import * diff --git a/python/nx-cugraph/nx_cugraph/generators/_utils.py b/python/nx-cugraph/nx_cugraph/generators/_utils.py new file mode 100644 index 000000000..e38ace5b2 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/_utils.py @@ -0,0 +1,136 @@ +# 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. +import operator as op + +import cupy as cp +import networkx as nx + +import nx_cugraph as nxcg + +from ..utils import index_dtype + +# 3.2.1 fixed some issues in generators that occur in 3.2 and earlier +_IS_NX32_OR_LESS = (nxver := nx.__version__)[:3] <= "3.2" and ( + len(nxver) <= 3 or nxver[3] != "." and not nxver[3].isdigit() +) + + +def _ensure_int(n): + """Ensure n is integral.""" + return op.index(n) + + +def _ensure_nonnegative_int(n): + """Ensure n is a nonnegative integer.""" + n = op.index(n) + if n < 0: + raise nx.NetworkXError(f"Negative number of nodes not valid: {n}") + return n + + +def _complete_graph_indices(n): + all_indices = cp.indices((n, n), dtype=index_dtype) + src_indices = all_indices[0].ravel() + dst_indices = all_indices[1].ravel() + del all_indices + mask = src_indices != dst_indices + return (src_indices[mask], dst_indices[mask]) + + +def _common_small_graph(n, nodes, create_using, *, allow_directed=True): + """Create a "common graph" for small n. + + n == 0: empty graph + n == 1: empty graph + n == 2: complete graph + n > 2: undefined + """ + graph_class, inplace = _create_using_class(create_using) + if not allow_directed and graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + if n < 2: + G = graph_class.from_coo( + n, cp.empty(0, index_dtype), cp.empty(0, index_dtype), id_to_key=nodes + ) + else: + G = graph_class.from_coo( + n, + cp.arange(2, dtype=index_dtype), + cp.array([1, 0], index_dtype), + id_to_key=nodes, + ) + if inplace: + return create_using._become(G) + return G + + +def _create_using_class(create_using, *, default=nxcg.Graph): + """Handle ``create_using`` argument and return a Graph type from nx_cugraph.""" + inplace = False + if create_using is None: + G = default() + elif isinstance(create_using, type): + G = create_using() + elif not hasattr(create_using, "is_directed") or not hasattr( + create_using, "is_multigraph" + ): + raise TypeError("create_using is not a valid graph type or instance") + elif not isinstance(create_using, nxcg.Graph): + raise NotImplementedError( + f"create_using with object of type {type(create_using)} is not supported " + "by the cugraph backend; only nx_cugraph.Graph objects are allowed." + ) + else: + inplace = True + G = create_using + G.clear() + if not isinstance(G, nxcg.Graph): + if G.is_multigraph(): + if G.is_directed(): + graph_class = nxcg.MultiDiGraph + else: + graph_class = nxcg.MultiGraph + elif G.is_directed(): + graph_class = nxcg.DiGraph + else: + graph_class = nxcg.Graph + if G.__class__ not in {nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph}: + raise NotImplementedError( + f"create_using with type {type(G)} is not supported by the cugraph " + "backend; only standard networkx or nx_cugraph Graph objects are " + "allowed (but not customized subclasses derived from them)." + ) + else: + graph_class = G.__class__ + return graph_class, inplace + + +def _number_and_nodes(n_and_nodes): + n, nodes = n_and_nodes + try: + n = op.index(n) + except TypeError: + n = len(nodes) + if n < 0: + raise nx.NetworkXError(f"Negative number of nodes not valid: {n}") + if not isinstance(nodes, list): + nodes = list(nodes) + if not nodes: + return (n, None) + if nodes[0] == 0 and nodes[n - 1] == n - 1: + try: + if nodes == list(range(n)): + return (n, None) + except Exception: + pass + return (n, nodes) diff --git a/python/nx-cugraph/nx_cugraph/generators/classic.py b/python/nx-cugraph/nx_cugraph/generators/classic.py new file mode 100644 index 000000000..b196c2323 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/classic.py @@ -0,0 +1,423 @@ +# 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. +import itertools +from numbers import Integral + +import cupy as cp +import networkx as nx +import numpy as np + +import nx_cugraph as nxcg + +from ..utils import _get_int_dtype, index_dtype, networkx_algorithm, nodes_or_number +from ._utils import ( + _IS_NX32_OR_LESS, + _common_small_graph, + _complete_graph_indices, + _create_using_class, + _ensure_int, + _ensure_nonnegative_int, + _number_and_nodes, +) + +__all__ = [ + "barbell_graph", + "circular_ladder_graph", + "complete_graph", + "complete_multipartite_graph", + "cycle_graph", + "empty_graph", + "ladder_graph", + "lollipop_graph", + "null_graph", + "path_graph", + "star_graph", + "tadpole_graph", + "trivial_graph", + "turan_graph", + "wheel_graph", +] + +concat = itertools.chain.from_iterable + + +@networkx_algorithm +def barbell_graph(m1, m2, create_using=None): + # Like two complete graphs and a path_graph + m1 = _ensure_nonnegative_int(m1) + if m1 < 2: + raise nx.NetworkXError("Invalid graph description, m1 should be >=2") + m2 = _ensure_nonnegative_int(m2) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_bell1, dst_bell1 = _complete_graph_indices(m1) + src_bell2 = src_bell1 + (m1 + m2) + dst_bell2 = dst_bell1 + (m1 + m2) + if m2 == 0: + src_bar = cp.array([m1 - 1, m1], index_dtype) + dst_bar = cp.array([m1, m1 - 1], index_dtype) + else: + src_bar = cp.arange(2 * m1 - 1, 2 * m1 + 2 * m2 + 1, dtype=index_dtype) // 2 + dst_bar = ( + cp.arange(m1 - 1, m1 + m2 + 1, dtype=index_dtype)[:, None] + + cp.array([-1, 1], index_dtype) + ).ravel()[1:-1] + src_indices = cp.hstack((src_bell1, src_bar, src_bell2)) + dst_indices = cp.hstack((dst_bell1, dst_bar, dst_bell2)) + G = graph_class.from_coo(2 * m1 + m2, src_indices, dst_indices) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def circular_ladder_graph(n, create_using=None): + return _ladder_graph(n, create_using, is_circular=True) + + +@nodes_or_number(0) +@networkx_algorithm +def complete_graph(n, create_using=None): + n, nodes = _number_and_nodes(n) + if n < 3: + return _common_small_graph(n, nodes, create_using) + graph_class, inplace = _create_using_class(create_using) + src_indices, dst_indices = _complete_graph_indices(n) + G = graph_class.from_coo(n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def complete_multipartite_graph(*subset_sizes): + if not subset_sizes: + return nxcg.Graph() + try: + subset_sizes = [_ensure_int(size) for size in subset_sizes] + except TypeError: + subsets = [list(subset) for subset in subset_sizes] + subset_sizes = [len(subset) for subset in subsets] + nodes = list(concat(subsets)) + else: + subsets = nodes = None + try: + subset_sizes = [_ensure_nonnegative_int(size) for size in subset_sizes] + except nx.NetworkXError: + if _IS_NX32_OR_LESS: + raise NotImplementedError("Negative number of nodes is not supported") + raise + L1 = [] + L2 = [] + total = 0 + for size in subset_sizes: + all_indices = cp.indices((total, size), dtype=index_dtype) + L1.append(all_indices[0].ravel()) + L2.append(all_indices[1].ravel() + total) + total += size + src_indices = cp.hstack(L1 + L2) + dst_indices = cp.hstack(L2 + L1) + subsets_array = cp.array( + np.repeat( + np.arange(len(subset_sizes), dtype=_get_int_dtype(len(subset_sizes) - 1)), + subset_sizes, + ) + ) + return nxcg.Graph.from_coo( + subsets_array.size, + src_indices, + dst_indices, + node_values={"subset": subsets_array}, + id_to_key=nodes, + ) + + +@nodes_or_number(0) +@networkx_algorithm +def cycle_graph(n, create_using=None): + n, nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using) + if n == 1: + src_indices = cp.zeros(1, index_dtype) + dst_indices = cp.zeros(1, index_dtype) + elif n == 2 and graph_class.is_multigraph() and not graph_class.is_directed(): + # This is kind of a peculiar edge case + src_indices = cp.array([0, 0, 1, 1], index_dtype) + dst_indices = cp.array([1, 1, 0, 0], index_dtype) + elif n < 3: + return _common_small_graph(n, nodes, create_using) + elif graph_class.is_directed(): + src_indices = cp.arange(n, dtype=index_dtype) + dst_indices = cp.arange(1, n + 1, dtype=index_dtype) + dst_indices[-1] = 0 + else: + src_indices = cp.arange(2 * n, dtype=index_dtype) // 2 + dst_indices = ( + cp.arange(n, dtype=index_dtype)[:, None] + cp.array([-1, 1], index_dtype) + ).ravel() + dst_indices[0] = n - 1 + dst_indices[-1] = 0 + G = graph_class.from_coo(n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@nodes_or_number(0) +@networkx_algorithm +def empty_graph(n=0, create_using=None, default=nx.Graph): + n, nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using, default=default) + G = graph_class.from_coo( + n, cp.empty(0, index_dtype), cp.empty(0, index_dtype), id_to_key=nodes + ) + if inplace: + return create_using._become(G) + return G + + +def _ladder_graph(n, create_using, *, is_circular=False): + # Like path path_graph with extra arange, and middle link missing + n = _ensure_nonnegative_int(n) + if n < 2: + if not is_circular: + return _common_small_graph(2 * n, None, create_using, allow_directed=False) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + if n == 1: + src_indices = cp.array([0, 1, 0, 1], index_dtype) + dst_indices = cp.array([0, 0, 1, 1], index_dtype) + nodes = None + elif graph_class.is_multigraph(): + src_indices = cp.array([0, 0, 1, 1], index_dtype) + dst_indices = cp.array([1, 1, 0, 0], index_dtype) + nodes = [0, -1] + else: + src_indices = cp.array([0, 1], index_dtype) + dst_indices = cp.array([1, 0], index_dtype) + nodes = [0, -1] + G = graph_class.from_coo(2, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + path_src = cp.arange(1, 2 * n - 1, dtype=index_dtype) // 2 + path_dst = ( + cp.arange(n, dtype=index_dtype)[:, None] + cp.array([-1, 1], index_dtype) + ).ravel()[1:-1] + srcs = [path_src, path_src + n, cp.arange(2 * n, dtype=index_dtype)] + dsts = [ + path_dst, + path_dst + n, + cp.arange(n, 2 * n, dtype=index_dtype), + cp.arange(0, n, dtype=index_dtype), + ] + if is_circular and (n > 2 or graph_class.is_multigraph()): + srcs.append(cp.array([0, n - 1, n, 2 * n - 1], index_dtype)) + dsts.append(cp.array([n - 1, 0, 2 * n - 1, n], index_dtype)) + src_indices = cp.hstack(srcs) + dst_indices = cp.hstack(dsts) + G = graph_class.from_coo(2 * n, src_indices, dst_indices) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def ladder_graph(n, create_using=None): + return _ladder_graph(n, create_using) + + +@nodes_or_number([0, 1]) +@networkx_algorithm +def lollipop_graph(m, n, create_using=None): + # Like complete_graph then path_graph + orig_m, unused_nodes_m = m + orig_n, unused_nodes_n = n + m, m_nodes = _number_and_nodes(m) + if m < 2: + raise nx.NetworkXError( + "Invalid description: m should indicate at least 2 nodes" + ) + n, n_nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + msrc_indices, mdst_indices = _complete_graph_indices(m) + nsrc_indices = cp.arange(2 * m - 1, 2 * m + 2 * n - 1, dtype=index_dtype) // 2 + ndst_indices = ( + cp.arange(m - 1, m + n, dtype=index_dtype)[:, None] + + cp.array([-1, 1], index_dtype) + ).ravel()[1:-1] + src_indices = cp.hstack((msrc_indices, nsrc_indices)) + dst_indices = cp.hstack((mdst_indices, ndst_indices)) + if isinstance(orig_m, Integral) and isinstance(orig_n, Integral): + nodes = None + else: + nodes = list(range(m)) if m_nodes is None else m_nodes + nodes.extend(range(n) if n_nodes is None else n_nodes) + if len(set(nodes)) != len(nodes): + raise nx.NetworkXError("Nodes must be distinct in containers m and n") + G = graph_class.from_coo(m + n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def null_graph(create_using=None): + return _common_small_graph(0, None, create_using) + + +@nodes_or_number(0) +@networkx_algorithm +def path_graph(n, create_using=None): + n, nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + src_indices = cp.arange(n - 1, dtype=index_dtype) + dst_indices = cp.arange(1, n, dtype=index_dtype) + elif n < 3: + return _common_small_graph(n, nodes, create_using) + else: + src_indices = cp.arange(1, 2 * n - 1, dtype=index_dtype) // 2 + dst_indices = ( + cp.arange(n, dtype=index_dtype)[:, None] + cp.array([-1, 1], index_dtype) + ).ravel()[1:-1] + G = graph_class.from_coo(n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@nodes_or_number(0) +@networkx_algorithm +def star_graph(n, create_using=None): + orig_n, orig_nodes = n + n, nodes = _number_and_nodes(n) + # star_graph behaves differently whether the input was an int or iterable + if isinstance(orig_n, Integral): + if nodes is not None: + nodes.append(n) + n += 1 + if n < 3: + return _common_small_graph(n, nodes, create_using, allow_directed=False) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + flat = cp.zeros(n - 1, index_dtype) + ramp = cp.arange(1, n, dtype=index_dtype) + src_indices = cp.hstack((flat, ramp)) + dst_indices = cp.hstack((ramp, flat)) + G = graph_class.from_coo(n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@nodes_or_number([0, 1]) +@networkx_algorithm +def tadpole_graph(m, n, create_using=None): + orig_m, unused_nodes_m = m + orig_n, unused_nodes_n = n + m, m_nodes = _number_and_nodes(m) + if m < 2: + raise nx.NetworkXError( + "Invalid description: m should indicate at least 2 nodes" + ) + n, n_nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + if isinstance(orig_m, Integral) and isinstance(orig_n, Integral): + nodes = None + else: + nodes = list(range(m)) if m_nodes is None else m_nodes + nodes.extend(range(n) if n_nodes is None else n_nodes) + if m == 2 and not graph_class.is_multigraph(): + src_indices = cp.arange(1, 2 * (m + n) - 1, dtype=index_dtype) // 2 + dst_indices = ( + cp.arange((m + n), dtype=index_dtype)[:, None] + + cp.array([-1, 1], index_dtype) + ).ravel()[1:-1] + else: + src_indices = cp.arange(2 * (m + n), dtype=index_dtype) // 2 + dst_indices = ( + cp.arange((m + n), dtype=index_dtype)[:, None] + + cp.array([-1, 1], index_dtype) + ).ravel() + dst_indices[0] = m - 1 + dst_indices[-1] = 0 + G = graph_class.from_coo(m + n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def trivial_graph(create_using=None): + return _common_small_graph(1, None, create_using) + + +@networkx_algorithm +def turan_graph(n, r): + if not 1 <= r <= n: + raise nx.NetworkXError("Must satisfy 1 <= r <= n") + n_div_r, n_mod_r = divmod(n, r) + partitions = [n_div_r] * (r - n_mod_r) + [n_div_r + 1] * n_mod_r + return complete_multipartite_graph(*partitions) + + +@nodes_or_number(0) +@networkx_algorithm +def wheel_graph(n, create_using=None): + n, nodes = _number_and_nodes(n) + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + if n < 2: + G = graph_class.from_coo( + n, cp.empty(0, index_dtype), cp.empty(0, index_dtype), id_to_key=nodes + ) + else: + # Like star_graph + flat = cp.zeros(n - 1, index_dtype) + ramp = cp.arange(1, n, dtype=index_dtype) + # Like cycle_graph + if n < 3: + src_indices = cp.empty(0, index_dtype) + dst_indices = cp.empty(0, index_dtype) + elif n > 3: + src_indices = cp.arange(2, 2 * n, dtype=index_dtype) // 2 + dst_indices = ( + cp.arange(1, n, dtype=index_dtype)[:, None] + + cp.array([-1, 1], index_dtype) + ).ravel() + dst_indices[-1] = 1 + dst_indices[0] = n - 1 + elif graph_class.is_multigraph(): + src_indices = cp.array([1, 1, 2, 2], index_dtype) + dst_indices = cp.array([2, 2, 1, 1], index_dtype) + else: + src_indices = cp.array([1, 2], index_dtype) + dst_indices = cp.array([2, 1], index_dtype) + src_indices = cp.hstack((flat, ramp, src_indices)) + dst_indices = cp.hstack((ramp, flat, dst_indices)) + G = graph_class.from_coo(n, src_indices, dst_indices, id_to_key=nodes) + if inplace: + return create_using._become(G) + return G diff --git a/python/nx-cugraph/nx_cugraph/generators/community.py b/python/nx-cugraph/nx_cugraph/generators/community.py new file mode 100644 index 000000000..e5cb03e8c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/community.py @@ -0,0 +1,45 @@ +# 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. +import cupy as cp + +import nx_cugraph as nxcg + +from ..utils import networkx_algorithm +from ._utils import ( + _common_small_graph, + _complete_graph_indices, + _ensure_int, + _ensure_nonnegative_int, +) + +__all__ = [ + "caveman_graph", +] + + +@networkx_algorithm +def caveman_graph(l, k): # noqa: E741 + l = _ensure_int(l) # noqa: E741 + k = _ensure_int(k) + N = _ensure_nonnegative_int(k * l) + if l == 0 or k < 1: + return _common_small_graph(N, None, None) + k = _ensure_nonnegative_int(k) + src_clique, dst_clique = _complete_graph_indices(k) + src_cliques = [src_clique] + dst_cliques = [dst_clique] + src_cliques.extend(src_clique + i * k for i in range(1, l)) + dst_cliques.extend(dst_clique + i * k for i in range(1, l)) + src_indices = cp.hstack(src_cliques) + dst_indices = cp.hstack(dst_cliques) + return nxcg.Graph.from_coo(l * k, src_indices, dst_indices) diff --git a/python/nx-cugraph/nx_cugraph/generators/small.py b/python/nx-cugraph/nx_cugraph/generators/small.py new file mode 100644 index 000000000..b9a189c31 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/small.py @@ -0,0 +1,622 @@ +# 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. +import cupy as cp +import networkx as nx + +import nx_cugraph as nxcg + +from ..utils import index_dtype, networkx_algorithm +from ._utils import _IS_NX32_OR_LESS, _create_using_class + +__all__ = [ + "bull_graph", + "chvatal_graph", + "cubical_graph", + "desargues_graph", + "diamond_graph", + "dodecahedral_graph", + "frucht_graph", + "heawood_graph", + "house_graph", + "house_x_graph", + "icosahedral_graph", + "krackhardt_kite_graph", + "moebius_kantor_graph", + "octahedral_graph", + "pappus_graph", + "petersen_graph", + "sedgewick_maze_graph", + "tetrahedral_graph", + "truncated_cube_graph", + "truncated_tetrahedron_graph", + "tutte_graph", +] + + +@networkx_algorithm +def bull_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 4], index_dtype) + dst_indices = cp.array([1, 2, 0, 2, 3, 0, 1, 4, 1, 2], index_dtype) + G = graph_class.from_coo(5, src_indices, dst_indices, name="Bull Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def chvatal_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, + 11, 11, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 4, 6, 9, 0, 2, 5, 7, 1, 3, 6, 8, 2, 4, 7, 9, 0, 3, 5, 8, 1, 4, 10, 11, + 0, 2, 10, 11, 1, 3, 8, 11, 2, 4, 7, 10, 0, 3, 10, 11, 5, 6, 8, 9, 5, 6, + 7, 9, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo(12, src_indices, dst_indices, name="Chvatal Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def cubical_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array( + [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7], + index_dtype, + ) + dst_indices = cp.array( + [1, 3, 4, 0, 2, 7, 1, 3, 6, 0, 2, 5, 0, 5, 7, 3, 4, 6, 2, 5, 7, 1, 4, 6], + index_dtype, + ) + name = ("Platonic Cubical Graph",) if _IS_NX32_OR_LESS else "Platonic Cubical Graph" + G = graph_class.from_coo(8, src_indices, dst_indices, name=name) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def desargues_graph(create_using=None): + # This can also be defined w.r.t. LCF_graph + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 5, 19, 0, 2, 16, 1, 3, 11, 2, 4, 14, 3, 5, 9, 0, 4, 6, 5, 7, 15, 6, 8, + 18, 7, 9, 13, 4, 8, 10, 9, 11, 19, 2, 10, 12, 11, 13, 17, 8, 12, 14, 3, + 13, 15, 6, 14, 16, 1, 15, 17, 12, 16, 18, 7, 17, 19, 0, 10, 18, + ], + index_dtype, + ) + # fmt: on + if graph_class.is_multigraph(): + src_indices_extra = cp.array( + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + index_dtype, + ) + dst_indices_extra = cp.array( + [5, 16, 11, 14, 9, 0, 15, 18, 13, 4, 19, 2, 17, 8, 3, 6, 1, 12, 7, 10], + index_dtype, + ) + src_indices = cp.hstack((src_indices, src_indices_extra)) + dst_indices = cp.hstack((dst_indices, dst_indices_extra)) + G = graph_class.from_coo(20, src_indices, dst_indices, name="Desargues Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def diamond_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 3], index_dtype) + dst_indices = cp.array([1, 2, 0, 2, 3, 0, 1, 3, 1, 2], index_dtype) + G = graph_class.from_coo(4, src_indices, dst_indices, name="Diamond Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def dodecahedral_graph(create_using=None): + # This can also be defined w.r.t. LCF_graph + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 10, 19, 0, 2, 8, 1, 3, 6, 2, 4, 19, 3, 5, 17, 4, 6, 15, 2, 5, 7, 6, 8, + 14, 1, 7, 9, 8, 10, 13, 0, 9, 11, 10, 12, 18, 11, 13, 16, 9, 12, 14, 7, + 13, 15, 5, 14, 16, 12, 15, 17, 4, 16, 18, 11, 17, 19, 0, 3, 18, + ], + index_dtype, + ) + # fmt: on + if graph_class.is_multigraph(): + src_indices_extra = cp.array( + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + index_dtype, + ) + dst_indices_extra = cp.array( + [10, 8, 6, 19, 17, 15, 2, 14, 1, 13, 0, 18, 16, 9, 7, 5, 12, 4, 11, 3], + index_dtype, + ) + src_indices = cp.hstack((src_indices, src_indices_extra)) + dst_indices = cp.hstack((dst_indices, dst_indices_extra)) + G = graph_class.from_coo(20, src_indices, dst_indices, name="Dodecahedral Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def frucht_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + src_indices = cp.array( + [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 10], + index_dtype, + ) + dst_indices = cp.array( + [1, 7, 2, 7, 3, 8, 4, 9, 5, 9, 6, 10, 0, 10, 11, 9, 11, 11], + index_dtype, + ) + else: + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, + 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 6, 7, 0, 2, 7, 1, 3, 8, 2, 4, 9, 3, 5, 9, 4, 6, 10, 0, 5, 10, 0, + 1, 11, 2, 9, 11, 3, 4, 8, 5, 6, 11, 7, 8, 10, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo(12, src_indices, dst_indices, name="Frucht Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def heawood_graph(create_using=None): + # This can also be defined w.r.t. LCF_graph + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 5, 13, 0, 2, 10, 1, 3, 7, 2, 4, 12, 3, 5, 9, 0, 4, 6, 5, 7, 11, 2, 6, + 8, 7, 9, 13, 4, 8, 10, 1, 9, 11, 6, 10, 12, 3, 11, 13, 0, 8, 12, + ], + index_dtype, + ) + # fmt: on + if graph_class.is_multigraph(): + src_indices_extra = cp.array( + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + index_dtype, + ) + dst_indices_extra = cp.array( + [5, 10, 7, 12, 9, 0, 11, 2, 13, 4, 1, 6, 3, 8], + index_dtype, + ) + src_indices = cp.hstack((src_indices, src_indices_extra)) + dst_indices = cp.hstack((dst_indices, dst_indices_extra)) + G = graph_class.from_coo(14, src_indices, dst_indices, name="Heawood Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def house_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array([0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4], index_dtype) + dst_indices = cp.array([1, 2, 0, 3, 0, 3, 4, 1, 2, 4, 2, 3], index_dtype) + G = graph_class.from_coo(5, src_indices, dst_indices, name="House Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def house_x_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array( + [0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4], index_dtype + ) + dst_indices = cp.array( + [1, 2, 3, 0, 2, 3, 0, 1, 3, 4, 0, 1, 2, 4, 2, 3], index_dtype + ) + G = graph_class.from_coo( + 5, src_indices, dst_indices, name="House-with-X-inside Graph" + ) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def icosahedral_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, + 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 5, 7, 8, 11, 0, 2, 5, 6, 8, 1, 3, 6, 8, 9, 2, 4, 6, 9, 10, 3, 5, 6, + 10, 11, 0, 1, 4, 6, 11, 1, 2, 3, 4, 5, 0, 8, 9, 10, 11, 0, 1, 2, 7, 9, 2, + 3, 7, 8, 10, 3, 4, 7, 9, 11, 0, 4, 5, 7, 10, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo( + 12, src_indices, dst_indices, name="Platonic Icosahedral Graph" + ) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def krackhardt_kite_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, + 5, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 2, 3, 5, 0, 3, 4, 6, 0, 3, 5, 0, 1, 2, 4, 5, 6, 1, 3, 6, 0, 2, 3, 6, + 7, 1, 3, 4, 5, 7, 5, 6, 8, 7, 9, 8, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo( + 10, src_indices, dst_indices, name="Krackhardt Kite Social Network" + ) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def moebius_kantor_graph(create_using=None): + # This can also be defined w.r.t. LCF_graph + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, + 14, 14, 15, 15, 15, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 5, 15, 0, 2, 12, 1, 3, 7, 2, 4, 14, 3, 5, 9, 0, 4, 6, 5, 7, 11, 2, 6, + 8, 7, 9, 13, 4, 8, 10, 9, 11, 15, 6, 10, 12, 1, 11, 13, 8, 12, 14, 3, 13, + 15, 0, 10, 14, + ], + index_dtype, + ) + # fmt: on + if graph_class.is_multigraph(): + src_indices_extra = cp.array( + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + index_dtype, + ) + dst_indices_extra = cp.array( + [5, 12, 7, 14, 9, 0, 11, 2, 13, 4, 15, 6, 1, 8, 3, 10], + index_dtype, + ) + src_indices = cp.hstack((src_indices, src_indices_extra)) + dst_indices = cp.hstack((dst_indices, dst_indices_extra)) + G = graph_class.from_coo(16, src_indices, dst_indices, name="Moebius-Kantor Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def octahedral_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + src_indices = cp.array( + [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5], + index_dtype, + ) + dst_indices = cp.array( + [1, 2, 3, 4, 0, 2, 3, 5, 0, 1, 4, 5, 0, 1, 4, 5, 0, 2, 3, 5, 1, 2, 3, 4], + index_dtype, + ) + G = graph_class.from_coo( + 6, src_indices, dst_indices, name="Platonic Octahedral Graph" + ) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def pappus_graph(): + # This can also be defined w.r.t. LCF_graph + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 5, 17, 0, 2, 8, 1, 3, 13, 2, 4, 10, 3, 5, 15, 0, 4, 6, 5, 7, 11, 6, 8, + 14, 1, 7, 9, 8, 10, 16, 3, 9, 11, 6, 10, 12, 11, 13, 17, 2, 12, 14, 7, + 13, 15, 4, 14, 16, 9, 15, 17, 0, 12, 16, + ], + index_dtype, + ) + # fmt: on + return nxcg.Graph.from_coo(18, src_indices, dst_indices, name="Pappus Graph") + + +@networkx_algorithm +def petersen_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 4, 5, 0, 2, 6, 1, 3, 7, 2, 4, 8, 0, 3, 9, 0, 7, 8, 1, 8, 9, 2, 5, 9, + 3, 5, 6, 4, 6, 7, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo(10, src_indices, dst_indices, name="Petersen Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def sedgewick_maze_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + src_indices = cp.array([0, 0, 0, 1, 2, 3, 3, 4, 4, 4], index_dtype) + dst_indices = cp.array([2, 5, 7, 7, 6, 4, 5, 5, 6, 7], index_dtype) + else: + src_indices = cp.array( + [0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7], + index_dtype, + ) + dst_indices = cp.array( + [2, 5, 7, 7, 0, 6, 4, 5, 3, 5, 6, 7, 0, 3, 4, 2, 4, 0, 1, 4], + index_dtype, + ) + G = graph_class.from_coo(8, src_indices, dst_indices, name="Sedgewick Maze") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def tetrahedral_graph(create_using=None): + # This can also be defined w.r.t. complete_graph + graph_class, inplace = _create_using_class(create_using) + src_indices = cp.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], index_dtype) + dst_indices = cp.array([1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2], index_dtype) + name = ( + "Platonic Tetrahedral graph" + if _IS_NX32_OR_LESS + else "Platonic Tetrahedral Graph" + ) + G = graph_class.from_coo(4, src_indices, dst_indices, name=name) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def truncated_cube_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, + 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 2, 4, 0, 11, 14, 0, 3, 4, 2, 6, 8, 0, 2, 5, 4, 16, 18, 3, 7, 8, 6, 10, + 12, 3, 6, 9, 8, 17, 20, 7, 11, 12, 1, 10, 14, 7, 10, 13, 12, 21, 22, 1, + 11, 15, 14, 19, 23, 5, 17, 18, 9, 16, 20, 5, 16, 19, 15, 18, 23, 9, 17, + 21, 13, 20, 22, 13, 21, 23, 15, 19, 22, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo(24, src_indices, dst_indices, name="Truncated Cube Graph") + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def truncated_tetrahedron_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + src_indices = cp.array( + [0, 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10], index_dtype + ) + dst_indices = cp.array( + [1, 2, 9, 2, 6, 3, 4, 11, 5, 11, 6, 7, 7, 8, 9, 10, 10, 11], index_dtype + ) + else: + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, + 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 2, 9, 0, 2, 6, 0, 1, 3, 2, 4, 11, 3, 5, 11, 4, 6, 7, 1, 5, 7, 5, + 6, 8, 7, 9, 10, 0, 8, 10, 8, 9, 11, 3, 4, 10, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo( + 12, src_indices, dst_indices, name="Truncated Tetrahedron Graph" + ) + if inplace: + return create_using._become(G) + return G + + +@networkx_algorithm +def tutte_graph(create_using=None): + graph_class, inplace = _create_using_class(create_using) + if graph_class.is_directed(): + raise nx.NetworkXError("Directed Graph not supported") + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, + 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, + 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, + 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, + 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, + 44, 45, 45, 45, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 2, 3, 0, 4, 26, 0, 10, 11, 0, 18, 19, 1, 5, 33, 4, 6, 29, 5, 7, 27, 6, + 8, 14, 7, 9, 38, 8, 10, 37, 2, 9, 39, 2, 12, 39, 11, 13, 35, 12, 14, 15, + 7, 13, 34, 13, 16, 22, 15, 17, 44, 16, 18, 43, 3, 17, 45, 3, 20, 45, 19, + 21, 41, 20, 22, 23, 15, 21, 40, 21, 24, 27, 23, 25, 32, 24, 26, 31, 1, + 25, 33, 6, 23, 28, 27, 29, 32, 5, 28, 30, 29, 31, 33, 25, 30, 32, 24, 28, + 31, 4, 26, 30, 14, 35, 38, 12, 34, 36, 35, 37, 39, 9, 36, 38, 8, 34, 37, + 10, 11, 36, 22, 41, 44, 20, 40, 42, 41, 43, 45, 17, 42, 44, 16, 40, 43, + 18, 19, 42, + ], + index_dtype, + ) + # fmt: on + G = graph_class.from_coo(46, src_indices, dst_indices, name="Tutte's Graph") + if inplace: + return create_using._become(G) + return G diff --git a/python/nx-cugraph/nx_cugraph/generators/social.py b/python/nx-cugraph/nx_cugraph/generators/social.py new file mode 100644 index 000000000..3c936d07a --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/generators/social.py @@ -0,0 +1,294 @@ +# 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. +import cupy as cp +import numpy as np + +import nx_cugraph as nxcg + +from ..utils import index_dtype, networkx_algorithm + +__all__ = [ + "davis_southern_women_graph", + "florentine_families_graph", + "karate_club_graph", + "les_miserables_graph", +] + + +@networkx_algorithm +def davis_southern_women_graph(): + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, + 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, + 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, + 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, + 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, + 31, 31, 31, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 18, 19, 20, 21, 22, 23, 25, 26, 18, 19, 20, 22, 23, 24, 25, 19, 20, 21, + 22, 23, 24, 25, 26, 18, 20, 21, 22, 23, 24, 25, 20, 21, 22, 24, 20, 22, + 23, 25, 22, 23, 24, 25, 23, 25, 26, 22, 24, 25, 26, 24, 25, 26, 29, 25, + 26, 27, 29, 25, 26, 27, 29, 30, 31, 24, 25, 26, 27, 29, 30, 31, 23, 24, + 26, 27, 28, 29, 30, 31, 24, 25, 27, 28, 29, 25, 26, 26, 28, 26, 28, 0, 1, + 3, 0, 1, 2, 0, 1, 2, 3, 4, 5, 0, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6, 8, 0, 1, + 2, 3, 5, 6, 7, 13, 1, 2, 3, 4, 6, 8, 9, 12, 13, 14, 0, 1, 2, 3, 5, 6, 7, + 8, 9, 10, 11, 12, 14, 15, 0, 2, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 10, + 11, 12, 13, 14, 13, 14, 16, 17, 9, 10, 11, 12, 13, 14, 11, 12, 13, 11, + 12, 13, + ], + index_dtype, + ) + bipartite = cp.array( + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + ], + np.int8, + ) + women = [ + "Evelyn Jefferson", "Laura Mandeville", "Theresa Anderson", "Brenda Rogers", + "Charlotte McDowd", "Frances Anderson", "Eleanor Nye", "Pearl Oglethorpe", + "Ruth DeSand", "Verne Sanderson", "Myra Liddel", "Katherina Rogers", + "Sylvia Avondale", "Nora Fayette", "Helen Lloyd", "Dorothy Murchison", + "Olivia Carleton", "Flora Price", + ] + events = [ + "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "E10", "E11", "E12", + "E13", "E14", + ] + # fmt: on + return nxcg.Graph.from_coo( + 32, + src_indices, + dst_indices, + node_values={"bipartite": bipartite}, + id_to_key=women + events, + top=women, + bottom=events, + ) + + +@networkx_algorithm +def florentine_families_graph(): + # fmt: off + src_indices = cp.array( + [ + 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8, 8, + 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 8, 5, 6, 8, 4, 8, 6, 10, 13, 2, 10, 13, 1, 1, 3, 7, 14, 6, 0, 1, 2, 11, + 12, 14, 12, 3, 4, 13, 8, 13, 14, 8, 9, 3, 4, 10, 11, 6, 8, 11, + ], + index_dtype, + ) + nodes = [ + "Acciaiuoli", "Albizzi", "Barbadori", "Bischeri", "Castellani", "Ginori", + "Guadagni", "Lamberteschi", "Medici", "Pazzi", "Peruzzi", "Ridolfi", + "Salviati", "Strozzi", "Tornabuoni" + ] + # fmt: on + return nxcg.Graph.from_coo(15, src_indices, dst_indices, id_to_key=nodes) + + +@networkx_algorithm +def karate_club_graph(): + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 10, 10, 10, 11, 12, 12, 13, + 13, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, + 20, 21, 21, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, + 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, + 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 17, 19, 21, 31, 0, 2, 3, 7, 13, + 17, 19, 21, 30, 0, 1, 3, 7, 8, 9, 13, 27, 28, 32, 0, 1, 2, 7, 12, 13, 0, + 6, 10, 0, 6, 10, 16, 0, 4, 5, 16, 0, 1, 2, 3, 0, 2, 30, 32, 33, 2, 33, + 0, 4, 5, 0, 0, 3, 0, 1, 2, 3, 33, 32, 33, 32, 33, 5, 6, 0, 1, 32, 33, 0, + 1, 33, 32, 33, 0, 1, 32, 33, 25, 27, 29, 32, 33, 25, 27, 31, 23, 24, 31, + 29, 33, 2, 23, 24, 33, 2, 31, 33, 23, 26, 32, 33, 1, 8, 32, 33, 0, 24, + 25, 28, 32, 33, 2, 8, 14, 15, 18, 20, 22, 23, 29, 30, 31, 33, 8, 9, 13, + 14, 15, 18, 19, 20, 22, 23, 26, 27, 28, 29, 30, 31, 32, + ], + index_dtype, + ) + weights = cp.array( + [ + 4, 5, 3, 3, 3, 3, 2, 2, 2, 3, 1, 3, 2, 2, 2, 2, 4, 6, 3, 4, 5, 1, 2, 2, + 2, 5, 6, 3, 4, 5, 1, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 5, 3, 3, + 3, 2, 5, 3, 2, 4, 4, 3, 2, 5, 3, 3, 4, 1, 2, 2, 3, 3, 3, 1, 3, 3, 5, 3, + 3, 3, 3, 2, 3, 4, 3, 3, 2, 1, 1, 2, 2, 2, 1, 3, 1, 2, 2, 2, 3, 5, 4, 3, + 5, 4, 2, 3, 2, 5, 2, 7, 4, 2, 2, 4, 3, 4, 2, 2, 2, 3, 4, 4, 2, 2, 3, 3, + 3, 2, 2, 7, 2, 4, 4, 2, 3, 3, 3, 1, 3, 2, 5, 4, 3, 4, 5, 4, 2, 3, 2, 4, + 2, 1, 1, 3, 4, 2, 4, 2, 2, 3, 4, 5, + ], + np.int8, + ) + # For now, cupy doesn't handle str dtypes and we primarily handle cupy arrays. + # We try to support numpy arrays for node values, so let's use numpy here. + clubs = np.array([ + "Mr. Hi", "Mr. Hi", "Mr. Hi", "Mr. Hi", "Mr. Hi", "Mr. Hi", "Mr. Hi", + "Mr. Hi", "Mr. Hi", "Officer", "Mr. Hi", "Mr. Hi", "Mr. Hi", "Mr. Hi", + "Officer", "Officer", "Mr. Hi", "Mr. Hi", "Officer", "Mr. Hi", "Officer", + "Mr. Hi", "Officer", "Officer", "Officer", "Officer", "Officer", "Officer", + "Officer", "Officer", "Officer", "Officer", "Officer", "Officer", + ]) + # fmt: on + return nxcg.Graph.from_coo( + 34, + src_indices, + dst_indices, + edge_values={"weight": weights}, + node_values={"club": clubs}, + name="Zachary's Karate Club", + ) + + +@networkx_algorithm +def les_miserables_graph(): + # fmt: off + src_indices = cp.array( + [ + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, + 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, 23, 23, + 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, + 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, + 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 32, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 42, 42, 42, 42, + 42, 43, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 47, 47, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 51, 51, 51, 51, + 51, 51, 51, 52, 53, 53, 54, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 57, + 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 60, 60, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 64, + 65, 65, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 69, 69, 69, + 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, + 76, 76, 76, 76, 76, + ], + index_dtype, + ) + dst_indices = cp.array( + [ + 25, 58, 70, 9, 15, 25, 31, 37, 39, 58, 59, 70, 73, 6, 17, 21, 24, 30, 31, + 35, 40, 46, 49, 55, 67, 8, 10, 12, 16, 27, 39, 42, 73, 34, 49, 23, 26, + 27, 29, 44, 71, 76, 2, 17, 21, 24, 30, 31, 35, 40, 46, 49, 55, 67, 73, + 70, 3, 10, 12, 16, 42, 73, 1, 15, 25, 31, 37, 59, 70, 3, 8, 12, 16, 42, + 73, 62, 3, 8, 10, 16, 42, 73, 14, 31, 13, 31, 1, 9, 24, 25, 37, 39, 58, + 59, 70, 73, 3, 8, 10, 12, 42, 73, 2, 6, 21, 24, 30, 31, 35, 40, 46, 49, + 67, 34, 39, 45, 49, 51, 58, 70, 71, 72, 73, 75, 62, 62, 2, 6, 17, 24, 25, + 30, 31, 35, 40, 46, 49, 55, 67, 62, 5, 26, 27, 29, 44, 71, 76, 2, 6, 15, + 17, 21, 30, 31, 35, 39, 40, 46, 49, 55, 67, 73, 0, 1, 9, 15, 21, 37, 46, + 49, 58, 59, 70, 5, 23, 27, 29, 44, 71, 76, 3, 5, 23, 26, 29, 39, 44, 48, + 58, 65, 69, 70, 71, 73, 76, 36, 39, 60, 73, 5, 23, 26, 27, 44, 71, 76, 2, + 6, 17, 21, 24, 31, 35, 40, 46, 49, 67, 1, 2, 6, 9, 13, 14, 17, 21, 24, + 30, 35, 37, 39, 40, 46, 49, 53, 55, 59, 67, 70, 73, 62, 73, 4, 18, 45, + 47, 49, 51, 73, 2, 6, 17, 21, 24, 30, 31, 40, 55, 67, 28, 1, 9, 15, 25, + 31, 39, 58, 59, 70, 73, 73, 1, 3, 15, 18, 24, 27, 28, 31, 37, 58, 59, 69, + 70, 72, 73, 74, 75, 2, 6, 17, 21, 24, 30, 31, 35, 46, 49, 55, 67, 53, 3, + 8, 10, 12, 16, 73, 73, 5, 23, 26, 27, 29, 71, 76, 18, 34, 49, 51, 2, 6, + 17, 21, 24, 25, 30, 31, 40, 49, 61, 34, 58, 27, 73, 2, 4, 6, 17, 18, 21, + 24, 25, 30, 31, 34, 40, 45, 46, 51, 66, 70, 71, 73, 56, 62, 73, 18, 34, + 45, 49, 52, 57, 73, 51, 31, 41, 73, 2, 6, 21, 24, 31, 35, 40, 50, 62, 73, + 51, 66, 0, 1, 15, 18, 25, 27, 37, 39, 47, 70, 73, 1, 9, 15, 25, 31, 37, + 39, 70, 73, 28, 73, 46, 11, 19, 20, 22, 32, 50, 56, 63, 64, 73, 62, 62, + 27, 69, 49, 57, 70, 2, 6, 17, 21, 24, 30, 31, 35, 40, 73, 27, 39, 65, 73, + 0, 1, 7, 9, 15, 18, 25, 27, 31, 37, 39, 49, 58, 59, 66, 73, 5, 18, 23, + 26, 27, 29, 44, 49, 76, 18, 39, 73, 1, 3, 6, 8, 10, 12, 15, 16, 18, 24, + 27, 28, 31, 33, 34, 37, 38, 39, 42, 43, 48, 49, 50, 51, 54, 56, 58, 59, + 60, 62, 68, 69, 70, 72, 74, 75, 39, 73, 18, 39, 73, 5, 23, 26, 27, 29, + 44, 71, + ], + index_dtype, + ) + weights = cp.array( + [ + 2, 1, 2, 3, 4, 1, 1, 6, 2, 1, 2, 6, 1, 4, 5, 6, 4, 3, 5, 1, 5, 2, 1, 1, + 2, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 3, 4, 3, 4, 4, 4, 3, 4, 9, 12, 10, 6, 5, + 3, 7, 1, 5, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 3, 1, 3, 2, 2, 2, + 2, 3, 3, 1, 1, 2, 2, 2, 2, 2, 3, 2, 3, 2, 4, 1, 1, 1, 4, 1, 1, 2, 4, 1, + 1, 2, 2, 2, 2, 2, 5, 9, 13, 15, 5, 6, 1, 5, 2, 5, 2, 3, 1, 1, 21, 2, 4, + 1, 1, 2, 31, 1, 2, 1, 6, 12, 13, 17, 1, 6, 7, 2, 5, 2, 9, 1, 3, 1, 3, 3, + 4, 5, 3, 3, 4, 4, 10, 1, 15, 17, 6, 7, 3, 6, 5, 1, 7, 1, 4, 4, 2, 1, 1, + 1, 1, 1, 1, 5, 2, 1, 3, 4, 3, 3, 3, 4, 4, 3, 1, 3, 4, 3, 4, 5, 3, 2, 2, + 1, 2, 1, 3, 9, 4, 2, 1, 3, 8, 4, 5, 3, 4, 3, 3, 4, 3, 6, 5, 6, 6, 2, 1, + 5, 1, 1, 2, 1, 5, 5, 1, 2, 2, 6, 7, 7, 2, 1, 1, 1, 3, 1, 4, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 12, 9, 2, 1, 3, 1, 2, 3, 1, 1, 2, 1, 1, 2, 6, 3, + 4, 1, 1, 1, 1, 2, 5, 1, 1, 2, 1, 1, 1, 6, 5, 1, 1, 1, 1, 1, 1, 5, 1, 17, + 1, 1, 5, 7, 5, 5, 5, 5, 3, 2, 1, 2, 1, 2, 1, 2, 2, 3, 2, 2, 3, 1, 4, 3, + 4, 3, 3, 4, 3, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, + 1, 1, 5, 5, 21, 9, 7, 5, 1, 4, 12, 2, 1, 1, 6, 1, 2, 1, 19, 6, 8, 3, 2, + 9, 2, 6, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 10, 3, 1, 1, 1, 1, + 1, 4, 2, 2, 1, 1, 1, 13, 7, 2, 1, 2, 1, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, + 1, 1, 8, 10, 1, 1, 5, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 2, 1, 1, 2, 1, + 2, 1, 2, 3, 2, 6, 1, 3, 4, 1, 3, 1, 1, 5, 5, 2, 13, 1, 1, 12, 4, 1, 3, 4, + 3, 3, 4, 1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 2, 1, 2, 31, 4, 9, 8, 1, 1, 2, 1, + 1, 17, 3, 1, 1, 19, 3, 2, 1, 3, 7, 1, 1, 5, 1, 3, 12, 1, 2, 3, 1, 2, 1, + 1, 3, 3, 4, 3, 4, 4, 3, 3, + ], + np.int8, + ) + nodes = [ + "Anzelma", "Babet", "Bahorel", "Bamatabois", "BaronessT", "Blacheville", + "Bossuet", "Boulatruelle", "Brevet", "Brujon", "Champmathieu", + "Champtercier", "Chenildieu", "Child1", "Child2", "Claquesous", + "Cochepaille", "Combeferre", "Cosette", "Count", "CountessDeLo", + "Courfeyrac", "Cravatte", "Dahlia", "Enjolras", "Eponine", "Fameuil", + "Fantine", "Fauchelevent", "Favourite", "Feuilly", "Gavroche", "Geborand", + "Gervais", "Gillenormand", "Grantaire", "Gribier", "Gueulemer", "Isabeau", + "Javert", "Joly", "Jondrette", "Judge", "Labarre", "Listolier", + "LtGillenormand", "Mabeuf", "Magnon", "Marguerite", "Marius", + "MlleBaptistine", "MlleGillenormand", "MlleVaubois", "MmeBurgon", "MmeDeR", + "MmeHucheloup", "MmeMagloire", "MmePontmercy", "MmeThenardier", + "Montparnasse", "MotherInnocent", "MotherPlutarch", "Myriel", "Napoleon", + "OldMan", "Perpetue", "Pontmercy", "Prouvaire", "Scaufflaire", "Simplice", + "Thenardier", "Tholomyes", "Toussaint", "Valjean", "Woman1", "Woman2", + "Zephine", + ] + # fmt: on + return nxcg.Graph.from_coo( + 77, src_indices, dst_indices, edge_values={"weight": weights}, id_to_key=nodes + ) diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index a7b88b72e..fd0b1483d 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -65,6 +65,7 @@ def key(testpath): no_weights = "weighted implementation not currently supported" no_multigraph = "multigraphs not currently supported" louvain_different = "Louvain may be different due to RNG" + no_string_dtype = "string edge values not currently supported" xfail = {} @@ -187,6 +188,40 @@ def key(testpath): xfail[ key("test_louvain.py:test_threshold") ] = "Louvain does not support seed parameter" + if nxver.major == 3 and nxver.minor >= 2: + xfail.update( + { + key( + "test_convert_pandas.py:TestConvertPandas." + "test_from_edgelist_multi_attr_incl_target" + ): no_string_dtype, + key( + "test_convert_pandas.py:TestConvertPandas." + "test_from_edgelist_multidigraph_and_edge_attr" + ): no_string_dtype, + key( + "test_convert_pandas.py:TestConvertPandas." + "test_from_edgelist_int_attr_name" + ): no_string_dtype, + } + ) + if nxver.minor == 2: + different_iteration_order = "Different graph data iteration order" + xfail.update( + { + key( + "test_cycles.py:TestMinimumCycleBasis." + "test_gh6787_and_edge_attribute_names" + ): different_iteration_order, + key( + "test_euler.py:TestEulerianCircuit." + "test_eulerian_circuit_cycle" + ): different_iteration_order, + key( + "test_gml.py:TestGraph.test_special_float_label" + ): different_iteration_order, + } + ) for item in items: kset = set(item.keywords) diff --git a/python/nx-cugraph/nx_cugraph/tests/test_generators.py b/python/nx-cugraph/nx_cugraph/tests/test_generators.py new file mode 100644 index 000000000..511f8dcd8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_generators.py @@ -0,0 +1,277 @@ +# 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. +import networkx as nx +import numpy as np +import pytest +from packaging.version import parse + +import nx_cugraph as nxcg + +nxver = parse(nx.__version__) + + +def assert_graphs_equal(Gnx, Gcg): + assert isinstance(Gnx, nx.Graph) + assert isinstance(Gcg, nxcg.Graph) + assert Gnx.number_of_nodes() == Gcg.number_of_nodes() + assert Gnx.number_of_edges() == Gcg.number_of_edges() + assert Gnx.is_directed() == Gcg.is_directed() + assert Gnx.is_multigraph() == Gcg.is_multigraph() + G = nxcg.to_networkx(Gcg) + rv = nx.utils.graphs_equal(G, Gnx) + if not rv: + print("GRAPHS ARE NOT EQUAL!") + assert sorted(G) == sorted(Gnx) + assert sorted(G._adj) == sorted(Gnx._adj) + assert sorted(G._node) == sorted(Gnx._node) + for k in sorted(G._adj): + print(k, sorted(G._adj[k]), sorted(Gnx._adj[k])) + print(nx.to_scipy_sparse_array(G).todense()) + print(nx.to_scipy_sparse_array(Gnx).todense()) + print(G.graph) + print(Gnx.graph) + assert rv + + +if nxver.major == 3 and nxver.minor < 2: + pytest.skip("Need NetworkX >=3.2 to test generators", allow_module_level=True) + + +def compare(name, create_using, *args, is_vanilla=False): + exc1 = exc2 = None + func = getattr(nx, name) + if isinstance(create_using, nxcg.Graph): + nx_create_using = nxcg.to_networkx(create_using) + elif isinstance(create_using, type) and issubclass(create_using, nxcg.Graph): + nx_create_using = create_using.to_networkx_class() + elif isinstance(create_using, nx.Graph): + nx_create_using = create_using.copy() + else: + nx_create_using = create_using + try: + if is_vanilla: + G = func(*args) + else: + G = func(*args, create_using=nx_create_using) + except Exception as exc: + exc1 = exc + try: + if is_vanilla: + Gcg = func(*args, backend="cugraph") + else: + Gcg = func(*args, create_using=create_using, backend="cugraph") + except ZeroDivisionError: + raise + except NotImplementedError as exc: + if name in {"complete_multipartite_graph"}: # nx.__version__[:3] <= "3.2" + return + exc2 = exc + except Exception as exc: + if exc1 is None: # pragma: no cover (debug) + raise + exc2 = exc + if exc1 is not None or exc2 is not None: + assert type(exc1) is type(exc2) + else: + assert_graphs_equal(G, Gcg) + + +N = list(range(-1, 5)) +CREATE_USING = [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph] +COMPLETE_CREATE_USING = [ + nx.Graph, + nx.DiGraph, + nx.MultiGraph, + nx.MultiDiGraph, + nxcg.Graph, + nxcg.DiGraph, + nxcg.MultiGraph, + nxcg.MultiDiGraph, + # These raise NotImplementedError + # nx.Graph(), + # nx.DiGraph(), + # nx.MultiGraph(), + # nx.MultiDiGraph(), + nxcg.Graph(), + nxcg.DiGraph(), + nxcg.MultiGraph(), + nxcg.MultiDiGraph(), + None, + object, # Bad input + 7, # Bad input +] +GENERATORS_NOARG = [ + # classic + "null_graph", + "trivial_graph", + # small + "bull_graph", + "chvatal_graph", + "cubical_graph", + "desargues_graph", + "diamond_graph", + "dodecahedral_graph", + "frucht_graph", + "heawood_graph", + "house_graph", + "house_x_graph", + "icosahedral_graph", + "krackhardt_kite_graph", + "moebius_kantor_graph", + "octahedral_graph", + "petersen_graph", + "sedgewick_maze_graph", + "tetrahedral_graph", + "truncated_cube_graph", + "truncated_tetrahedron_graph", + "tutte_graph", +] +GENERATORS_NOARG_VANILLA = [ + # classic + "complete_multipartite_graph", + # small + "pappus_graph", + # social + "davis_southern_women_graph", + "florentine_families_graph", + "karate_club_graph", + "les_miserables_graph", +] +GENERATORS_N = [ + # classic + "circular_ladder_graph", + "complete_graph", + "cycle_graph", + "empty_graph", + "ladder_graph", + "path_graph", + "star_graph", + "wheel_graph", +] +GENERATORS_M_N = [ + # classic + "barbell_graph", + "lollipop_graph", + "tadpole_graph", + # bipartite + "complete_bipartite_graph", +] +GENERATORS_M_N_VANILLA = [ + # classic + "complete_multipartite_graph", + "turan_graph", + # community + "caveman_graph", +] + + +@pytest.mark.parametrize("name", GENERATORS_NOARG) +@pytest.mark.parametrize("create_using", COMPLETE_CREATE_USING) +def test_generator_noarg(name, create_using): + print(name, create_using, type(create_using)) + if isinstance(create_using, nxcg.Graph) and name in { + # fmt: off + "bull_graph", "chvatal_graph", "cubical_graph", "diamond_graph", + "house_graph", "house_x_graph", "icosahedral_graph", "krackhardt_kite_graph", + "octahedral_graph", "petersen_graph", "truncated_cube_graph", "tutte_graph", + # fmt: on + }: + # The _raise_on_directed decorator used in networkx doesn't like our graphs. + if create_using.is_directed(): + with pytest.raises(AssertionError): + compare(name, create_using) + else: + with pytest.raises(TypeError): + compare(name, create_using) + else: + compare(name, create_using) + + +@pytest.mark.parametrize("name", GENERATORS_NOARG_VANILLA) +def test_generator_noarg_vanilla(name): + print(name) + compare(name, None, is_vanilla=True) + + +@pytest.mark.parametrize("name", GENERATORS_N) +@pytest.mark.parametrize("n", N) +@pytest.mark.parametrize("create_using", CREATE_USING) +def test_generator_n(name, n, create_using): + print(name, n, create_using) + compare(name, create_using, n) + + +@pytest.mark.parametrize("name", GENERATORS_N) +@pytest.mark.parametrize("n", [1, 4]) +@pytest.mark.parametrize("create_using", COMPLETE_CREATE_USING) +def test_generator_n_complete(name, n, create_using): + print(name, n, create_using) + compare(name, create_using, n) + + +@pytest.mark.parametrize("name", GENERATORS_M_N) +@pytest.mark.parametrize("create_using", CREATE_USING) +@pytest.mark.parametrize("m", N) +@pytest.mark.parametrize("n", N) +def test_generator_m_n(name, create_using, m, n): + print(name, m, n, create_using) + compare(name, create_using, m, n) + + +@pytest.mark.parametrize("name", GENERATORS_M_N_VANILLA) +@pytest.mark.parametrize("m", N) +@pytest.mark.parametrize("n", N) +def test_generator_m_n_vanilla(name, m, n): + print(name, m, n) + compare(name, None, m, n, is_vanilla=True) + + +@pytest.mark.parametrize("name", GENERATORS_M_N) +@pytest.mark.parametrize("create_using", COMPLETE_CREATE_USING) +@pytest.mark.parametrize("m", [4]) +@pytest.mark.parametrize("n", [4]) +def test_generator_m_n_complete(name, create_using, m, n): + print(name, m, n, create_using) + compare(name, create_using, m, n) + + +@pytest.mark.parametrize("name", GENERATORS_M_N_VANILLA) +@pytest.mark.parametrize("m", [4]) +@pytest.mark.parametrize("n", [4]) +def test_generator_m_n_complete_vanilla(name, m, n): + print(name, m, n) + compare(name, None, m, n, is_vanilla=True) + + +def test_bad_lollipop_graph(): + compare("lollipop_graph", None, [0, 1], [1, 2]) + + +def test_can_convert_karate_club(): + # Karate club graph has string node values. + # This really tests conversions, but it's here so we can use `assert_graphs_equal`. + G = nx.karate_club_graph() + G.add_node(0, foo="bar") # string dtype with a mask + G.add_node(1, object=object()) # haha + Gcg = nxcg.from_networkx(G, preserve_all_attrs=True) + assert_graphs_equal(G, Gcg) + Gnx = nxcg.to_networkx(Gcg) + assert nx.utils.graphs_equal(G, Gnx) + assert isinstance(Gcg.node_values["club"], np.ndarray) + assert Gcg.node_values["club"].dtype.kind == "U" + assert isinstance(Gcg.node_values["foo"], np.ndarray) + assert isinstance(Gcg.node_masks["foo"], np.ndarray) + assert Gcg.node_values["foo"].dtype.kind == "U" + assert isinstance(Gcg.node_values["object"], np.ndarray) + assert Gcg.node_values["object"].dtype.kind == "O" + assert isinstance(Gcg.node_masks["object"], np.ndarray) diff --git a/python/nx-cugraph/nx_cugraph/tests/test_utils.py b/python/nx-cugraph/nx_cugraph/tests/test_utils.py new file mode 100644 index 000000000..fdd0c9199 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_utils.py @@ -0,0 +1,87 @@ +# 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. +import numpy as np +import pytest + +from nx_cugraph.utils import _get_int_dtype + + +def test_get_int_dtype(): + uint8 = np.dtype(np.uint8) + uint16 = np.dtype(np.uint16) + uint32 = np.dtype(np.uint32) + uint64 = np.dtype(np.uint64) + # signed + cur = np.iinfo(np.int8) + for val in [cur.min, cur.min + 1, -1, 0, 1, cur.max - 1, cur.max]: + assert _get_int_dtype(val) == np.int8 + assert _get_int_dtype(val, signed=True) == np.int8 + if val >= 0: + assert _get_int_dtype(val, unsigned=True) == np.uint8 + assert _get_int_dtype(val + 1, unsigned=True) == np.uint8 + prev = cur + cur = np.iinfo(np.int16) + for val in [cur.min, cur.min + 1, prev.min - 1, prev.max + 1, cur.max - 1, cur.max]: + assert _get_int_dtype(val) != prev.dtype + assert _get_int_dtype(val, signed=True) == np.int16 + if val >= 0: + assert _get_int_dtype(val, unsigned=True) in {uint8, uint16} + assert _get_int_dtype(val + 1, unsigned=True) in {uint8, uint16} + prev = cur + cur = np.iinfo(np.int32) + for val in [cur.min, cur.min + 1, prev.min - 1, prev.max + 1, cur.max - 1, cur.max]: + assert _get_int_dtype(val) != prev.dtype + assert _get_int_dtype(val, signed=True) == np.int32 + if val >= 0: + assert _get_int_dtype(val, unsigned=True) in {uint16, uint32} + assert _get_int_dtype(val + 1, unsigned=True) in {uint16, uint32} + prev = cur + cur = np.iinfo(np.int64) + for val in [cur.min, cur.min + 1, prev.min - 1, prev.max + 1, cur.max - 1, cur.max]: + assert _get_int_dtype(val) != prev.dtype + assert _get_int_dtype(val, signed=True) == np.int64 + if val >= 0: + assert _get_int_dtype(val, unsigned=True) in {uint32, uint64} + assert _get_int_dtype(val + 1, unsigned=True) in {uint32, uint64} + with pytest.raises(ValueError, match="Value is too"): + _get_int_dtype(cur.min - 1, signed=True) + with pytest.raises(ValueError, match="Value is too"): + _get_int_dtype(cur.max + 1, signed=True) + + # unsigned + cur = np.iinfo(np.uint8) + for val in [0, 1, cur.max - 1, cur.max]: + assert _get_int_dtype(val) == (np.uint8 if val > 1 else np.int8) + assert _get_int_dtype(val, unsigned=True) == np.uint8 + assert _get_int_dtype(cur.max + 1) == np.int16 + cur = np.iinfo(np.uint16) + for val in [cur.max - 1, cur.max]: + assert _get_int_dtype(val, unsigned=True) == np.uint16 + assert _get_int_dtype(cur.max + 1) == np.int32 + cur = np.iinfo(np.uint32) + for val in [cur.max - 1, cur.max]: + assert _get_int_dtype(val, unsigned=True) == np.uint32 + assert _get_int_dtype(cur.max + 1) == np.int64 + cur = np.iinfo(np.uint64) + for val in [cur.max - 1, cur.max]: + assert _get_int_dtype(val, unsigned=True) == np.uint64 + with pytest.raises(ValueError, match="Value is incompatible"): + _get_int_dtype(cur.min - 1, unsigned=True) + with pytest.raises(ValueError, match="Value is too"): + _get_int_dtype(cur.max + 1, unsigned=True) + + # API + with pytest.raises(TypeError, match="incompatible"): + _get_int_dtype(7, signed=True, unsigned=True) + assert _get_int_dtype(7, signed=True, unsigned=False) == np.int8 + assert _get_int_dtype(7, signed=False, unsigned=True) == np.uint8 diff --git a/python/nx-cugraph/nx_cugraph/typing.py b/python/nx-cugraph/nx_cugraph/typing.py index d3045ab46..b419a9085 100644 --- a/python/nx-cugraph/nx_cugraph/typing.py +++ b/python/nx-cugraph/nx_cugraph/typing.py @@ -15,6 +15,9 @@ from collections.abc import Hashable from typing import TypeVar +import cupy as cp +import numpy as np + AttrKey = TypeVar("AttrKey", bound=Hashable) EdgeKey = TypeVar("EdgeKey", bound=Hashable) NodeKey = TypeVar("NodeKey", bound=Hashable) @@ -23,3 +26,8 @@ NodeValue = TypeVar("NodeValue") IndexValue = TypeVar("IndexValue") Dtype = TypeVar("Dtype") + + +class any_ndarray: + def __class_getitem__(cls, item): + return cp.ndarray[item] | np.ndarray[item] diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py index 72e4094b8..9683df5e7 100644 --- a/python/nx-cugraph/nx_cugraph/utils/misc.py +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -12,13 +12,19 @@ # limitations under the License. from __future__ import annotations +import itertools import operator as op import sys from random import Random +from typing import SupportsIndex import cupy as cp +import numpy as np -__all__ = ["_groupby", "_seed_to_int"] +__all__ = ["index_dtype", "_groupby", "_seed_to_int", "_get_int_dtype"] + +# This may switch to np.uint32 at some point +index_dtype = np.int32 def _groupby(groups: cp.ndarray, values: cp.ndarray) -> dict[int, cp.ndarray]: @@ -58,3 +64,67 @@ def _seed_to_int(seed: int | Random | None) -> int: if isinstance(seed, Random): return seed.randint(0, sys.maxsize) return op.index(seed) # Ensure seed is integral + + +def _get_int_dtype( + val: SupportsIndex, *, signed: bool | None = None, unsigned: bool | None = None +): + """Determine the smallest integer dtype that can store the integer ``val``. + + If signed or unsigned are unspecified, then signed integers are preferred + unless the value can be represented by a smaller unsigned integer. + + Raises + ------ + ValueError : If the value cannot be represented with an int dtype. + """ + # This is similar in spirit to `np.min_scalar_type` + if signed is not None: + if unsigned is not None and (not signed) is (not unsigned): + raise TypeError( + f"signed (={signed}) and unsigned (={unsigned}) keyword arguments " + "are incompatible." + ) + signed = bool(signed) + unsigned = not signed + elif unsigned is not None: + unsigned = bool(unsigned) + signed = not unsigned + + val = op.index(val) # Ensure val is integral + if val < 0: + if unsigned: + raise ValueError(f"Value is incompatible with unsigned int: {val}.") + signed = True + unsigned = False + + if signed is not False: + # Number of bytes (and a power of two) + signed_nbytes = (val + (val < 0)).bit_length() // 8 + 1 + signed_nbytes = next( + filter( + signed_nbytes.__le__, + itertools.accumulate(itertools.repeat(2), op.mul, initial=1), + ) + ) + if unsigned is not False: + # Number of bytes (and a power of two) + unsigned_nbytes = (val.bit_length() + 7) // 8 + unsigned_nbytes = next( + filter( + unsigned_nbytes.__le__, + itertools.accumulate(itertools.repeat(2), op.mul, initial=1), + ) + ) + if signed is None and unsigned is None: + # Prefer signed int if same size + signed = signed_nbytes <= unsigned_nbytes + + if signed: + dtype_string = f"i{signed_nbytes}" + else: + dtype_string = f"u{unsigned_nbytes}" + try: + return np.dtype(dtype_string) + except TypeError as exc: + raise ValueError("Value is too large to store as integer: {val}") from exc diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 9fec8fa02..3d3029da2 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -160,7 +160,8 @@ ignore = [ # "SIM300", # Yoda conditions are discouraged, use ... instead (Note: we're not this picky) # "SIM401", # Use dict.get ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer) # "TRY004", # Prefer `TypeError` exception for invalid type (Note: good advice, but not worth the nuisance) - # "TRY200", # Use `raise from` to specify exception cause (Note: sometimes okay to raise original exception) + "B904", # Bare `raise` inside exception clause (like TRY200; sometimes okay) + "TRY200", # Use `raise from` to specify exception cause (Note: sometimes okay to raise original exception) # Intentionally ignored "A003", # Class attribute ... is shadowing a python builtin From 01656828baca9c9ef4ea1df402604acd422e8e53 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 31 Oct 2023 17:50:52 -0500 Subject: [PATCH 283/384] nx-cugraph: add CC for undirected graphs to fix k-truss (#3965) Fixes #3963 and add `connected_components`, `is_connected`, `node_connected_component`, and `number_connected_components`. Also updated `_groupby` to handle groups that are not consecutive integers starting with 0. Also, `plc.weakly_connected_components` does not handle isolated nodes well, and I needed to handle this at the Python layer as was done in #3897 Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3965 --- python/nx-cugraph/_nx_cugraph/__init__.py | 8 ++ .../nx_cugraph/algorithms/__init__.py | 3 +- .../algorithms/community/louvain.py | 2 +- .../algorithms/components/__init__.py | 13 ++ .../algorithms/components/connected.py | 130 ++++++++++++++++++ .../nx-cugraph/nx_cugraph/algorithms/core.py | 10 ++ python/nx-cugraph/nx_cugraph/classes/graph.py | 5 + python/nx-cugraph/nx_cugraph/interface.py | 9 ++ .../nx_cugraph/tests/test_ktruss.py | 30 ++++ .../nx-cugraph/nx_cugraph/utils/decorators.py | 5 +- python/nx-cugraph/nx_cugraph/utils/misc.py | 44 ++++-- python/nx-cugraph/pyproject.toml | 1 + 12 files changed, 243 insertions(+), 17 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/components/connected.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_ktruss.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index af1df0464..8ef976aab 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -38,6 +38,7 @@ "complete_bipartite_graph", "complete_graph", "complete_multipartite_graph", + "connected_components", "cubical_graph", "cycle_graph", "davis_southern_women_graph", @@ -56,6 +57,7 @@ "house_x_graph", "icosahedral_graph", "in_degree_centrality", + "is_connected", "is_isolate", "isolates", "k_truss", @@ -66,7 +68,9 @@ "lollipop_graph", "louvain_communities", "moebius_kantor_graph", + "node_connected_component", "null_graph", + "number_connected_components", "number_of_isolates", "number_of_selfloops", "octahedral_graph", @@ -91,6 +95,10 @@ "betweenness_centrality": "`weight` parameter is not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported.", "from_pandas_edgelist": "cudf.DataFrame inputs also supported.", + "k_truss": ( + "Currently raises `NotImplementedError` for graphs with more than one connected\n" + "component when k >= 3. We expect to fix this soon." + ), "louvain_communities": "`seed` parameter is currently ignored.", # END: extra_docstrings }, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 69feb8f64..87b1967fa 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -10,8 +10,9 @@ # 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. -from . import bipartite, centrality, community +from . import bipartite, centrality, community, components from .bipartite import complete_bipartite_graph from .centrality import * +from .components import * from .core import * from .isolate import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index 62261d109..45a3429d2 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -62,7 +62,7 @@ def louvain_communities( resolution=resolution, do_expensive_check=False, ) - groups = _groupby(clusters, vertices) + groups = _groupby(clusters, vertices, groups_are_canonical=True) rv = [set(G._nodearray_to_list(node_ids)) for node_ids in groups.values()] # TODO: PLC doesn't handle isolated vertices yet, so this is a temporary fix isolates = _isolates(G) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py new file mode 100644 index 000000000..26816ef36 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .connected import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py new file mode 100644 index 000000000..41f3457d5 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py @@ -0,0 +1,130 @@ +# 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. +import itertools + +import cupy as cp +import networkx as nx +import pylibcugraph as plc + +from nx_cugraph.convert import _to_undirected_graph +from nx_cugraph.utils import _groupby, networkx_algorithm, not_implemented_for + +from ..isolate import _isolates + +__all__ = [ + "number_connected_components", + "connected_components", + "is_connected", + "node_connected_component", +] + + +@not_implemented_for("directed") +@networkx_algorithm +def number_connected_components(G): + return sum(1 for _ in connected_components(G)) + # PREFERRED IMPLEMENTATION, BUT PLC DOES NOT HANDLE ISOLATED VERTICES WELL + # G = _to_undirected_graph(G) + # unused_node_ids, labels = plc.weakly_connected_components( + # resource_handle=plc.ResourceHandle(), + # graph=G._get_plc_graph(), + # offsets=None, + # indices=None, + # weights=None, + # labels=None, + # do_expensive_check=False, + # ) + # return cp.unique(labels).size + + +@number_connected_components._can_run +def _(G): + # NetworkX <= 3.2.1 does not check directedness for us + try: + return not G.is_directed() + except Exception: + return False + + +@not_implemented_for("directed") +@networkx_algorithm +def connected_components(G): + G = _to_undirected_graph(G) + if G.src_indices.size == 0: + # TODO: PLC doesn't handle empty graphs (or isolated nodes) gracefully! + return [{key} for key in G._nodeiter_to_iter(range(len(G)))] + node_ids, labels = plc.weakly_connected_components( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + offsets=None, + indices=None, + weights=None, + labels=None, + do_expensive_check=False, + ) + groups = _groupby(labels, node_ids) + it = (G._nodearray_to_set(connected_ids) for connected_ids in groups.values()) + # TODO: PLC doesn't handle isolated vertices yet, so this is a temporary fix + isolates = _isolates(G) + if isolates.size > 0: + isolates = isolates[isolates > node_ids.max()] + if isolates.size > 0: + it = itertools.chain( + it, ({node} for node in G._nodearray_to_list(isolates)) + ) + return it + + +@not_implemented_for("directed") +@networkx_algorithm +def is_connected(G): + G = _to_undirected_graph(G) + if len(G) == 0: + raise nx.NetworkXPointlessConcept( + "Connectivity is undefined for the null graph." + ) + for community in connected_components(G): + return len(community) == len(G) + raise RuntimeError # pragma: no cover + # PREFERRED IMPLEMENTATION, BUT PLC DOES NOT HANDLE ISOLATED VERTICES WELL + # unused_node_ids, labels = plc.weakly_connected_components( + # resource_handle=plc.ResourceHandle(), + # graph=G._get_plc_graph(), + # offsets=None, + # indices=None, + # weights=None, + # labels=None, + # do_expensive_check=False, + # ) + # return labels.size == len(G) and cp.unique(labels).size == 1 + + +@not_implemented_for("directed") +@networkx_algorithm +def node_connected_component(G, n): + # We could also do plain BFS from n + G = _to_undirected_graph(G) + node_id = n if G.key_to_id is None else G.key_to_id[n] + node_ids, labels = plc.weakly_connected_components( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + offsets=None, + indices=None, + weights=None, + labels=None, + do_expensive_check=False, + ) + indices = cp.nonzero(node_ids == node_id)[0] + if indices.size == 0: + return {n} + return G._nodearray_to_set(node_ids[labels == labels[indices[0]]]) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index 33e797935..2219388bc 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -24,6 +24,10 @@ @not_implemented_for("multigraph") @networkx_algorithm def k_truss(G, k): + """ + Currently raises `NotImplementedError` for graphs with more than one connected + component when k >= 3. We expect to fix this soon. + """ if is_nx := isinstance(G, nx.Graph): G = nxcg.from_networkx(G, preserve_all_attrs=True) if nxcg.number_of_selfloops(G) > 0: @@ -31,6 +35,7 @@ def k_truss(G, k): "Input graph has self loops which is not permitted; " "Consider using G.remove_edges_from(nx.selfloop_edges(G))." ) + # TODO: create renumbering helper function(s) if k < 3: # k-truss graph is comprised of nodes incident on k-2 triangles, so k<3 is a @@ -49,6 +54,11 @@ def k_truss(G, k): # Renumber step 1: edge values (no changes needed) edge_values = {key: val.copy() for key, val in G.edge_values.items()} edge_masks = {key: val.copy() for key, val in G.edge_masks.items()} + elif (ncc := nxcg.number_connected_components(G)) > 1: + raise NotImplementedError( + "nx_cugraph.k_truss does not yet work on graphs with more than one " + f"connected component (this graph has {ncc}). We expect to fix this soon." + ) else: edge_dtype = _get_int_dtype(G.src_indices.size - 1) edge_indices = cp.arange(G.src_indices.size, dtype=edge_dtype) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 2048c4c3d..23004651f 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -692,6 +692,11 @@ def _nodearray_to_list(self, node_ids: cp.ndarray[IndexValue]) -> list[NodeKey]: return node_ids.tolist() return list(self._nodeiter_to_iter(node_ids.tolist())) + def _nodearray_to_set(self, node_ids: cp.ndarray[IndexValue]) -> set[NodeKey]: + if self.key_to_id is None: + return set(node_ids.tolist()) + return set(self._nodeiter_to_iter(node_ids.tolist())) + def _nodearray_to_dict( self, values: cp.ndarray[NodeValue] ) -> dict[NodeKey, NodeValue]: diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index fd0b1483d..875f86210 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -223,11 +223,20 @@ def key(testpath): } ) + too_slow = "Too slow to run" + skip = { + key("test_tree_isomorphism.py:test_positive"): too_slow, + key("test_tree_isomorphism.py:test_negative"): too_slow, + } + for item in items: kset = set(item.keywords) for (test_name, keywords), reason in xfail.items(): if item.name == test_name and keywords.issubset(kset): item.add_marker(pytest.mark.xfail(reason=reason)) + for (test_name, keywords), reason in skip.items(): + if item.name == test_name and keywords.issubset(kset): + item.add_marker(pytest.mark.skip(reason=reason)) @classmethod def can_run(cls, name, args, kwargs): diff --git a/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py b/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py new file mode 100644 index 000000000..a3e4cee31 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py @@ -0,0 +1,30 @@ +# 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. +import networkx as nx +import pytest + +import nx_cugraph as nxcg + + +@pytest.mark.parametrize( + "get_graph", [nx.florentine_families_graph, nx.les_miserables_graph] +) +def test_k_truss(get_graph): + Gnx = get_graph() + Gcg = nxcg.from_networkx(Gnx, preserve_all_attrs=True) + for k in range(10): + Hnx = nx.k_truss(Gnx, k) + Hcg = nxcg.k_truss(Gcg, k) + assert nx.utils.graphs_equal(Hnx, nxcg.to_networkx(Hcg)) + if Hnx.number_of_edges() == 0: + break diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py index 0f15d236e..0048aee51 100644 --- a/python/nx-cugraph/nx_cugraph/utils/decorators.py +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -13,6 +13,7 @@ from __future__ import annotations from functools import partial, update_wrapper +from textwrap import dedent from networkx.utils.decorators import nodes_or_number, not_implemented_for @@ -65,7 +66,9 @@ def __new__( ) instance.extra_params = extra_params # The docstring on our function is added to the NetworkX docstring. - instance.extra_doc = func.__doc__ + instance.extra_doc = ( + dedent(func.__doc__.lstrip("\n").rstrip()) if func.__doc__ else None + ) # Copy __doc__ from NetworkX if instance.name in _registered_algorithms: instance.__doc__ = _registered_algorithms[instance.name].__doc__ diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py index 9683df5e7..26f023bdc 100644 --- a/python/nx-cugraph/nx_cugraph/utils/misc.py +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -21,40 +21,56 @@ import cupy as cp import numpy as np +try: + from itertools import pairwise # Python >=3.10 +except ImportError: + + def pairwise(it): + it = iter(it) + for prev in it: + for cur in it: + yield (prev, cur) + prev = cur + + __all__ = ["index_dtype", "_groupby", "_seed_to_int", "_get_int_dtype"] # This may switch to np.uint32 at some point index_dtype = np.int32 -def _groupby(groups: cp.ndarray, values: cp.ndarray) -> dict[int, cp.ndarray]: +def _groupby( + groups: cp.ndarray, values: cp.ndarray, groups_are_canonical: bool = False +) -> dict[int, cp.ndarray]: """Perform a groupby operation given an array of group IDs and array of values. Parameters ---------- groups : cp.ndarray Array that holds the group IDs. - Group IDs are assumed to be consecutive integers from 0. values : cp.ndarray Array of values to be grouped according to groups. Must be the same size as groups array. + groups_are_canonical : bool, default False + Whether the group IDs are consecutive integers beginning with 0. Returns ------- dict with group IDs as keys and cp.ndarray as values. """ - # It would actually be easy to support groups that aren't consecutive integers, - # but let's wait until we need it to implement it. - sorted_groups = cp.argsort(groups) - sorted_values = values[sorted_groups] - rv = {} - start = 0 - for i, end in enumerate( - [*(cp.nonzero(cp.diff(groups[sorted_groups]))[0] + 1).tolist(), groups.size] - ): - rv[i] = sorted_values[start:end] - start = end - return rv + if groups.size == 0: + return {} + sort_indices = cp.argsort(groups) + sorted_groups = groups[sort_indices] + sorted_values = values[sort_indices] + prepend = 1 if groups_are_canonical else sorted_groups[0] + 1 + left_bounds = cp.nonzero(cp.diff(sorted_groups, prepend=prepend))[0] + boundaries = pairwise(itertools.chain(left_bounds.tolist(), [groups.size])) + if groups_are_canonical: + it = enumerate(boundaries) + else: + it = zip(sorted_groups[left_bounds].tolist(), boundaries) + return {group: sorted_values[start:end] for group, (start, end) in it} def _seed_to_int(seed: int | Random | None) -> int: diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 3d3029da2..7e51efd4f 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -218,6 +218,7 @@ ignore = [ # Allow assert, print, RNG, and no docstring "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"] "_nx_cugraph/__init__.py" = ["E501"] +"nx_cugraph/algorithms/**/*py" = ["D205", "D401"] # Allow flexible docstrings for algorithms [tool.ruff.flake8-annotations] mypy-init-return = true From a57e688e4e51e5aa2846b1efa98f9b4e506f05d1 Mon Sep 17 00:00:00 2001 From: Divye Gala Date: Wed, 1 Nov 2023 19:19:22 -0400 Subject: [PATCH 284/384] Setup Consistent Nightly Versions for Pip and Conda (#3933) See https://github.com/rapidsai/rmm/pull/1347 Authors: - Divye Gala (https://github.com/divyegala) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3933 --- VERSION | 1 + python/nx-cugraph/nx_cugraph/VERSION | 1 + python/nx-cugraph/nx_cugraph/__init__.py | 2 +- python/nx-cugraph/nx_cugraph/_version.py | 26 ++++++++++++++++++++++++ python/nx-cugraph/pyproject.toml | 5 ++++- python/nx-cugraph/setup.py | 7 +++++-- 6 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 VERSION create mode 120000 python/nx-cugraph/nx_cugraph/VERSION create mode 100644 python/nx-cugraph/nx_cugraph/_version.py diff --git a/VERSION b/VERSION new file mode 100644 index 000000000..a193fff41 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +23.12.00 diff --git a/python/nx-cugraph/nx_cugraph/VERSION b/python/nx-cugraph/nx_cugraph/VERSION new file mode 120000 index 000000000..d62dc733e --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/VERSION @@ -0,0 +1 @@ +../../../VERSION \ No newline at end of file diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 25d442122..3a8f0996e 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -29,4 +29,4 @@ from . import algorithms from .algorithms import * -__version__ = "23.12.00" +from nx_cugraph._version import __git_commit__, __version__ diff --git a/python/nx-cugraph/nx_cugraph/_version.py b/python/nx-cugraph/nx_cugraph/_version.py new file mode 100644 index 000000000..868a2e194 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/_version.py @@ -0,0 +1,26 @@ +# 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. +# + +import importlib.resources + +# Read VERSION file from the module that is symlinked to VERSION file +# in the root of the repo at build time or copied to the moudle at +# installation. VERSION is a separate file that allows CI build-time scripts +# to update version info (including commit hashes) without modifying +# source files. +__version__ = ( + importlib.resources.files("nx_cugraph").joinpath("VERSION").read_text().strip() +) +__git_commit__ = "" diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 7e51efd4f..f309f4797 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta" [project] name = "nx-cugraph" -version = "23.12.00" +dynamic = ["version"] description = "cugraph backend for NetworkX" readme = { file = "README.md", content-type = "text/markdown" } authors = [ @@ -61,6 +61,9 @@ cugraph = "_nx_cugraph:get_info" [tool.setuptools] license-files = ["LICENSE"] +[tool.setuptools.dynamic] +version = {file = "nx_cugraph/VERSION"} + [tool.setuptools.packages.find] include = [ "nx_cugraph*", diff --git a/python/nx-cugraph/setup.py b/python/nx-cugraph/setup.py index 87c0e1064..c4ab53592 100644 --- a/python/nx-cugraph/setup.py +++ b/python/nx-cugraph/setup.py @@ -10,6 +10,9 @@ # 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. -from setuptools import setup +from setuptools import find_packages, setup -setup() +packages = find_packages(include=["nx_cugraph*"]) +setup( + package_data={key: ["VERSION"] for key in packages}, +) From 885c064806823c4acaaaa76f0b27525281215abe Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:51:33 -0600 Subject: [PATCH 285/384] Updates README file to include nx-cugraph user documentation, adds nx-cugraph to main README (#3984) * Updates the nx-cugraph README file to include nx-cugraph user documentation * Adds nx-cugraph and new News section to main README * Updates software strack diagram to remove DGL and PyG since they are not currently using PropertyGraph or cugraph-service Authors: - Rick Ratzel (https://github.com/rlratzel) - Ralph Liu (https://github.com/nv-rliu) Approvers: - Brad Rees (https://github.com/BradReesWork) --- python/nx-cugraph/README.md | 135 +++++++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 16 deletions(-) diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index ab267e5a7..148fb2f09 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -2,31 +2,134 @@ ## Description [RAPIDS](https://rapids.ai) nx-cugraph is a [backend to NetworkX](https://networkx.org/documentation/stable/reference/classes/index.html#backends) -with minimal dependencies (`networkx`, `cupy`, and `pylibcugraph`) to run graph algorithms on the GPU. +to run supported algorithms with GPU acceleration. -### Contribute +## System Requirements -Follow instructions for [contributing to cugraph](https://github.com/rapidsai/cugraph/blob/branch-23.12 -and [building from source](https://docs.rapids.ai/api/cugraph/stable/installation/source_build/), then build nx-cugraph in develop (i.e., editable) mode: -``` -$ ./build.sh nx-cugraph --pydevelop -``` +nx-cugraph requires the following: + + * NVIDIA GPU, Pascal architecture or later + * CUDA 11.2, 11.4, 11.5, 11.8, or 12.0 + * Python versions 3.9, 3.10, or 3.11 + * NetworkX >= version 3.2 -### Run tests +More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req).. -Run nx-cugraph tests from `cugraph/python/nx-cugraph` directory: +## Installation + +nx-cugraph can be installed using either conda or pip. + +### conda ``` -$ pytest +conda install -c rapidsai-nightly -c conda-forge -c nvidia nx-cugraph ``` -Run nx-cugraph benchmarks: +### pip ``` -$ pytest --bench +python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.nvidia.com ``` -Run networkx tests (requires networkx version 3.2): +Notes: + + * Nightly wheel builds will not be available until the 23.12 release, therefore the index URL for the stable release version is being used in the pip install command above. + * Additional information relevant to installing any RAPIDS package can be found [here](https://rapids.ai/#quick-start). + +## Enabling nx-cugraph + +NetworkX will use nx-cugraph as the graph analytics backend if any of the +following are are used: + +### `NETWORKX_AUTOMATIC_BACKENDS` environment variable. +The `NETWORKX_AUTOMATIC_BACKENDS` environment variable can be used to have NetworkX automatically dispatch to specified backends an API is called that the backend supports. +Set `NETWORKX_AUTOMATIC_BACKENDS=cugraph` to use nx-cugraph to GPU accelerate supported APIs with no code changes. +Example: ``` -$ ./run_nx_tests.sh +bash> NETWORKX_AUTOMATIC_BACKENDS=cugraph python my_networkx_script.py ``` -Additional arguments may be passed to pytest such as: + +### `backend=` keyword argument +To explicitly specify a particular backend for an API, use the `backend=` +keyword argument. This argument takes precedence over the +`NETWORKX_AUTOMATIC_BACKENDS` environment variable. This requires anyone +running code that uses the `backend=` keyword argument to have the specified +backend installed. + +Example: ``` -$ ./run_nx_tests.sh -x --sw -k betweenness +nx.betweenness_centrality(cit_patents_graph, k=k, backend="cugraph") ``` + +### Type-based dispatching + +NetworkX also supports automatically dispatching to backends associated with +specific graph types. Like the `backend=` keyword argument example above, this +requires the user to write code for a specific backend, and therefore requires +the backend to be installed, but has the advantage of ensuring a particular +behavior without the potential for runtime conversions. + +To use type-based dispatching with nx-cugraph, the user must import the backend +directly in their code to access the utilities provided to create a Graph +instance specifically for the nx-cugraph backend. + +Example: +``` +import networkx as nx +import nx_cugraph as nxcg + +G = nx.Graph() +... +nxcg_G = nxcg.from_networkx(G) # conversion happens once here +nx.betweenness_centrality(nxcg_G, k=1000) # nxcg Graph type causes cugraph backend + # to be used, no conversion necessary +``` + +## Supported Algorithms + +The nx-cugraph backend to NetworkX connects +[pylibcugraph](../../readme_pages/pylibcugraph.md) (cuGraph's low-level python +interface to its CUDA-based graph analytics library) and +[CuPy](https://cupy.dev/) (a GPU-accelerated array library) to NetworkX's +familiar and easy-to-use API. + +Below is the list of algorithms (many listed using pylibcugraph names), +available today in pylibcugraph or implemented using CuPy, that are or will be +supported in nx-cugraph. + +| feature/algo | release/target version | +| ----- | ----- | +| analyze_clustering_edge_cut | ? | +| analyze_clustering_modularity | ? | +| analyze_clustering_ratio_cut | ? | +| balanced_cut_clustering | ? | +| betweenness_centrality | 23.10 | +| bfs | ? | +| core_number | ? | +| degree_centrality | 23.12 | +| ecg | ? | +| edge_betweenness_centrality | 23.10 | +| ego_graph | ? | +| eigenvector_centrality | 23.12 | +| get_two_hop_neighbors | ? | +| hits | 23.12 | +| in_degree_centrality | 23.12 | +| induced_subgraph | ? | +| jaccard_coefficients | ? | +| katz_centrality | 23.12 | +| k_core | ? | +| k_truss_subgraph | 23.12 | +| leiden | ? | +| louvain | 23.10 | +| node2vec | ? | +| out_degree_centrality | 23.12 | +| overlap_coefficients | ? | +| pagerank | 23.12 | +| personalized_pagerank | ? | +| sorensen_coefficients | ? | +| spectral_modularity_maximization | ? | +| sssp | 23.12 | +| strongly_connected_components | ? | +| triangle_count | ? | +| uniform_neighbor_sample | ? | +| uniform_random_walks | ? | +| weakly_connected_components | ? | + +To request nx-cugraph backend support for a NetworkX API that is not listed +above, visit the [cuGraph GitHub repo](https://github.com/rapidsai/cugraph). From 72c5ca80a027d4e03c695a0da9130f9b7cb3450d Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 8 Nov 2023 11:07:29 -0600 Subject: [PATCH 286/384] Fixes typos, updates link to NX backend docs. (#3989) * Fixes typos (repeated word, extra periods) * Updates link to the current docs on NetworkX backends Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Ray Douglass (https://github.com/raydouglass) --- python/nx-cugraph/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index 148fb2f09..273a6112d 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -1,7 +1,7 @@ # nx-cugraph ## Description -[RAPIDS](https://rapids.ai) nx-cugraph is a [backend to NetworkX](https://networkx.org/documentation/stable/reference/classes/index.html#backends) +[RAPIDS](https://rapids.ai) nx-cugraph is a [backend to NetworkX](https://networkx.org/documentation/stable/reference/utils.html#backends) to run supported algorithms with GPU acceleration. ## System Requirements @@ -13,7 +13,7 @@ nx-cugraph requires the following: * Python versions 3.9, 3.10, or 3.11 * NetworkX >= version 3.2 -More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req).. +More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req). ## Installation @@ -35,7 +35,7 @@ Notes: ## Enabling nx-cugraph NetworkX will use nx-cugraph as the graph analytics backend if any of the -following are are used: +following are used: ### `NETWORKX_AUTOMATIC_BACKENDS` environment variable. The `NETWORKX_AUTOMATIC_BACKENDS` environment variable can be used to have NetworkX automatically dispatch to specified backends an API is called that the backend supports. From cc7b17ea527cf5472757a7a215cc14117bc73651 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:29:03 -0600 Subject: [PATCH 287/384] Adds update-version.sh support for proper versioning to cu version suffix pacakges and nx-cugraph meta-data files. (#3994) Adds `update-version.sh` support for: * nx-cugraph meta-data files * `cugraph-pyg`, `cugraph-dgl` env yaml files * `*-cu11`, `*-cu12` wheel dependencies in dependencies.yaml Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Alex Barghi (https://github.com/alexbarghi-nv) - Brad Rees (https://github.com/BradReesWork) - Ray Douglass (https://github.com/raydouglass) --- python/nx-cugraph/_nx_cugraph/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 8ef976aab..26638d1e7 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -136,6 +136,7 @@ def get_info(): return d +# FIXME: can this use the standard VERSION file and update mechanism? __version__ = "23.12.00" if __name__ == "__main__": From 5fb4d97abef1c758550e7fad1371b03735dd3303 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Tue, 14 Nov 2023 11:31:50 -0500 Subject: [PATCH 288/384] v24.02 Updates [skip ci] --- VERSION | 2 +- docs/cugraph/source/conf.py | 4 ++-- python/nx-cugraph/_nx_cugraph/__init__.py | 4 ++-- python/nx-cugraph/pyproject.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index a193fff41..3c6c5e2b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -23.12.00 +24.02.00 diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 470086b4f..940d21442 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -77,9 +77,9 @@ # built documents. # # The short X.Y version. -version = '23.12' +version = '24.02' # The full version, including alpha/beta/rc tags. -release = '23.12.00' +release = '24.02.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 26638d1e7..2e5a16aa4 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -24,7 +24,7 @@ "backend_name": "cugraph", "project": "nx-cugraph", "package": "nx_cugraph", - "url": "https://github.com/rapidsai/cugraph/tree/branch-23.12/python/nx-cugraph", + "url": "https://github.com/rapidsai/cugraph/tree/branch-24.02/python/nx-cugraph", "short_summary": "GPU-accelerated backend.", # "description": "TODO", "functions": { @@ -137,7 +137,7 @@ def get_info(): # FIXME: can this use the standard VERSION file and update mechanism? -__version__ = "23.12.00" +__version__ = "24.02.00" if __name__ == "__main__": from pathlib import Path diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index f309f4797..b29578b03 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "cupy-cuda11x>=12.0.0", "networkx>=3.0", "numpy>=1.21", - "pylibcugraph==23.12.*", + "pylibcugraph==24.2.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. [project.optional-dependencies] From 3f1619828998b460ed67845bd1538da5295f1b1c Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Mon, 20 Nov 2023 17:36:50 -0600 Subject: [PATCH 289/384] nx-cugraph: add SSSP (unweighted) (#3976) There are many more traversal algorithms to implement, but these get us started! Authors: - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3976 --- python/nx-cugraph/_nx_cugraph/__init__.py | 2 + .../nx_cugraph/algorithms/__init__.py | 3 +- .../algorithms/shortest_paths/__init__.py | 13 +++++ .../algorithms/shortest_paths/unweighted.py | 53 +++++++++++++++++++ python/nx-cugraph/nx_cugraph/classes/graph.py | 9 +++- python/nx-cugraph/nx_cugraph/interface.py | 2 + 6 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 26638d1e7..910db1bc3 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -79,6 +79,8 @@ "path_graph", "petersen_graph", "sedgewick_maze_graph", + "single_source_shortest_path_length", + "single_target_shortest_path_length", "star_graph", "tadpole_graph", "tetrahedral_graph", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 87b1967fa..32cd6f31a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -10,9 +10,10 @@ # 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. -from . import bipartite, centrality, community, components +from . import bipartite, centrality, community, components, shortest_paths from .bipartite import complete_bipartite_graph from .centrality import * from .components import * from .core import * from .isolate import * +from .shortest_paths import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py new file mode 100644 index 000000000..b7d6b7421 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .unweighted import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py new file mode 100644 index 000000000..3413a637b --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py @@ -0,0 +1,53 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import index_dtype, networkx_algorithm + +__all__ = ["single_source_shortest_path_length", "single_target_shortest_path_length"] + + +@networkx_algorithm +def single_source_shortest_path_length(G, source, cutoff=None): + return _single_shortest_path_length(G, source, cutoff, "Source") + + +@networkx_algorithm +def single_target_shortest_path_length(G, target, cutoff=None): + return _single_shortest_path_length(G, target, cutoff, "Target") + + +def _single_shortest_path_length(G, source, cutoff, kind): + G = _to_graph(G) + if source not in G: + raise nx.NodeNotFound(f"{kind} {source} is not in G") + if G.src_indices.size == 0: + return {source: 0} + if cutoff is None: + cutoff = -1 + src_index = source if G.key_to_id is None else G.key_to_id[source] + distances, predecessors, node_ids = plc.bfs( + handle=plc.ResourceHandle(), + graph=G._get_plc_graph(switch_indices=kind == "Target"), + sources=cp.array([src_index], index_dtype), + direction_optimizing=False, # True for undirected only; what's recommended? + depth_limit=cutoff, + compute_predecessors=False, + do_expensive_check=False, + ) + mask = distances != np.iinfo(distances.dtype).max + return G._nodearrays_to_dict(node_ids[mask], distances[mask]) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 23004651f..fea318e03 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -559,6 +559,7 @@ def _get_plc_graph( edge_dtype: Dtype | None = None, *, store_transposed: bool = False, + switch_indices: bool = False, edge_array: cp.ndarray[EdgeValue] | None = None, ): if edge_array is not None: @@ -613,14 +614,18 @@ def _get_plc_graph( elif edge_array.dtype not in self._plc_allowed_edge_types: raise TypeError(edge_array.dtype) # Should we cache PLC graph? + src_indices = self.src_indices + dst_indices = self.dst_indices + if switch_indices: + src_indices, dst_indices = dst_indices, src_indices return plc.SGGraph( resource_handle=plc.ResourceHandle(), graph_properties=plc.GraphProperties( is_multigraph=self.is_multigraph(), is_symmetric=not self.is_directed(), ), - src_or_offset_array=self.src_indices, - dst_or_index_array=self.dst_indices, + src_or_offset_array=src_indices, + dst_or_index_array=dst_indices, weight_array=edge_array, store_transposed=store_transposed, renumber=False, diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 875f86210..8903fdc54 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -224,9 +224,11 @@ def key(testpath): ) too_slow = "Too slow to run" + maybe_oom = "out of memory in CI" skip = { key("test_tree_isomorphism.py:test_positive"): too_slow, key("test_tree_isomorphism.py:test_negative"): too_slow, + key("test_efficiency.py:TestEfficiency.test_using_ego_graph"): maybe_oom, } for item in items: From 7124054c5513b2b362444ccaedca393a09516425 Mon Sep 17 00:00:00 2001 From: Brad Rees <34135411+BradReesWork@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:48:41 -0500 Subject: [PATCH 290/384] adding C/C++ API docs (#3938) adding C and C++ API Adding WholeGraph APIs Adding cugraph-ops APIs closes #3406 Authors: - Brad Rees (https://github.com/BradReesWork) - GALI PREM SAGAR (https://github.com/galipremsagar) - Ralph Liu (https://github.com/nv-rliu) - Don Acosta (https://github.com/acostadon) Approvers: - Seunghwa Kang (https://github.com/seunghwak) - Don Acosta (https://github.com/acostadon) - Rick Ratzel (https://github.com/rlratzel) - AJ Schmidt (https://github.com/ajschmidt8) URL: https://github.com/rapidsai/cugraph/pull/3938 --- .gitignore | 4 +- docs/cugraph/Makefile | 2 +- .../cugraph-ops/bipartite_operators.rst | 16 -- .../api_docs/cugraph-ops/c_cpp/index.rst | 3 + .../api_docs/cugraph-ops/fg_operators.rst | 83 ------- .../api_docs/cugraph-ops/graph_types.rst | 33 --- .../source/api_docs/cugraph-ops/index.rst | 11 +- .../api_docs/cugraph-ops/mfg_operators.rst | 31 --- .../cugraph-ops/{ => python}/dimenet.rst | 4 +- .../cugraph-ops/python/graph_types.rst | 34 +++ .../api_docs/cugraph-ops/python/index.rst | 13 + .../api_docs/cugraph-ops/python/operators.rst | 93 +++++++ .../cugraph-ops/{ => python}/pytorch.rst | 22 +- .../api_docs/cugraph-ops/static_operators.rst | 16 -- .../api_docs/cugraph-pyg/cugraph_pyg.rst | 4 +- .../source/api_docs/cugraph_c/c_and_cpp.rst | 4 - .../source/api_docs/cugraph_c/centrality.rst | 51 ++++ .../source/api_docs/cugraph_c/community.rst | 63 +++++ .../source/api_docs/cugraph_c/core.rst | 21 ++ .../source/api_docs/cugraph_c/index.rst | 16 ++ .../source/api_docs/cugraph_c/labeling.rst | 20 ++ .../source/api_docs/cugraph_c/sampling.rst | 37 +++ .../source/api_docs/cugraph_c/similarity.rst | 25 ++ .../source/api_docs/cugraph_c/traversal.rst | 30 +++ docs/cugraph/source/api_docs/index.rst | 33 ++- .../service/cugraph_service_client.rst | 2 +- .../service/cugraph_service_server.rst | 2 +- .../source/api_docs/wholegraph/index.rst | 11 + .../wholegraph/libwholegraph/index.rst | 228 ++++++++++++++++++ .../wholegraph/pylibwholegraph/index.rst | 38 +++ docs/cugraph/source/basics/cugraph_intro.md | 9 +- docs/cugraph/source/conf.py | 5 +- .../source/graph_support/algorithms.md | 12 +- .../graph_support/algorithms/Centrality.md | 12 +- .../graph_support/algorithms/Similarity.md | 6 +- docs/cugraph/source/index.rst | 10 +- .../source/wholegraph/basics/index.rst | 11 + .../wholegraph/basics/wholegraph_intro.md | 135 +++++++++++ .../wholememory_implementation_details.md | 58 +++++ .../wholegraph/basics/wholememory_intro.md | 123 ++++++++++ .../imgs/device_chunked_wholememory_step1.png | Bin 0 -> 23136 bytes .../imgs/device_chunked_wholememory_step2.png | Bin 0 -> 28201 bytes .../device_continuous_wholememory_step1.png | Bin 0 -> 21107 bytes .../device_continuous_wholememory_step2.png | Bin 0 -> 26434 bytes .../imgs/distributed_wholememory.png | Bin 0 -> 23138 bytes .../wholegraph/imgs/general_wholememory.png | Bin 0 -> 14073 bytes .../imgs/host_mapped_wholememory_step1.png | Bin 0 -> 21733 bytes .../imgs/host_mapped_wholememory_step2.png | Bin 0 -> 32110 bytes .../wholegraph/imgs/wholememory_tensor.png | Bin 0 -> 40367 bytes docs/cugraph/source/wholegraph/index.rst | 14 ++ .../wholegraph/installation/container.md | 29 +++ .../installation/getting_wholegraph.md | 48 ++++ .../source/wholegraph/installation/index.rst | 9 + .../wholegraph/installation/source_build.md | 187 ++++++++++++++ 54 files changed, 1375 insertions(+), 243 deletions(-) delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst rename docs/cugraph/source/api_docs/cugraph-ops/{ => python}/dimenet.rst (89%) create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/index.rst create mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst rename docs/cugraph/source/api_docs/cugraph-ops/{ => python}/pytorch.rst (59%) delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/centrality.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/community.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/core.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/index.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/labeling.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/sampling.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/similarity.rst create mode 100644 docs/cugraph/source/api_docs/cugraph_c/traversal.rst create mode 100644 docs/cugraph/source/api_docs/wholegraph/index.rst create mode 100644 docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst create mode 100644 docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst create mode 100644 docs/cugraph/source/wholegraph/basics/index.rst create mode 100644 docs/cugraph/source/wholegraph/basics/wholegraph_intro.md create mode 100644 docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md create mode 100644 docs/cugraph/source/wholegraph/basics/wholememory_intro.md create mode 100644 docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png create mode 100644 docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png create mode 100644 docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step1.png create mode 100644 docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png create mode 100644 docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png create mode 100644 docs/cugraph/source/wholegraph/imgs/general_wholememory.png create mode 100644 docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step1.png create mode 100644 docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png create mode 100644 docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png create mode 100644 docs/cugraph/source/wholegraph/index.rst create mode 100644 docs/cugraph/source/wholegraph/installation/container.md create mode 100644 docs/cugraph/source/wholegraph/installation/getting_wholegraph.md create mode 100644 docs/cugraph/source/wholegraph/installation/index.rst create mode 100644 docs/cugraph/source/wholegraph/installation/source_build.md diff --git a/.gitignore b/.gitignore index c6bcf6965..358650cfc 100644 --- a/.gitignore +++ b/.gitignore @@ -84,8 +84,10 @@ datasets/* # Jupyter Notebooks .ipynb_checkpoints -## Doxygen +## Doxygen and Docs cpp/doxygen/html +docs/cugraph/lib* +docs/cugraph/api/* # created by Dask tests python/dask-worker-space diff --git a/docs/cugraph/Makefile b/docs/cugraph/Makefile index 32237aa2c..f92d0be69 100644 --- a/docs/cugraph/Makefile +++ b/docs/cugraph/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = "-v" SPHINXBUILD = sphinx-build SPHINXPROJ = cugraph SOURCEDIR = source diff --git a/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst deleted file mode 100644 index e172309fa..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/bipartite_operators.rst +++ /dev/null @@ -1,16 +0,0 @@ -============================= -Operators on Bipartite Graphs -============================= - -.. currentmodule:: pylibcugraphops - -Update Edges: Concatenation or Sum of Edge and Node Features ------------------------------------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.update_efeat_bipartite_e2e_concat_fwd - operators.update_efeat_bipartite_e2e_concat_bwd - - operators.update_efeat_bipartite_e2e_sum_fwd - operators.update_efeat_bipartite_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst new file mode 100644 index 000000000..5545bebe9 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst @@ -0,0 +1,3 @@ +cugraph-ops C++ API Reference +============================= + diff --git a/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst deleted file mode 100644 index 387844f68..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/fg_operators.rst +++ /dev/null @@ -1,83 +0,0 @@ -======================== -Operators on Full Graphs -======================== - -.. currentmodule:: pylibcugraphops - -Simple Neighborhood Aggregator (SAGEConv) ------------------------------------------ -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_simple_fg_n2n_fwd - operators.agg_simple_fg_n2n_bwd - operators.agg_simple_fg_e2n_fwd - operators.agg_simple_fg_e2n_bwd - operators.agg_simple_fg_n2n_e2n_fwd - operators.agg_simple_fg_n2n_e2n_bwd - - operators.agg_concat_fg_n2n_fwd - operators.agg_concat_fg_n2n_bwd - operators.agg_concat_fg_e2n_fwd - operators.agg_concat_fg_e2n_bwd - operators.agg_concat_fg_n2n_e2n_fwd - operators.agg_concat_fg_n2n_e2n_bwd - -Weighted Neighborhood Aggregation ---------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_weighted_fg_n2n_fwd - operators.agg_weighted_fg_n2n_bwd - operators.agg_concat_weighted_fg_n2n_fwd - operators.agg_concat_weighted_fg_n2n_bwd - -Heterogenous Aggregator using Basis Decomposition (RGCNConv) ------------------------------------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_hg_basis_fg_n2n_post_fwd - operators.agg_hg_basis_fg_n2n_post_bwd - -Graph Attention (GATConv/GATv2Conv) ------------------------------------ -.. autosummary:: - :toctree: ../api/ops/ - - operators.mha_gat_fg_n2n_fwd - operators.mha_gat_fg_n2n_bwd - operators.mha_gat_fg_n2n_efeat_fwd - operators.mha_gat_fg_n2n_efeat_bwd - - operators.mha_gat_v2_fg_n2n_fwd - operators.mha_gat_v2_fg_n2n_bwd - operators.mha_gat_v2_fg_n2n_efeat_fwd - operators.mha_gat_v2_fg_n2n_efeat_bwd - -Transformer-like Graph Attention (TransformerConv) --------------------------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.mha_gat_v2_fg_n2n_fwd - operators.mha_gat_v2_fg_n2n_bwd - operators.mha_gat_v2_fg_n2n_efeat_fwd - operators.mha_gat_v2_fg_n2n_efeat_bwd - -Directional Message-Passing (DMPNN) ------------------------------------ -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_dmpnn_fg_e2e_fwd - operators.agg_dmpnn_fg_e2e_bwd - -Graph Pooling -------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.pool_fg_n2s_fwd - operators.pool_fg_n2s_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst b/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst deleted file mode 100644 index 9289ce53e..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/graph_types.rst +++ /dev/null @@ -1,33 +0,0 @@ -=========== -Graph types -=========== - -.. currentmodule:: pylibcugraphops - -Message-Flow Graph (MFG) -------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - make_mfg_csr - -Heterogenous MFG ----------------- -.. autosummary:: - :toctree: ../api/ops/ - - make_mfg_csr_hg - -"Full" Graph (FG) ------------------ -.. autosummary:: - :toctree: ../api/ops/ - - make_fg_csr - -Heterogenous FG ---------------- -.. autosummary:: - :toctree: ../api/ops/ - - make_fg_csr_hg diff --git a/docs/cugraph/source/api_docs/cugraph-ops/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/index.rst index e2338dc18..fdfd5baab 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/index.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/index.rst @@ -1,4 +1,3 @@ -========================= cugraph-ops API reference ========================= @@ -8,11 +7,5 @@ This page provides a list of all publicly accessible modules, methods and classe :maxdepth: 2 :caption: API Documentation - graph_types - pytorch - mfg_operators - bipartite_operators - static_operators - fg_operators - dimenet - pytorch + python/index + c_cpp/index \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst deleted file mode 100644 index f3dd1faa2..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/mfg_operators.rst +++ /dev/null @@ -1,31 +0,0 @@ -================================ -Operators on Message-Flow Graphs -================================ - -.. currentmodule:: pylibcugraphops - -Simple Neighborhood Aggregator (SAGEConv) ------------------------------------------ -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_simple_mfg_n2n_fwd - operators.agg_simple_mfg_n2n_bwd - operators.agg_concat_mfg_n2n_fwd - operators.agg_concat_mfg_n2n_bwd - -Graph Attention (GATConv) -------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.mha_gat_mfg_n2n_fwd - operators.mha_gat_mfg_n2n_bwd - -Heterogenous Aggregator using Basis Decomposition (RGCNConv) ------------------------------------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.agg_hg_basis_mfg_n2n_post_fwd - operators.agg_hg_basis_mfg_n2n_post_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst similarity index 89% rename from docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst rename to docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst index b709464c7..6fadcc57b 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/dimenet.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst @@ -7,7 +7,7 @@ Dimenet operators Radial Basis Functions ---------------------- .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops dimenet.radial_basis_fwd dimenet.radial_basis_bwd @@ -16,7 +16,7 @@ Radial Basis Functions Edge-to-Edge Aggregation ------------------------- .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops dimenet.agg_edge_to_edge_fwd dimenet.agg_edge_to_edge_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst new file mode 100644 index 000000000..141d40393 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst @@ -0,0 +1,34 @@ +=========== +Graph types +=========== + +.. currentmodule:: pylibcugraphops + + +CSC Graph +----------------- +.. autosummary:: + :toctree: ../../api/ops + + make_csc + +Heterogenous CSC Graph +---------------------- +.. autosummary:: + :toctree: ../../api/ops + + make_csc_hg + +Bipartite Graph +----------------- +.. autosummary:: + :toctree: ../../api/ops + + make_bipartite_csc + +Heterogenous Bipartite Graph +---------------------------- +.. autosummary:: + :toctree: ../../api/ops + + make_bipartite_csc_hg diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst new file mode 100644 index 000000000..082c7741f --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst @@ -0,0 +1,13 @@ +cugraph-ops Python API reference +================================ + +This page provides a list of all publicly accessible modules, methods and classes through `pylibcugraphops.*` namespace. + +.. toctree:: + :maxdepth: 2 + :caption: API Documentation + + graph_types + operators + dimenet + pytorch diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst new file mode 100644 index 000000000..3e6664b2d --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst @@ -0,0 +1,93 @@ +============================= +Operators for Message-Passing +============================= + +.. currentmodule:: pylibcugraphops + +Simple Neighborhood Aggregator (SAGEConv) +----------------------------------------- +.. autosummary:: + :toctree: ../../api/ops + + operators.agg_simple_n2n_fwd + operators.agg_simple_n2n_bwd + operators.agg_simple_e2n_fwd + operators.agg_simple_e2n_bwd + operators.agg_simple_n2n_e2n_fwd + operators.agg_simple_n2n_e2n_bwd + + operators.agg_concat_n2n_fwd + operators.agg_concat_n2n_bwd + operators.agg_concat_e2n_fwd + operators.agg_concat_e2n_bwd + operators.agg_concat_n2n_e2n_fwd + operators.agg_concat_n2n_e2n_bwd + + +Weighted Neighborhood Aggregation +--------------------------------- +.. autosummary:: + :toctree: ../../api/ops + + operators.agg_weighted_n2n_fwd + operators.agg_weighted_n2n_bwd + operators.agg_concat_weighted_n2n_fwd + operators.agg_concat_weighted_n2n_bwd + +Heterogenous Aggregator using Basis Decomposition (RGCNConv) +------------------------------------------------------------ +.. autosummary:: + :toctree: ../../api/ops + + operators.agg_hg_basis_n2n_post_fwd + operators.agg_hg_basis_n2n_post_bwd + +Graph Attention (GATConv/GATv2Conv) +----------------------------------- +.. autosummary:: + :toctree: ../../api/ops + + operators.mha_gat_n2n_fwd + operators.mha_gat_n2n_bwd + operators.mha_gat_n2n_efeat_fwd + operators.mha_gat_n2n_efeat_bwd + + operators.mha_gat_v2_n2n_fwd + operators.mha_gat_v2_n2n_bwd + operators.mha_gat_v2_n2n_efeat_fwd + operators.mha_gat_v2_n2n_efeat_bwd + +Transformer-like Graph Attention (TransformerConv) +-------------------------------------------------- +.. autosummary:: + :toctree: ../../api/ops + + operators.mha_gat_v2_n2n_fwd + operators.mha_gat_v2_n2n_bwd + operators.mha_gat_v2_n2n_efeat_fwd + operators.mha_gat_v2_n2n_efeat_bwd + +Directional Message-Passing (DMPNN) +----------------------------------- +.. autosummary:: + :toctree: ../../api/ops + + operators.agg_dmpnn_e2e_fwd + operators.agg_dmpnn_e2e_bwd + +Update Edges: Concatenation or Sum of Edge and Node Features +------------------------------------------------------------ +.. autosummary:: + :toctree: ../../api/ops + + operators.update_efeat_e2e_concat_fwd + operators.update_efeat_e2e_concat_bwd + + operators.update_efeat_e2e_sum_fwd + operators.update_efeat_e2e_sum_bwd + + operators.update_efeat_e2e_concat_fwd + operators.update_efeat_e2e_concat_bwd + + operators.update_efeat_e2e_sum_fwd + operators.update_efeat_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst similarity index 59% rename from docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst rename to docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst index 83800fbc5..d2074df15 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/pytorch.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst @@ -2,35 +2,35 @@ PyTorch Autograd Wrappers ========================== -.. currentmodule:: pylibcugraphops +.. currentmodule:: pylibcugraphops.pytorch Simple Neighborhood Aggregator (SAGEConv) ----------------------------------------- .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops - pytorch.operators.agg_concat_n2n + operators.agg_concat_n2n Graph Attention (GATConv/GATv2Conv) ----------------------------------- .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops - pytorch.operators.mha_gat_n2n - pytorch.operators.mha_gat_v2_n2n + operators.mha_gat_n2n + operators.mha_gat_v2_n2n Heterogenous Aggregator using Basis Decomposition (RGCNConv) ------------------------------------------------------------ .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops - pytorch.operators.agg_hg_basis_n2n_post + operators.agg_hg_basis_n2n_post Update Edges: Concatenation or Sum of Edge and Node Features ------------------------------------------------------------ .. autosummary:: - :toctree: ../api/ops/ + :toctree: ../../api/ops - pytorch.operators.update_efeat_bipartite_e2e - pytorch.operators.update_efeat_static_e2e + operators.update_efeat_e2e + operators.update_efeat_e2e diff --git a/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst deleted file mode 100644 index f3ecc068f..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/static_operators.rst +++ /dev/null @@ -1,16 +0,0 @@ -========================== -Operators on Static Graphs -========================== - -.. currentmodule:: pylibcugraphops - -Update Edges: Concatenation or Sum of Edge and Node Features ------------------------------------------------------------- -.. autosummary:: - :toctree: ../api/ops/ - - operators.update_efeat_static_e2e_concat_fwd - operators.update_efeat_static_e2e_concat_bwd - - operators.update_efeat_static_e2e_sum_fwd - operators.update_efeat_static_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst index 2cd8969aa..f7d7f5f22 100644 --- a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst @@ -9,6 +9,6 @@ cugraph-pyg .. autosummary:: :toctree: ../api/cugraph-pyg/ - cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore - cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler +.. cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore +.. cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler diff --git a/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst b/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst deleted file mode 100644 index 34b812785..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/c_and_cpp.rst +++ /dev/null @@ -1,4 +0,0 @@ -CuGraph C and C++ API Links -=========================== - -coming soon - see https://docs.rapids.ai/api/libcugraph/nightly/ \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/cugraph_c/centrality.rst b/docs/cugraph/source/api_docs/cugraph_c/centrality.rst new file mode 100644 index 000000000..f34e26ad7 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/centrality.rst @@ -0,0 +1,51 @@ +Centrality +========== + +PageRank +-------- +.. doxygenfunction:: cugraph_pagerank + :project: libcugraph + +.. doxygenfunction:: cugraph_pagerank_allow_nonconvergence + :project: libcugraph + +Personalized PageRank +--------------------- +.. doxygenfunction:: cugraph_personalized_pagerank + :project: libcugraph + +.. doxygenfunction:: cugraph_personalized_pagerank_allow_nonconvergence + :project: libcugraph + +Eigenvector Centrality +---------------------- +.. doxygenfunction:: cugraph_eigenvector_centrality + :project: libcugraph + +Katz Centrality +--------------- +.. doxygenfunction:: cugraph_katz_centrality + :project: libcugraph + +Betweenness Centrality +---------------------- +.. doxygenfunction:: cugraph_betweenness_centrality + :project: libcugraph + +Edge Betweenness Centrality +--------------------------- +.. doxygenfunction:: cugraph_edge_betweenness_centrality + :project: libcugraph + +HITS Centrality +--------------- +.. doxygenfunction:: cugraph_hits + :project: libcugraph + +Centrality Support Functions +---------------------------- + .. doxygengroup:: centrality + :project: libcugraph + :members: + :content-only: + diff --git a/docs/cugraph/source/api_docs/cugraph_c/community.rst b/docs/cugraph/source/api_docs/cugraph_c/community.rst new file mode 100644 index 000000000..0bbfe365c --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/community.rst @@ -0,0 +1,63 @@ +Community +========= + +.. role:: py(code) + :language: c + :class: highlight + +``#include `` + +Triangle Counting +----------------- +.. doxygenfunction:: cugraph_triangle_count + :project: libcugraph + +Louvain +------- +.. doxygenfunction:: cugraph_louvain + :project: libcugraph + +Leiden +------ +.. doxygenfunction:: cugraph_leiden + :project: libcugraph + +ECG +--- +.. doxygenfunction:: cugraph_ecg + :project: libcugraph + +Extract Egonet +-------------- +.. doxygenfunction:: cugraph_extract_ego + :project: libcugraph + +Balanced Cut +------------ +.. doxygenfunction:: cugraph_balanced_cut_clustering + :project: libcugraph + +Spectral Clustering - Modularity Maximization +--------------------------------------------- +.. doxygenfunction:: cugraph_spectral_modularity_maximization + :project: libcugraph + +.. doxygenfunction:: cugraph_analyze_clustering_modularity + :project: libcugraph + +Spectral Clusteriong - Edge Cut +------------------------------- +.. doxygenfunction:: cugraph_analyze_clustering_edge_cut + :project: libcugraph + +.. doxygenfunction:: cugraph_analyze_clustering_ratio_cut + :project: libcugraph + + +Community Support Functions +--------------------------- + .. doxygengroup:: community + :project: libcugraph + :members: + :content-only: + diff --git a/docs/cugraph/source/api_docs/cugraph_c/core.rst b/docs/cugraph/source/api_docs/cugraph_c/core.rst new file mode 100644 index 000000000..34456c65e --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/core.rst @@ -0,0 +1,21 @@ +Core +==== + + +Core Number +----------- +.. doxygenfunction:: cugraph_core_number + :project: libcugraph + +K-Core +------ +.. doxygenfunction:: cugraph_k_core + :project: libcugraph + + +Core Support Functions +---------------------- + .. doxygengroup:: core + :project: libcugraph + :members: + :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/index.rst b/docs/cugraph/source/api_docs/cugraph_c/index.rst new file mode 100644 index 000000000..3dd37dbc3 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/index.rst @@ -0,0 +1,16 @@ +=========================== +cuGraph C API documentation +=========================== + + +.. toctree:: + :maxdepth: 3 + :caption: API Documentation + + centrality.rst + community.rst + core.rst + labeling.rst + sampling.rst + similarity.rst + traversal.rst diff --git a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst new file mode 100644 index 000000000..af105ee8f --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst @@ -0,0 +1,20 @@ +Components +========== + + +Weakly Connected Components +--------------------------- +.. doxygenfunction:: cugraph_weakly_connected_components + :project: libcugraph + +Strongly Connected Components +----------------------------- +.. doxygenfunction:: cugraph_strongly_connected_components + :project: libcugraph + +Support +------- + .. doxygengroup:: labeling + :project: libcugraph + :members: + :content-only: \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/cugraph_c/sampling.rst b/docs/cugraph/source/api_docs/cugraph_c/sampling.rst new file mode 100644 index 000000000..21b837daf --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/sampling.rst @@ -0,0 +1,37 @@ +Sampling +======== + +Uniform Random Walks +-------------------- +.. doxygenfunction:: cugraph_uniform_random_walks + :project: libcugraph + +Biased Random Walks +-------------------- +.. doxygenfunction:: cugraph_biased_random_walks + :project: libcugraph + +Random Walks via Node2Vec +------------------------- +.. doxygenfunction:: cugraph_node2vec_random_walks + :project: libcugraph + +Node2Vec +-------- +.. doxygenfunction:: cugraph_node2vec + :project: libcugraph + +Uniform Neighborhood Sampling +----------------------------- +.. doxygenfunction:: cugraph_uniform_neighbor_sample_with_edge_properties + :project: libcugraph + +.. doxygenfunction:: cugraph_uniform_neighbor_sample + :project: libcugraph + +Support +------- +.. doxygengroup:: samplingC + :project: libcugraph + :members: + :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst new file mode 100644 index 000000000..fba07ad20 --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst @@ -0,0 +1,25 @@ +Similarity +========== + + +Jaccard +------- +.. doxygenfunction:: cugraph_jaccard_coefficients + :project: libcugraph + +Sorensen +-------- +.. doxygenfunction:: cugraph_sorensen_coefficients + :project: libcugraph + +Overlap +------- +.. doxygenfunction:: cugraph_overlap_coefficients + :project: libcugraph + +Support +------- +.. doxygengroup:: similarity + :project: libcugraph + :members: + :content-only: \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst new file mode 100644 index 000000000..c90760e9e --- /dev/null +++ b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst @@ -0,0 +1,30 @@ +Traversal +========== + + +Breadth First Search (BFS) +-------------------------- +.. doxygenfunction:: cugraph_bfs + :project: libcugraph + +Single-Source Shortest-Path (SSSP) +---------------------------------- +.. doxygenfunction:: cugraph_sssp + :project: libcugraph + +Path Extraction +--------------- +.. doxygenfunction:: cugraph_extract_paths + :project: libcugraph + +Extract Max Path Length +----------------------- +.. doxygenfunction:: cugraph_extract_paths_result_get_max_path_length + :project: libcugraph + +Support +------- +.. doxygengroup:: traversal + :project: libcugraph + :members: + :content-only: \ No newline at end of file diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 45f7210f5..74ca98bb9 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -1,16 +1,39 @@ -Python API reference -==================== +API Reference +============= This page provides a list of all publicly accessible Python modules with in the Graph collection +Core Graph API Documentation +---------------------------- + .. toctree:: - :maxdepth: 2 - :caption: Python API Documentation + :maxdepth: 3 + :caption: Core Graph API Documentation cugraph/index.rst plc/pylibcugraph.rst + cugraph_c/index.rst + cugraph_cpp/index.rst + +Graph Nerual Networks API Documentation +--------------------------------------- + +.. toctree:: + :maxdepth: 3 + :caption: Graph Nerual Networks API Documentation + cugraph-dgl/cugraph_dgl.rst cugraph-pyg/cugraph_pyg.rst - service/index.rst cugraph-ops/index.rst + wholegraph/index.rst + +Additional Graph Packages API Documentation +---------------------------------- + +.. toctree:: + :maxdepth: 3 + :caption: Additional Graph Packages API Documentation + + service/index.rst + diff --git a/docs/cugraph/source/api_docs/service/cugraph_service_client.rst b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst index 383b31d26..7e344d326 100644 --- a/docs/cugraph/source/api_docs/service/cugraph_service_client.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst @@ -9,7 +9,7 @@ cugraph-service .. autosummary:: :toctree: ../api/service/ - cugraph_service_client.client.RunAsyncioThread +.. cugraph_service_client.client.RunAsyncioThread cugraph_service_client.client.run_async cugraph_service_client.client.DeviceArrayAllocator cugraph_service_client.client.CugraphServiceClient diff --git a/docs/cugraph/source/api_docs/service/cugraph_service_server.rst b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst index a7e8b5475..09ca8360b 100644 --- a/docs/cugraph/source/api_docs/service/cugraph_service_server.rst +++ b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst @@ -9,6 +9,6 @@ cugraph-service .. autosummary:: :toctree: ../api/service/ - cugraph_service_server.cugraph_handler.call_algo +.. cugraph_service_server.cugraph_handler.call_algo cugraph_service_server.cugraph_handler.ExtensionServerFacade cugraph_service_server.cugraph_handler.CugraphHandler diff --git a/docs/cugraph/source/api_docs/wholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/index.rst new file mode 100644 index 000000000..80e231d46 --- /dev/null +++ b/docs/cugraph/source/api_docs/wholegraph/index.rst @@ -0,0 +1,11 @@ +WholeGraph API reference +======================== + +This page provides WholeGraph API reference + +.. toctree:: + :maxdepth: 2 + :caption: WholeGraph API Documentation + + libwholegraph/index.rst + pylibwholegraph/index.rst diff --git a/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst new file mode 100644 index 000000000..4ef68abef --- /dev/null +++ b/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst @@ -0,0 +1,228 @@ +===================== +libwholegraph API doc +===================== + +Doxygen WholeGraph C API documentation +-------------------------------------- +For doxygen documentation, please refer to `Doxygen Documentation <../../doxygen_docs/libwholegraph/html/index.html>`_ + +WholeGraph C API documentation +------------------------------ + +Library Level APIs +++++++++++++++++++ + +.. doxygenenum:: wholememory_error_code_t + :project: libwholegraph +.. doxygenfunction:: wholememory_init + :project: libwholegraph +.. doxygenfunction:: wholememory_finalize + :project: libwholegraph +.. doxygenfunction:: fork_get_device_count + :project: libwholegraph + +WholeMemory Communicator APIs ++++++++++++++++++++++++++++++ + +.. doxygentypedef:: wholememory_comm_t + :project: libwholegraph +.. doxygenstruct:: wholememory_unique_id_t + :project: libwholegraph +.. doxygenfunction:: wholememory_create_unique_id + :project: libwholegraph +.. doxygenfunction:: wholememory_create_communicator + :project: libwholegraph +.. doxygenfunction:: wholememory_destroy_communicator + :project: libwholegraph +.. doxygenfunction:: wholememory_communicator_get_rank + :project: libwholegraph +.. doxygenfunction:: wholememory_communicator_get_size + :project: libwholegraph +.. doxygenfunction:: wholememory_communicator_barrier + :project: libwholegraph + +WholeMemoryHandle APIs +++++++++++++++++++++++ + +.. doxygenenum:: wholememory_memory_type_t + :project: libwholegraph +.. doxygenenum:: wholememory_memory_location_t + :project: libwholegraph +.. doxygentypedef:: wholememory_handle_t + :project: libwholegraph +.. doxygenstruct:: wholememory_gref_t + :project: libwholegraph +.. doxygenfunction:: wholememory_malloc + :project: libwholegraph +.. doxygenfunction:: wholememory_free + :project: libwholegraph +.. doxygenfunction:: wholememory_get_communicator + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_type + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_location + :project: libwholegraph +.. doxygenfunction:: wholememory_get_total_size + :project: libwholegraph +.. doxygenfunction:: wholememory_get_data_granularity + :project: libwholegraph +.. doxygenfunction:: wholememory_get_local_memory + :project: libwholegraph +.. doxygenfunction:: wholememory_get_rank_memory + :project: libwholegraph +.. doxygenfunction:: wholememory_get_global_pointer + :project: libwholegraph +.. doxygenfunction:: wholememory_get_global_reference + :project: libwholegraph +.. doxygenfunction:: wholememory_determine_partition_plan + :project: libwholegraph +.. doxygenfunction:: wholememory_determine_entry_partition_plan + :project: libwholegraph +.. doxygenfunction:: wholememory_get_partition_plan + :project: libwholegraph +.. doxygenfunction:: wholememory_load_from_file + :project: libwholegraph +.. doxygenfunction:: wholememory_store_to_file + :project: libwholegraph + +WholeMemoryTensor APIs +++++++++++++++++++++++ + +.. doxygenenum:: wholememory_dtype_t + :project: libwholegraph +.. doxygenstruct:: wholememory_array_description_t + :project: libwholegraph +.. doxygenstruct:: wholememory_matrix_description_t + :project: libwholegraph +.. doxygenstruct:: wholememory_tensor_description_t + :project: libwholegraph +.. doxygentypedef:: wholememory_tensor_t + :project: libwholegraph +.. doxygenfunction:: wholememory_dtype_get_element_size + :project: libwholegraph +.. doxygenfunction:: wholememory_dtype_is_floating_number + :project: libwholegraph +.. doxygenfunction:: wholememory_dtype_is_integer_number + :project: libwholegraph +.. doxygenfunction:: wholememory_create_array_desc + :project: libwholegraph +.. doxygenfunction:: wholememory_create_matrix_desc + :project: libwholegraph +.. doxygenfunction:: wholememory_initialize_tensor_desc + :project: libwholegraph +.. doxygenfunction:: wholememory_copy_array_desc_to_matrix + :project: libwholegraph +.. doxygenfunction:: wholememory_copy_array_desc_to_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_copy_matrix_desc_to_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_convert_tensor_desc_to_array + :project: libwholegraph +.. doxygenfunction:: wholememory_convert_tensor_desc_to_matrix + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_element_count_from_array + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_size_from_array + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_element_count_from_matrix + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_size_from_matrix + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_element_count_from_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_get_memory_size_from_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_unsqueeze_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_create_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_destroy_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_make_tensor_from_pointer + :project: libwholegraph +.. doxygenfunction:: wholememory_make_tensor_from_handle + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_has_handle + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_memory_handle + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_tensor_description + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_global_reference + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_map_local_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_data_pointer + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_entry_per_partition + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_subtensor + :project: libwholegraph +.. doxygenfunction:: wholememory_tensor_get_root + :project: libwholegraph + +Ops on WholeMemory Tensors +++++++++++++++++++++++++++ + +.. doxygenfunction:: wholememory_gather + :project: libwholegraph +.. doxygenfunction:: wholememory_scatter + :project: libwholegraph + +WholeTensorEmbedding APIs ++++++++++++++++++++++++++ + +.. doxygentypedef:: wholememory_embedding_cache_policy_t + :project: libwholegraph +.. doxygentypedef:: wholememory_embedding_optimizer_t + :project: libwholegraph +.. doxygentypedef:: wholememory_embedding_t + :project: libwholegraph +.. doxygenenum:: wholememory_access_type_t + :project: libwholegraph +.. doxygenenum:: wholememory_optimizer_type_t + :project: libwholegraph +.. doxygenfunction:: wholememory_create_embedding_optimizer + :project: libwholegraph +.. doxygenfunction:: wholememory_optimizer_set_parameter + :project: libwholegraph +.. doxygenfunction:: wholememory_destroy_embedding_optimizer + :project: libwholegraph +.. doxygenfunction:: wholememory_create_embedding_cache_policy + :project: libwholegraph +.. doxygenfunction:: wholememory_destroy_embedding_cache_policy + :project: libwholegraph +.. doxygenfunction:: wholememory_create_embedding + :project: libwholegraph +.. doxygenfunction:: wholememory_destroy_embedding + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_get_embedding_tensor + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_gather + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_gather_gradient_apply + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_get_optimizer_state_names + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_get_optimizer_state + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_writeback_cache + :project: libwholegraph +.. doxygenfunction:: wholememory_embedding_drop_all_cache + :project: libwholegraph + +Ops on graphs stored in WholeMemory ++++++++++++++++++++++++++++++++++++ + +.. doxygenfunction:: wholegraph_csr_unweighted_sample_without_replacement + :project: libwholegraph +.. doxygenfunction:: wholegraph_csr_weighted_sample_without_replacement + :project: libwholegraph + +Miscellaneous Ops for graph ++++++++++++++++++++++++++++ + +.. doxygenfunction:: graph_append_unique + :project: libwholegraph +.. doxygenfunction:: csr_add_self_loop + :project: libwholegraph diff --git a/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst new file mode 100644 index 000000000..67aab00ac --- /dev/null +++ b/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst @@ -0,0 +1,38 @@ +======================= +pylibwholegraph API doc +======================= + +.. currentmodule:: pylibwholegraph + +APIs +---- +.. autosummary:: + :toctree: ../../api/wg + + torch.initialize.init_torch_env + torch.initialize.init_torch_env_and_create_wm_comm + torch.initialize.finalize + torch.comm.WholeMemoryCommunicator + torch.comm.set_world_info + torch.comm.create_group_communicator + torch.comm.destroy_communicator + torch.comm.get_global_communicator + torch.comm.get_local_node_communicator + torch.comm.get_local_device_communicator + torch.tensor.WholeMemoryTensor + torch.tensor.create_wholememory_tensor + torch.tensor.create_wholememory_tensor_from_filelist + torch.tensor.destroy_wholememory_tensor + torch.embedding.WholeMemoryOptimizer + torch.embedding.create_wholememory_optimizer + torch.embedding.destroy_wholememory_optimizer + torch.embedding.WholeMemoryCachePolicy + torch.embedding.create_wholememory_cache_policy + torch.embedding.create_builtin_cache_policy + torch.embedding.destroy_wholememory_cache_policy + torch.embedding.WholeMemoryEmbedding + torch.embedding.create_embedding + torch.embedding.create_embedding_from_filelist + torch.embedding.destroy_embedding + torch.embedding.WholeMemoryEmbeddingModule + torch.graph_structure.GraphStructure diff --git a/docs/cugraph/source/basics/cugraph_intro.md b/docs/cugraph/source/basics/cugraph_intro.md index 068412950..10d14f8a0 100644 --- a/docs/cugraph/source/basics/cugraph_intro.md +++ b/docs/cugraph/source/basics/cugraph_intro.md @@ -21,7 +21,7 @@ call graph algorithms using data stored in a GPU DataFrame, NetworkX Graphs, or CuPy or SciPy sparse Matrix. -# Vision +## 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 @@ -49,7 +49,7 @@ RAPIDS and DASK allows cuGraph to scale to multiple GPUs to support multi-billion edge graphs. -# Terminology +## Terminology cuGraph is a collection of GPU accelerated graph algorithms and graph utility functions. The application of graph analysis covers a lot of areas. @@ -67,8 +67,7 @@ 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__. -# Roadmap -GitHub does not provide a robust project management interface, and so a roadmap turns into simply a projection of when work will be completed and not a complete picture of everything that needs to be done. To capture the work that requires multiple steps, issues are labels as “EPIC” and include multiple subtasks that could span multiple releases. The EPIC will be in the release where work in expected to be completed. A better roadmap is being worked an image of the roadmap will be posted when ready. - * GitHub Project Board: https://github.com/rapidsai/cugraph/projects/28 + + \ No newline at end of file diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 470086b4f..3f7ef7deb 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -181,11 +181,10 @@ # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'cugraph', 'cugraph Documentation', - author, 'cugraph', 'One line description of project.', + author, 'cugraph', 'GPU-accelerated graph analysis.', 'Miscellaneous'), ] - # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'https://docs.python.org/': None} @@ -209,7 +208,9 @@ def setup(app): ) breathe_projects = { + 'libcugraph': os.environ['XML_DIR_LIBCUGRAPH'], 'libcugraphops': os.environ['XML_DIR_LIBCUGRAPHOPS'], 'libwholegraph': os.environ['XML_DIR_LIBWHOLEGRAPH'] } + breathe_default_project = "libcugraph" diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md index f6cb7c0d8..a1b80e927 100644 --- a/docs/cugraph/source/graph_support/algorithms.md +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -22,7 +22,7 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | Category | Notebooks | Scale | Notes | | ----------------- | ---------------------------------- | ------------------- | --------------------------------------------------------------- | -| [Centrality](./algorithms/Centrality.md) | [Centrality](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/centrality/Centrality.ipynb) | | | +| [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 | @@ -31,12 +31,12 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | 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 23.10 | +| | [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 23.10 | +| | [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 | | @@ -55,7 +55,7 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | | [Pagerank](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/Pagerank.ipynb) | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Pagerank) | | | [Personal Pagerank]() | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) | | | [HITS](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_analysis/HITS.ipynb) | __Multi-GPU__ | | -| [Link Prediction](./algorithms/Similarity.md) | | | | +| [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** | | @@ -65,8 +65,8 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M | | [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 | Single-GPU | | -| | Uniform Neighborhood sampling | __Multi-GPU__ | | +| | Node2Vec | __Multi-GPU__ | | +| | Neighborhood sampling | __Multi-GPU__ | | | Traversal | | | | | | Breadth First Search (BFS) | __Multi-GPU__ | with cutoff support [C++ README](cpp/src/traversal/README.md#BFS) | | | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](cpp/src/traversal/README.md#SSSP) | diff --git a/docs/cugraph/source/graph_support/algorithms/Centrality.md b/docs/cugraph/source/graph_support/algorithms/Centrality.md index e42bbe238..f82a1fe12 100644 --- a/docs/cugraph/source/graph_support/algorithms/Centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/Centrality.md @@ -1,7 +1,7 @@ # 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: @@ -15,13 +15,13 @@ But which vertices are most important? The answer depends on which measure/algor |Algorithm |Notebooks Containing |Description | | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -|[Degree Centrality](./degree_centrality.md)| [Centrality](./Centrality.ipynb), [Degree](./Degree.ipynb) |Measure based on counting direct connections for each vertex| -|[Betweenness Centrality](./betweenness_centrality.md)| [Centrality](./Centrality.ipynb), [Betweenness](./Betweenness.ipynb) |Number of shortest paths through the vertex| -|[Eigenvector Centrality](./eigenvector_centrality.md)|[Centrality](./Centrality.ipynb), [Eigenvector](./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](./Centrality.ipynb), [Katz](./Katz.ipynb) |Similar to Eigenvector but has tweaks to measure more weakly connected graph | +|[Degree Centrality](./degree_centrality.html)| [Centrality](./Centrality.ipynb), [Degree](./Degree.ipynb) |Measure based on counting direct connections for each vertex| +|[Betweenness Centrality](./betweenness_centrality.html)| [Centrality](./Centrality.ipynb), [Betweenness](./Betweenness.ipynb) |Number of shortest paths through the vertex| +|[Eigenvector Centrality](./eigenvector_centrality.html)|[Centrality](./Centrality.ipynb), [Eigenvector](./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.html)|[Centrality](./Centrality.ipynb), [Katz](./Katz.ipynb) |Similar to Eigenvector but has tweaks to measure more weakly connected graph | |Pagerank|[Centrality](./Centrality.ipynb), [Pagerank](../../link_analysis/Pagerank.ipynb) |Classified as both a link analysis and centrality measure by quantifying incoming links from central vertices. | -[System Requirements](../../README.md#requirements) +[System Requirements](../../README.html#requirements) | Author Credit | Date | Update | cuGraph Version | Test Hardware | | --------------|------------|------------------|-----------------|----------------| diff --git a/docs/cugraph/source/graph_support/algorithms/Similarity.md b/docs/cugraph/source/graph_support/algorithms/Similarity.md index 450beb373..18c0a94d5 100644 --- a/docs/cugraph/source/graph_support/algorithms/Similarity.md +++ b/docs/cugraph/source/graph_support/algorithms/Similarity.md @@ -15,9 +15,9 @@ Manipulation of the data before or after the graph analytic is not covered here. |Algorithm |Notebooks Containing |Description | | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -|[Jaccard Smiliarity](./jaccard_similarity.md)| [Jaccard Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Jaccard-Similarity.ipynb) || -|[Overlap Similarity](./overlap_similarity.md)| [Overlap Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Overlap-Similarity.ipynb) || -|[Sorensen](./sorensen_coefficient.md)|[Sorensen Similarity](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/link_prediction/Sorensen_coefficient.ipynb)|| +|[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) || diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index c5303c216..955eb6d54 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -25,12 +25,12 @@ RAPIDS Graph documentation * - :abbr:`libcugraph_etl (C++ renumbering function for strings)` - :abbr:`wholegraph (Shared memory-based GPU-accelerated GNN training)` - - .. - -| | +~~~~~~~~~~~~ +Introduction +~~~~~~~~~~~~ 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 GPU DataFrames, NetworkX Graphs, or @@ -39,6 +39,7 @@ even CuPy or SciPy sparse Matrices. Note: We are redoing all of our documents, please be patient as we update the docs and links +| .. toctree:: :maxdepth: 2 @@ -48,9 +49,8 @@ the docs and links installation/index tutorials/index graph_support/index + wholegraph/index references/index - dev_resources/index - releases/index api_docs/index Indices and tables diff --git a/docs/cugraph/source/wholegraph/basics/index.rst b/docs/cugraph/source/wholegraph/basics/index.rst new file mode 100644 index 000000000..429fe35d6 --- /dev/null +++ b/docs/cugraph/source/wholegraph/basics/index.rst @@ -0,0 +1,11 @@ +====== +Basics +====== + + +.. toctree:: + :maxdepth: 2 + + wholegraph_intro + wholememory_intro + wholememory_implementation_details diff --git a/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md b/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md new file mode 100644 index 000000000..360f8e0e3 --- /dev/null +++ b/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md @@ -0,0 +1,135 @@ +# WholeGraph Introduction +WholeGraph helps train large-scale Graph Neural Networks(GNN). +WholeGraph provides underlying storage structure called WholeMemory. +WholeMemory is a Tensor like storage and provides multi-GPU support. +It is optimized for NVLink systems like DGX A100 servers. +By working together with cuGraph, cuGraph-Ops, cuGraph-DGL, cuGraph-PyG, and upstream DGL and PyG, +it will be easy to build GNN applications. + +## WholeMemory +WholeMemory can be regarded as a whole view of GPU memory. +WholeMemory exposes a handle of the memory instance no matter how the underlying data is stored across multiple GPUs. +WholeMemory assumes that separate process is used to control each GPU. + +### WholeMemory Basics +To define WholeMemory, we need to specify the following: + +#### 1. Specify the set of GPU to handle the Memory + +Since WholeMemory is owned by a set of GPUs, you must specify the set of GPUs. +This is done by creating [WholeMemory Communicator](#wholememory-communicator) and specifying the WholeMemory Communicator when creating WholeMemory. + +#### 2. Specify the location of the memory + +Although WholeMemory is owned by a set of GPUs, the memory itself can be located in host memory or in device memory. +The location of the memory need to be specified, two types of locations can be specified. + +- **Host memory**: will use pinned host memory as underlying storage. +- **Device memory**: will use GPU device memory as underlying storage. + +#### 3. Specify the address mapping mode of the memory + +As WholeMemory is owned by multiple GPUs, each GPU will access the whole memory space, so we need address mapping. +There are three types of address mapping modes (also known as WholeMemory types), they are: + +- **Continuous**: All memory from each GPU will be mapped into a single continuous memory address space for each GPU. + In this mode, each GPU can directly access the whole memory using a single pointer and offset, just like using normal + device memory. Software will see no difference. Hardware peer to peer access will handle the underlying communication. + +- **Chunked**: Memory from each GPU will be mapped into different memory chunks, one chunk for each GPU. + In this mode, direct access is also supported, but not using a single pointer. Software will see the chunked memory. + However, an abstract layer may help to hide this. + +- **Distributed**: Memory from other GPUs are not mapped into current GPU, so no direct access is supported. + To access memory of other GPU, explicit communication is needed. + +To learn more details about WholeMemory locations and WholeMemory types, please refer to +[WholeMemory Implementation Details](wholememory_implementation_details.md) + +### WholeMemory Communicator +WholeMemory Communicator has two main purpose: + +- **Defines a set of GPUs which works together on WholeMemory.** WholeMemory Communicator is created by all GPUs that + wants to work together. A WholeMemory Communicator can be reused as long as the GPU set needed is the same. +- **Provides underlying communication channel needed by WholeMemory.** WholeMemory may need commuincator between GPUs + during the WholeMemory creation and some OPs on some types of WholeMemory. + +To Create WholeMemory Communicator, a WholeMemory Unique ID needs to be created first, it is usually created by the first GPU in the set of GPUs, and then broadcasted to all GPUs that want to work together. Then all GPUs in this communicator +will call WholeMemory Communicator creation function using this WholeMemory Unique ID, and the rank of current GPU as +well as all GPU count. + +### WholeMemory Granularity +As underlying storage may be partitioned into multiple GPUs physically, this is usually not wanted inside one single +user data block. To help on this, when creating WholeMemory, the granularity of data can be specified. Then the +WholeMemory is considered as multiple block of the same granularity and will not get split inside the granularity. + +### WholeMemory Mapping +As WholeMemory provides a whole view of memory to GPU, to access WholeMemory, mapping is usually needed. +Different types of WholeMemory have different mapping methods supported as their names. +Some mappings supported include +- All the WholeMemory types support mapping the memory range that local GPU is responsible for. + That is, each rank can directly access "Local" memory in all types of WholeMemory. + Here "Local" memory doesn't have to be on current GPU's memory, it can be on host memory or even maybe on other GPU, + but it is guaranteed to be directly accessed by current GPU. +- Chunked and Continuous WholeMemory also support Chunked mapping. That is, memory of all GPUs can be mapped into + current GPU, one continuous chunk for one GPU. Each chunk can be directly accessed by current GPU. But the memory of + different chunks are not guaranteed to be continuous. +- Continuous WholeMemory can be mapped into continuous memory space. That is, memory of all GPUs are mapped into a + single range of virtual memory, accessing to different position of this memory will physically access to different + GPUs. This mapping will be handled by hardware (CPU pagetable or GPU pagetable). + +### Operations on WholeMemory +There are some operations that can be performed on WholeMemory. They are based on the mapping of WholeMemory. +#### Local Operation +As all WholeMemory supports mapping of local memory, so operation on local memory is supported. The operation can be +either read or write. Just use it as GPU memory of current device is OK. +#### Load and Store +To facilitate file operation, Load / Store WholeMemory from file or to file is supported. WholeMemory uses raw binary +file format for disk operation. For Load, the input file can be a single file or a list of files, if it is a list, they +will be logically concatenated together and then loaded. For store, each GPU stores its local memory to file, producing +a list of files. +#### Gather and Scatter +WholeMemory also supports Gather / Scatter operation, usually they operate on a +[WholeMemory Tensor](#wholememory-tensor). + +### WholeMemory Tensor +Compared to PyTorch, WholeMemory is like PyTorch Storage while a WholeMemory Tensor is like a PyTorch Tensor. +For now, WholeMemory supports only 1D and 2D tensors, or arrays and matrices. Only first dimension is partitioned. + +### WholeMemory Embedding +WholeMemory Embedding is just like a 2D WholeMemory Tensor, with two features added. They support cache and sparse +optimizers. +#### Cache Support +To create WholeMemory Embedding with a cache, WholeMemory CachePolicy needs to be be created first. WholeMemoryCachePolicy can be created with following fields: +- **WholeMemory Communicator**: WholeMemory CachePolicy also needs WholeMemory Communicator. + WholeMemory Communicator defines the set of GPUs that cache all the Embedding. + It can be the same as the WholeMemory Communicator used to create WholeMemory Embedding. +- **WholeMemory type**: WholeMemory CachePolicy uses WholeMemory type to specify the WholeMemory type of cache. +- **WholeMemory location**: WholeMemory CachePolicy use WholeMemory location to specify the location of the cache. +- **Access type**: Access type can be readonly or readwrite. +- **Cache ratio**: Specify how much memory the cache will use. This ratio is computed for each GPU set that caches the + whole embedding. + +The two most commonly used caches are: +- **Device cached host memory**: When the WholeMemory Communicator for Cache Policy is the same as the WholeMemory + Communicator used to create WholeMemory Embedding, it means that the cache has same GPU set as WholeMemory Embedding. + So each GPU just caches its own part of raw Embedding. + Most commonly, when raw WholeMemory Embedding is located on host memory, and the cache is on device + memory, each GPU just caches its own part of host memory. +- **Local cached global memory**: The WholeMemory Communicator of WholeMemory CachePolicy can also be a subset of the + WholeMemory Communicator of WholeMemory Embedding. In this case, the subset of GPUs together cache all the embeddings. + Normally, when raw WholeMemory Embedding is partitioned on different machine nodes, and we + want to cache some embeddings in local machine or local GPU, then the subset of GPU can be all the GPUs in the local + machine. For local cached global memory, only readonly is supported. + +#### WholeMemory Embedding Sparse Optimizer +Another feature of WholeMemory Embedding is that WholeMemory Embedding supports embedding training. +To efficiently train large embedding tables, a sparse optimizer is needed. +WholeMemory Embedding Sparse Optimizer can run on a cached or noncached WholeMemory Embedding. +Currently supported optimizers include SGD, Adam, RMSProp and AdaGrad. + +## Graph Structure +Graph structure in WholeGraph is also based on WholeMemory. +In WholeGraph, graph is stored in [CSR format](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)). +Both ROW_INDEX (noted as `csr_row_ptr`) and COL_INDEX (notated as `csr_col_ind`) are stored in a +WholeMemory Tensor. So loading Graph Structure can use [WholeMemory Tensor Loading mechanism](#load-and-store). diff --git a/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md b/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md new file mode 100644 index 000000000..a5541109c --- /dev/null +++ b/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md @@ -0,0 +1,58 @@ +# WholeMemory Implementation Details +As described in [WholeMemory Introduction](wholegraph_intro.md), there are two WholeMemory location and three +WholeMemory types. So there will be total six WholeMemory. + +| Type | CONTINUOUS | CONTINUOUS | CHUNKED | CHUNKED | DISTRIBUTED | DISTRIBUTED | +|:-------------:|:-----------:|:----------:|:---------:|:---------:|:-----------:|:-----------:| +| Location | DEVICE | HOST | DEVICE | HOST | DEVICE | HOST | +| Allocated by | EACH | FIRST | EACH | FIRST | EACH | EACH | +| Allocate API | Driver | Host | Runtime | Host | Runtime | Runtime | +| IPC Mapping | Unix fd | mmap | cudaIpc | mmap | No IPC map | No IPC map | + +For "Continuous" and "Chunked" types of WholeMemory, all memory is mapped to each GPU, +so these two types are all "Mapped" WholeMemory, in contrast to "Distributed" WholeMemory where all are not mapped. + +## WholeMemory Layout +Since the underlying memory of a single WholeMemory object may be on multiple GPU devices, the WholeGraph library will +partition data into these GPU devices. +The partition method guarantees that each GPU can access one continuous part of the entire memory. +Here "can access" means can directly access from CUDA kernels, but the memory doesn't have to be physically on that GPU. +For example,it can be on host memory or other GPU's device memory that can be access using P2P. +In that case the stored data has its own granularity that shouldn't be split. Data granularity can be specified while +creating WholeMemory. Then each data granularity can be considered as a block of data. + +The follow figure shows the layout of 15 data block over 4 GPUs. +![WholeMemory Layout](../imgs/general_wholememory.png) + +For WholeMemory Tensors, they can be 1D or 2D tensors. +For 1D tensor, data granularity is one element. For 2D tensor, data granularity is its 1D tensor. +The layout will be like this: +![WholeMemory Tensor Layout](../imgs/wholememory_tensor.png) + +## WholeMemory Allocation +As there are six types of WholeMemory, the allocation process of each type are as follows: + +### Device Continuous WholeMemory +For Device Continuous WholeMemory, first a range of virtual address space is reserved in each GPU, which covers the +entire memory range. Then a part of pyhsical memory is allocated in each GPU, as shown in the following figure. +![Device Continuous WholeMemory Allocation Step 1](../imgs/device_continuous_wholememory_step1.png) +After that, each GPU gathers all the memory handles from all GPUs, and maps them to the reserved address space. +![Device Continuous WholeMemory Allocation Step 2](../imgs/device_continuous_wholememory_step2.png) + +### Device Chunked WholeMemory +For Device Chunked WholeMemory, first each GPU allocates its own part of memory using CUDA runtime API, this will create +both a virtual address space and physical memory for its own memory. +![Device Chunked WholeMemory Allocation Step 1](../imgs/device_chunked_wholememory_step1.png) +Each GPU gathers the Ipc handle of memory from all other GPUs, and maps that into its own virtual address space. +![Device Chunked WholeMemory Allocation Step 2](../imgs/device_chunked_wholememory_step2.png) + +### Host Mapped WholeMemory +For Host, Continuous and Chunked are using the same method. First, rank and allocate the host physical and share that to all +ranks. +![Host Mapped WholeMemory Allocation Step 1](../imgs/host_mapped_wholememory_step1.png) +Then each rank registers that host memory to GPU address space. +![Host Mapped WholeMemory Allocation Step 2](../imgs/host_mapped_wholememory_step2.png) + +### Distributed WholeMemory +For Distributed WholeMemory, each GPU just malloc its own part of memory, no need to share to other GPUs. +![Distributed WholeMemory Allocation](../imgs/distributed_wholememory.png) diff --git a/docs/cugraph/source/wholegraph/basics/wholememory_intro.md b/docs/cugraph/source/wholegraph/basics/wholememory_intro.md new file mode 100644 index 000000000..7209da947 --- /dev/null +++ b/docs/cugraph/source/wholegraph/basics/wholememory_intro.md @@ -0,0 +1,123 @@ +## WholeMemory +WholeMemory can be regarded as a whole view of GPU memory. +WholeMemory exposes a handle to the memory instance no matter how the underlying data is stored across multiple GPUs. +WholeMemory assumes that a separate process is used to control each GPU. + +### WholeMemory Basics +To define WholeMemory, we need to specify the following: + +#### 1. Specify the set of GPU to handle the Memory + +As WholeMemory is owned by a set of GPUs, so the set of GPUs need to be specified. +This is done by creating [WholeMemory Communicator](#wholememory-communicator) and specify the WholeMemory Communicator +when creating WholeMemory. + +#### 2. Specify the location of the memory + +Although WholeMemory is owned by a set of GPUs, the memory itself can be located on host memory or on device memory. +So the location of the memory needs to be specified. Two types of location can be specified. + +- **Host memory**: will use pinned host memory as underlying storage. +- **Device memory**: will use GPU device memory as underlying storage. + +#### 3. Specify the address mapping mode of the memory + +As WholeMemory is owned by multiple GPUs, each GPU will access the whole memory space, so we need address mapping. +There are three types of address mapping modes (also known as WholeMemory types), they are: + +- **Continuous**: All memory from each GPU will be mapped into a single continuous memory address space for each GPU. + In this mode, each GPU can directly access the whole memory using a single pointer and offset, just like using normal + device memory. Software will see no difference. Hardware peer-to-peer access will handle the underlying communication. + +- **Chunked**: Memory from each GPU will be mapped into different memory chunks, one chunk for each GPU. + In this mode, direct access is also supported, but not using a single pointer. Software will see the chunked memory. + However, an abstract layer can hide this. + +- **Distributed**: Memory from other GPUs is not mapped into current GPU, so no direct access is supported. + To access memory of another GPU, explicit communication is needed. + +If you would like to know more details about WholeMemory locations and WholeMemory types, please refer to +[WholeMemory Implementation Details](wholememory_implementation_details.md) + +### WholeMemory Communicator +WholeMemory Communicator has two main purpose: + +- **Defines a set of GPUs which works together on WholeMemory.** WholeMemory Communicator is created by all GPUs that + wants to work together. A WholeMemory Communicator can be reused as long as the GPU set needed is the same. +- **Provides underlying communication channel needed by WholeMemory.** WholeMemory may need commuincator between GPUs + during the WholeMemory creation and some OPs on some types of WholeMemory. + +To Create WholeMemory Communicator, a WholeMemory Unique ID need to be created first, it is usually created by the first +GPU in the set of GPUs, and then broadcasted to all GPUs that want to work together. Then all GPUs in this communicator +will call WholeMemory Communicator creation function using this WholeMemory Unique ID, and the rank of current GPU as +well as all GPU count. + +### WholeMemory Granularity +As underlying storage may be physically partitioned into multiple GPUs, it is usually not wanted inside one single +user data block. To help with this, when creating WholeMemory, the granularity of data can be specified. Therefore +WholeMemory is considered as multiple blocks of the same granularity and will not get split inside the granularity. + +### WholeMemory Mapping +Since WholeMemory provides a whole view of memory to GPU, mapping is usually needed to access WholeMemory. +Different types of WholeMemory have different mapping methods supported as their names. +Some mappings supported include: +- All the WholeMemory types support mapping the memory range that local GPU is responsible for. + That is, each rank can directly access "Local" memory in all types of WholeMemory. + Here "Local" memory doesn't have to be on current GPU's memory, it can be on host memory or even maybe on other GPU, + but it is guaranteed to be directly accessed by current GPU. +- Chunked and Continuous WholeMemory also support Chunked mapping. That is, memory of all GPUs can be mapped into + current GPU, one continuous chunk for one GPU. Each chunk can be directly accessed by current GPU. But the memory of + different chunks are not guaranteed to be continuous. +- Continuous WholeMemory can be mapped into continuous memory space. That is, memory of all GPUs are mapped into a + single range of virtual memory, accessing different positions of this memory will physically access different + GPUs. This mapping will be handled by hardware (CPU pagetable or GPU pagetable). + +### Operations on WholeMemory +There are some operations that can be performed on WholeMemory. They are based on the mapping of WholeMemory. +#### Local Operation +As all WholeMemory supports mapping of local memory, so operation on local memory is supported. The operation can be +either read or write. Just use it as GPU memory of current device is OK. +#### Load / Store +To facilitate file operation, Load / Store WholeMemory from file or to file is supported. WholeMemory use raw binary +file format for disk operation. For Load, the input file can be single file or a list of files, if it is a list, they +will be logically concatenated together and then loaded. For store, each GPU stores its local memory to file, producing +a list of files. +#### Gather / Scatter +WholeMemory also supports Gather / Scatter operations, usually they operate on a +[WholeMemory Tensor](#wholememory-tensor). + +### WholeMemory Tensor +Compared to PyTorch, WholeMemory is like PyTorch Storage while WholeMemory Tensor is like PyTorch Tensor. +For now, WholeMemory supports only 1D and 2D tensor, or array and matrix. Only first dimension is partitioned. + +### WholeMemory Embedding +WholeMemory Embedding is just like 2D WholeMemory Tensor, with cache support and sparse optimizer support added. +#### Cache Support +WholeMemory Embedding supports cache. To create WholeMemory Embedding with cache, WholeMemory CachePolicy need first be +created. WholeMemoryCachePolicy can be created with following fields: +- **WholeMemory Communicator**: WholeMemory CachePolicy also need WholeMemory Communicator. + This WholeMemory Communicator defines the set of GPUs that cache the all the Embedding. + It can be the same as the WholeMemory Communicator used to create WholeMemory Embedding. +- **WholeMemory type**: WholeMemory CachePolicy uses WholeMemory type to specify the WholeMemory type of the cache. +- **WholeMemory location**: WholeMemory CachePolicy uses WholeMemory location to specify the location of the cache. +- **Access type**: Access type can be readonly or readwrite. +- **Cache ratio**: Specify how much memory the cache will use. This ratio is computed for each GPU set that caches the + whole embedding. + +There are two most commonly used caches. They are: +- **Device cached host memory**: When the WholeMemory Communicator for Cache Policy is the same as the WholeMemory + Communicator used to create WholeMemory Embedding, it means that cache has the same GPU set as WholeMemory Embedding. + So each GPU just cache its own part of raw Embedding. + Normally, when raw WholeMemory Embedding is located on host memory, and the cache is on device + memory, each GPU just caches its own part of host memory. +- **Local cached global memory**: The WholeMemory Communicator of WholeMemory CachePolicy can also be a subset of the + WholeMemory Communicator of WholeMemory Embedding. In this case, the subset of GPUs together cache all the embeddings. + Typically, raw WholeMemory Embedding is partitioned on different machine nodes, and we + want to cache some embeddings in local machine or local GPU, then the subset of GPUs can be all the GPUs on the local + machine. For local cached global memory supports just readonly. + +#### WholeMemory Embedding Sparse Optimizer +Another feature of WholeMemory Embedding is that WholeMemory Embedding supports embedding training. +To efficiently train large embedding tables, a sparse optimizer is needed. +The WholeMemory Embedding Sparse Optimizer can run on cached or non-cached WholeMemory Embedding. +Currently supported optimizers include SGD, Adam, RMSProp and AdaGrad. diff --git a/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png b/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a0447e6fb9dde5691c987aa734a6ba4ae24663 GIT binary patch literal 23136 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 A_5c6? literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b203ce22467786b4b8f7fca87a6cfe9d5798027 GIT binary patch literal 28201 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 VzTd9vQIZ42tEa1<%Q~loCIE!7SJMCh literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..b773b1ef6e9872e8622c808de28510acb5033cb0 GIT binary patch literal 26434 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png b/docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bbe9f13e9e0b38f5b3459c513ab0992c177c62 GIT binary patch literal 23138 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/general_wholememory.png b/docs/cugraph/source/wholegraph/imgs/general_wholememory.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece02b007b6f4b0ad6e97b868dedb2fb0996d98 GIT binary patch literal 14073 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%0DGW|X>s#JLfvm7t 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..20597f3e5154c7608d9113822b70567797530dbc GIT binary patch literal 32110 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png b/docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png new file mode 100644 index 0000000000000000000000000000000000000000..e725d6c28edffbfa9879e42cb9b36fb6a15e2516 GIT binary patch literal 40367 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 DoB#6Y literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/wholegraph/index.rst b/docs/cugraph/source/wholegraph/index.rst new file mode 100644 index 000000000..2a69544b4 --- /dev/null +++ b/docs/cugraph/source/wholegraph/index.rst @@ -0,0 +1,14 @@ +WholeGraph +========== +RAPIDS WholeGraph has following package: + +* pylibwholegraph: shared memory-based GPU-accelerated GNN training + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + basics/index + installation/index + diff --git a/docs/cugraph/source/wholegraph/installation/container.md b/docs/cugraph/source/wholegraph/installation/container.md new file mode 100644 index 000000000..3a2c627c5 --- /dev/null +++ b/docs/cugraph/source/wholegraph/installation/container.md @@ -0,0 +1,29 @@ +# Build Container for WholeGraph +To run WholeGraph or build WholeGraph from source, set up the environment first. +We recommend using Docker images. +For example, to build the WholeGraph base image from the NGC pytorch 22.10 image, you can follow `Dockerfile`: +```dockerfile +FROM nvcr.io/nvidia/pytorch:22.10-py3 + +RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y lsb-core software-properties-common wget libspdlog-dev + +#RUN remove old cmake to update +RUN conda remove --force -y cmake +RUN rm -rf /usr/local/bin/cmake && rm -rf /usr/local/lib/cmake && rm -rf /usr/lib/cmake + +RUN apt-key adv --fetch-keys https://apt.kitware.com/keys/kitware-archive-latest.asc && \ + export LSB_CODENAME=$(lsb_release -cs) && \ + apt-add-repository -y "deb https://apt.kitware.com/ubuntu/ ${LSB_CODENAME} main" && \ + apt update && apt install -y cmake + +# update py for pytest +RUN pip3 install -U py +RUN pip3 install Cython setuputils3 scikit-build nanobind pytest-forked pytest +``` + +To run GNN applications, you may also need cuGraphOps, DGL and/or PyG libraries to run the GNN layers. +You may refer to [DGL](https://www.dgl.ai/pages/start.html) or [PyG](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html) +For example, to install DGL, you may need to add: +```dockerfile +RUN pip3 install dgl -f https://data.dgl.ai/wheels/cu118/repo.html +``` diff --git a/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md b/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md new file mode 100644 index 000000000..5b2072b05 --- /dev/null +++ b/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md @@ -0,0 +1,48 @@ + +# Getting the WholeGraph 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 WholeGraph 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 (as of Release 23.10) contain all RAPIDS packages, including WholeGraph, as well as all required supporting packages. To download a container, please see the [Docker Repository](https://hub.docker.com/r/rapidsai/rapidsai/), choosing a tag based on the NVIDIA CUDA version you’re running. This provides a ready to run Docker container with example notebooks and data, showcasing how you can utilize all of the RAPIDS libraries. + +
+ + +## Conda +It is easy to install WholeGraph using conda. You can get a minimal conda installation with [Miniconda](https://conda.io/miniconda.html) or get the full installation with [Anaconda](https://www.anaconda.com/download). + +WholeGraph conda packages + * libwholegraph + * pylibwholegraph + +Replace the package name in the example below to the one you want to install. + + +Install and update WholeGraph using the conda command: + +```bash +conda install -c rapidsai -c conda-forge -c nvidia wholegraph cudatoolkit=11.8 +``` + +
+ +## PIP +wholegraph, and all of RAPIDS, is available via pip. + +``` +pip install wholegraph-cu11 --extra-index-url=https://pypi.nvidia.com +``` + +
diff --git a/docs/cugraph/source/wholegraph/installation/index.rst b/docs/cugraph/source/wholegraph/installation/index.rst new file mode 100644 index 000000000..09f1cb44a --- /dev/null +++ b/docs/cugraph/source/wholegraph/installation/index.rst @@ -0,0 +1,9 @@ +Installation +============ + +.. toctree:: + :maxdepth: 2 + + getting_wholegraph + container + source_build diff --git a/docs/cugraph/source/wholegraph/installation/source_build.md b/docs/cugraph/source/wholegraph/installation/source_build.md new file mode 100644 index 000000000..c468048c3 --- /dev/null +++ b/docs/cugraph/source/wholegraph/installation/source_build.md @@ -0,0 +1,187 @@ +# Building from Source + +The following instructions are for users wishing to build wholegraph from source code. These instructions are tested on supported distributions of Linux,CUDA, +and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) for a list of supported environments. +Other operating systems _might be_ compatible, but are not currently tested. + +The wholegraph package includes both a C/C++ CUDA portion and a python portion. Both libraries need to be installed in order for cuGraph to operate correctly. +The C/C++ CUDA library is `libwholegraph` and the python library is `pylibwholegraph`. + +## Prerequisites + +__Compiler__: +* `gcc` version 11.0+ +* `nvcc` version 11.0+ +* `cmake` version 3.26.4+ + +__CUDA__: +* CUDA 11.8+ +* NVIDIA driver 450.80.02+ +* Pascal architecture or better + +You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). + +__Other Packages__: +* ninja +* nccl +* cython +* setuputils3 +* scikit-learn +* scikit-build +* nanobind>=0.2.0 + +## Building wholegraph +To install wholegraph from source, ensure the dependencies are met. + +### Clone Repo and Configure Conda Environment +__GIT clone a version of the repository__ + + ```bash + # Set the location to wholegraph in an environment variable WHOLEGRAPH_HOME + export WHOLEGRAPH_HOME=$(pwd)/wholegraph + + # Download the wholegraph repo - if you have a forked version, use that path here instead + git clone https://github.com/rapidsai/wholegraph.git $WHOLEGRAPH_HOME + + cd $WHOLEGRAPH_HOME + ``` + +__Create the conda development environment__ + +```bash +# create the conda environment (assuming in base `wholegraph` directory) + +# for CUDA 11.x +conda env create --name wholegraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml + +# activate the environment +conda activate wholegraph_dev + +# to deactivate an environment +conda deactivate +``` + + - The environment can be updated as development includes/changes the dependencies. To do so, run: + + +```bash + +# Where XXX is the CUDA version +conda env update --name wholegraph_dev --file conda/environments/all_cuda-XXX_arch-x86_64.yaml + +conda activate wholegraph_dev +``` + + +### Build and Install Using the `build.sh` Script +Using the `build.sh` script make compiling and installing wholegraph a +breeze. To build and install, simply do: + +```bash +$ cd $WHOLEGRAPH_HOME +$ ./build.sh clean +$ ./build.sh libwholegraph +$ ./build.sh pylibwholegraph +``` + +There are several other options available on the build script for advanced users. +`build.sh` options: +```bash +build.sh [ ...] [ ...] + where is: + clean - remove all existing build artifacts and configuration (start over). + uninstall - uninstall libwholegraph and pylibwholegraph from a prior build/install (see also -n) + libwholegraph - build the libwholegraph C++ library. + pylibwholegraph - build the pylibwholegraph Python package. + tests - build the C++ (OPG) tests. + benchmarks - build benchmarks. + docs - build the docs + and is: + -v - verbose build mode + -g - build for debug + -n - no install step + --allgpuarch - build for all supported GPU architectures + --cmake-args=\\\"\\\" - add arbitrary CMake arguments to any cmake call + --compile-cmd - only output compile commands (invoke CMake without build) + --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) + -h | --h[elp] - print this text + + default action (no args) is to build and install 'libwholegraph' then 'pylibwholegraph' targets + +examples: +$ ./build.sh clean # remove prior build artifacts (start over) +$ ./build.sh + +# make parallelism options can also be defined: Example build jobs using 4 threads (make -j4) +$ PARALLEL_LEVEL=4 ./build.sh libwholegraph + +Note that the libraries will be installed to the location set in `$PREFIX` if set (i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. +``` + + +## Building each section independently +### Build and Install the C++/CUDA `libwholegraph` Library +CMake depends on the `nvcc` executable being on your path or defined in `$CUDACXX`. + +This project uses cmake for building the C/C++ library. To configure cmake, run: + + ```bash + # Set the location to wholegraph in an environment variable WHOLEGRAPH_HOME + export WHOLEGRAPH_HOME=$(pwd)/wholegraph + + cd $WHOLEGRAPH_HOME + cd cpp # enter cpp directory + mkdir build # create build directory + cd build # enter the build directory + cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX + + # now build the code + make -j # "-j" starts multiple threads + make install # install the libraries + ``` +The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/wholegraph` respectively. + +### Building and installing the Python package + +Build and Install the Python packages to your Python path: + +```bash +cd $WHOLEGRAPH_HOME +cd python +cd pylibwholegraph +python setup.py build_ext --inplace +python setup.py install # install pylibwholegraph +``` + +## Run tests + +Run either the C++ or the Python tests with datasets + + - **Python tests with datasets** + + ```bash + cd $WHOLEGRAPH_HOME + cd python + pytest + ``` + + - **C++ stand alone tests** + + From the build directory : + + ```bash + # Run the tests + cd $WHOLEGRAPH_HOME + cd cpp/build + gtests/PARALLEL_UTILS_TESTS # this is an executable file + ``` + + +Note: This conda installation only applies to Linux and Python versions 3.8/3.10. + +## Creating documentation + +Python API documentation can be generated from _./docs/wholegraph directory_. Or through using "./build.sh docs" + +## Attribution +Portions adopted from https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md From 6ae2b724bd3f5f69b9ba915eaa29a2b84788fe4b Mon Sep 17 00:00:00 2001 From: Huiyu Xie Date: Tue, 21 Nov 2023 11:40:36 -0800 Subject: [PATCH 291/384] [DOC]: Fix invalid links and add materials to notebooks (#4002) I'm new to CuGraph repository and would like to contribute further in the future. So I start with minor tasks with docs to familiarize myself with the contribution process in this repository. Here is what I have done in this PR: - Fixed some invalid links in the documentation. - Corrected and added formulas related to centrality. - Added more references to the centrality to ensure consistency. Also, the images located at https://github.com/rapidsai/cugraph/tree/main/python/cugraph cannot be displayed because it is symbolic link to the repository's README file. But it's not a major issue. Authors: - Huiyu Xie (https://github.com/huiyuxie) - Ralph Liu (https://github.com/nv-rliu) - Naim (https://github.com/naimnv) - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4002 --- .../source/graph_support/algorithms/Centrality.md | 14 ++++++++------ .../cugraph/source/installation/getting_cugraph.md | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/cugraph/source/graph_support/algorithms/Centrality.md b/docs/cugraph/source/graph_support/algorithms/Centrality.md index f82a1fe12..8119e6552 100644 --- a/docs/cugraph/source/graph_support/algorithms/Centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/Centrality.md @@ -15,13 +15,15 @@ But which vertices are most important? The answer depends on which measure/algor |Algorithm |Notebooks Containing |Description | | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -|[Degree Centrality](./degree_centrality.html)| [Centrality](./Centrality.ipynb), [Degree](./Degree.ipynb) |Measure based on counting direct connections for each vertex| -|[Betweenness Centrality](./betweenness_centrality.html)| [Centrality](./Centrality.ipynb), [Betweenness](./Betweenness.ipynb) |Number of shortest paths through the vertex| -|[Eigenvector Centrality](./eigenvector_centrality.html)|[Centrality](./Centrality.ipynb), [Eigenvector](./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.html)|[Centrality](./Centrality.ipynb), [Katz](./Katz.ipynb) |Similar to Eigenvector but has tweaks to measure more weakly connected graph | -|Pagerank|[Centrality](./Centrality.ipynb), [Pagerank](../../link_analysis/Pagerank.ipynb) |Classified as both a link analysis and centrality measure by quantifying incoming links from central vertices. | +|[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) + -[System Requirements](../../README.html#requirements) | Author Credit | Date | Update | cuGraph Version | Test Hardware | | --------------|------------|------------------|-----------------|----------------| diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 509508c52..625f2c64c 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -9,7 +9,7 @@ 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) +4. [Build from Source](./source_build.md)
From 93a8af24ee9ec33c39e96282c16044514babbcde Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 21 Nov 2023 20:44:54 -0600 Subject: [PATCH 292/384] nx-cugraph: add `eigenvector_centrality`, `katz_centrality`, `hits`, `pagerank` (#3968) Add `eigenvector_centrality`, `katz_centrality`, and `hits`. I may add pagerank next. Authors: - Erik Welch (https://github.com/eriknw) - Ralph Liu (https://github.com/nv-rliu) - Naim (https://github.com/naimnv) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/3968 --- python/nx-cugraph/_nx_cugraph/__init__.py | 21 ++++ python/nx-cugraph/lint.yaml | 2 +- .../nx_cugraph/algorithms/__init__.py | 10 +- .../algorithms/centrality/__init__.py | 2 + .../algorithms/centrality/eigenvector.py | 64 ++++++++++ .../nx_cugraph/algorithms/centrality/katz.py | 100 ++++++++++++++++ .../algorithms/community/louvain.py | 34 ++++-- .../algorithms/link_analysis/__init__.py | 14 +++ .../algorithms/link_analysis/hits_alg.py | 81 +++++++++++++ .../algorithms/link_analysis/pagerank_alg.py | 112 ++++++++++++++++++ python/nx-cugraph/nx_cugraph/classes/graph.py | 50 ++++---- python/nx-cugraph/nx_cugraph/interface.py | 21 +++- .../nx_cugraph/tests/test_ktruss.py | 2 +- python/nx-cugraph/nx_cugraph/utils/misc.py | 34 +++++- 14 files changed, 509 insertions(+), 38 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/link_analysis/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 910db1bc3..ef5f8f3fc 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -47,12 +47,14 @@ "diamond_graph", "dodecahedral_graph", "edge_betweenness_centrality", + "eigenvector_centrality", "empty_graph", "florentine_families_graph", "from_pandas_edgelist", "from_scipy_sparse_array", "frucht_graph", "heawood_graph", + "hits", "house_graph", "house_x_graph", "icosahedral_graph", @@ -62,6 +64,7 @@ "isolates", "k_truss", "karate_club_graph", + "katz_centrality", "krackhardt_kite_graph", "ladder_graph", "les_miserables_graph", @@ -75,6 +78,7 @@ "number_of_selfloops", "octahedral_graph", "out_degree_centrality", + "pagerank", "pappus_graph", "path_graph", "petersen_graph", @@ -96,19 +100,36 @@ # BEGIN: extra_docstrings "betweenness_centrality": "`weight` parameter is not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported.", + "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.", "from_pandas_edgelist": "cudf.DataFrame inputs also supported.", "k_truss": ( "Currently raises `NotImplementedError` for graphs with more than one connected\n" "component when k >= 3. We expect to fix this soon." ), + "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.", "louvain_communities": "`seed` parameter is currently ignored.", + "pagerank": "`dangling` parameter is not supported, but it is checked for validity.", # END: extra_docstrings }, "extra_parameters": { # BEGIN: extra_parameters + "eigenvector_centrality": { + "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", + }, + "hits": { + "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", + 'weight : string or None, optional (default="weight")': "The edge attribute to use as the edge weight.", + }, + "katz_centrality": { + "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", + }, "louvain_communities": { + "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", "max_level : int, optional": "Upper limit of the number of macro-iterations (max: 500).", }, + "pagerank": { + "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", + }, # END: extra_parameters }, } diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 01a806e61..a94aa9f04 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -53,7 +53,7 @@ repos: rev: v0.1.3 hooks: - id: ruff - args: [--fix-only, --show-fixes] + args: [--fix-only, --show-fixes] # --unsafe-fixes] - repo: https://github.com/PyCQA/flake8 rev: 6.1.0 hooks: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 32cd6f31a..63841b15b 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -10,10 +10,18 @@ # 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. -from . import bipartite, centrality, community, components, shortest_paths +from . import ( + bipartite, + centrality, + community, + components, + shortest_paths, + link_analysis, +) from .bipartite import complete_bipartite_graph from .centrality import * from .components import * from .core import * from .isolate import * from .shortest_paths import * +from .link_analysis import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py index af91f2278..496dc6aff 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/__init__.py @@ -12,3 +12,5 @@ # limitations under the License. from .betweenness import * from .degree_alg import * +from .eigenvector import * +from .katz import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py new file mode 100644 index 000000000..c0f02a625 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py @@ -0,0 +1,64 @@ +# 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. +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import ( + _dtype_param, + _get_float_dtype, + networkx_algorithm, + not_implemented_for, +) + +__all__ = ["eigenvector_centrality"] + + +@not_implemented_for("multigraph") +@networkx_algorithm(extra_params=_dtype_param) +def eigenvector_centrality( + G, max_iter=100, tol=1.0e-6, nstart=None, weight=None, *, dtype=None +): + """`nstart` parameter is not used, but it is checked for validity.""" + G = _to_graph(G, weight, np.float32) + if len(G) == 0: + raise nx.NetworkXPointlessConcept( + "cannot compute centrality for the null graph" + ) + if dtype is not None: + dtype = _get_float_dtype(dtype) + elif weight in G.edge_values: + dtype = _get_float_dtype(G.edge_values[weight].dtype) + else: + dtype = np.float32 + if nstart is not None: + # Check if given nstart is valid even though we don't use it + nstart = G._dict_to_nodearray(nstart, dtype=dtype) + if (nstart == 0).all(): + raise nx.NetworkXError("initial vector cannot have all zero values") + if nstart.sum() == 0: + raise ZeroDivisionError + # nstart /= total # Uncomment (and assign total) when nstart is used below + try: + node_ids, values = plc.eigenvector_centrality( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(weight, 1, dtype, store_transposed=True), + epsilon=tol, + max_iterations=max_iter, + do_expensive_check=False, + ) + except RuntimeError as exc: + # Errors from PLC are sometimes a little scary and not very helpful + raise nx.PowerIterationFailedConvergence(max_iter) from exc + return G._nodearrays_to_dict(node_ids, values) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py new file mode 100644 index 000000000..b61b811b8 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py @@ -0,0 +1,100 @@ +# 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. +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import ( + _dtype_param, + _get_float_dtype, + networkx_algorithm, + not_implemented_for, +) + +__all__ = ["katz_centrality"] + + +@not_implemented_for("multigraph") +@networkx_algorithm(extra_params=_dtype_param) +def katz_centrality( + G, + alpha=0.1, + beta=1.0, + max_iter=1000, + tol=1.0e-6, + nstart=None, + normalized=True, + weight=None, + *, + dtype=None, +): + """`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. + raise NotImplementedError("normalized=False is not supported.") + G = _to_graph(G, weight, np.float32) + if (N := len(G)) == 0: + return {} + if dtype is not None: + dtype = _get_float_dtype(dtype) + elif weight in G.edge_values: + dtype = _get_float_dtype(G.edge_values[weight].dtype) + else: + dtype = np.float32 + if nstart is not None: + # Check if given nstart is valid even though we don't use it + nstart = G._dict_to_nodearray(nstart, 0, dtype) + b = bs = None + try: + b = float(beta) + except (TypeError, ValueError) as exc: + try: + bs = G._dict_to_nodearray(beta, dtype=dtype) + b = 1.0 # float value must be given to PLC (and will be ignored) + except (KeyError, ValueError): + raise nx.NetworkXError( + "beta dictionary must have a value for every node" + ) from exc + try: + node_ids, values = plc.katz_centrality( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(weight, 1, dtype, store_transposed=True), + betas=bs, + alpha=alpha, + beta=b, + epsilon=N * tol, + max_iterations=max_iter, + do_expensive_check=False, + ) + except RuntimeError as exc: + # Errors from PLC are sometimes a little scary and not very helpful + raise nx.PowerIterationFailedConvergence(max_iter) from exc + return G._nodearrays_to_dict(node_ids, values) + + +@katz_centrality._can_run +def _( + G, + alpha=0.1, + beta=1.0, + max_iter=1000, + tol=1.0e-6, + nstart=None, + normalized=True, + weight=None, + *, + dtype=None, +): + return normalized diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index 45a3429d2..936d837da 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -16,6 +16,7 @@ from nx_cugraph.convert import _to_undirected_graph from nx_cugraph.utils import ( + _dtype_param, _groupby, _seed_to_int, networkx_algorithm, @@ -32,11 +33,19 @@ extra_params={ "max_level : int, optional": ( "Upper limit of the number of macro-iterations (max: 500)." - ) + ), + **_dtype_param, } ) def louvain_communities( - G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None + G, + weight="weight", + resolution=1, + threshold=0.0000001, + seed=None, + *, + max_level=None, + dtype=None, ): """`seed` parameter is currently ignored.""" # NetworkX allows both directed and undirected, but cugraph only allows undirected. @@ -54,20 +63,20 @@ def louvain_communities( stacklevel=2, ) max_level = 500 - vertices, clusters, modularity = plc.louvain( + node_ids, clusters, modularity = plc.louvain( resource_handle=plc.ResourceHandle(), - graph=G._get_plc_graph(), + graph=G._get_plc_graph(weight, 1, dtype), max_level=max_level, # TODO: add this parameter to NetworkX threshold=threshold, resolution=resolution, do_expensive_check=False, ) - groups = _groupby(clusters, vertices, groups_are_canonical=True) - rv = [set(G._nodearray_to_list(node_ids)) for node_ids in groups.values()] - # TODO: PLC doesn't handle isolated vertices yet, so this is a temporary fix + groups = _groupby(clusters, node_ids, groups_are_canonical=True) + rv = [set(G._nodearray_to_list(ids)) for ids in groups.values()] + # TODO: PLC doesn't handle isolated node_ids yet, so this is a temporary fix isolates = _isolates(G) if isolates.size > 0: - isolates = isolates[isolates > vertices.max()] + isolates = isolates[isolates > node_ids.max()] if isolates.size > 0: rv.extend({node} for node in G._nodearray_to_list(isolates)) return rv @@ -75,7 +84,14 @@ def louvain_communities( @louvain_communities._can_run def _( - G, weight="weight", resolution=1, threshold=0.0000001, seed=None, *, max_level=None + G, + weight="weight", + resolution=1, + threshold=0.0000001, + seed=None, + *, + max_level=None, + dtype=None, ): # NetworkX allows both directed and undirected, but cugraph only allows undirected. return not G.is_directed() diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/__init__.py new file mode 100644 index 000000000..a68d6940d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/__init__.py @@ -0,0 +1,14 @@ +# 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. +from .hits_alg import * +from .pagerank_alg import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py new file mode 100644 index 000000000..1c8a47c24 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py @@ -0,0 +1,81 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import ( + _dtype_param, + _get_float_dtype, + index_dtype, + networkx_algorithm, +) + +__all__ = ["hits"] + + +@networkx_algorithm( + extra_params={ + 'weight : string or None, optional (default="weight")': ( + "The edge attribute to use as the edge weight." + ), + **_dtype_param, + } +) +def hits( + G, + max_iter=100, + tol=1.0e-8, + nstart=None, + normalized=True, + *, + weight="weight", + dtype=None, +): + G = _to_graph(G, weight, np.float32) + if (N := len(G)) == 0: + return {}, {} + if dtype is not None: + dtype = _get_float_dtype(dtype) + elif weight in G.edge_values: + dtype = _get_float_dtype(G.edge_values[weight].dtype) + else: + dtype = np.float32 + if nstart is not None: + nstart = G._dict_to_nodearray(nstart, 0, dtype) + if max_iter <= 0: + if nx.__version__[:3] <= "3.2": + raise ValueError("`maxiter` must be a positive integer.") + raise nx.PowerIterationFailedConvergence(max_iter) + try: + node_ids, hubs, authorities = plc.hits( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(weight, 1, dtype, store_transposed=True), + tol=tol, + initial_hubs_guess_vertices=None + if nstart is None + else cp.arange(N, dtype=index_dtype), + initial_hubs_guess_values=nstart, + max_iter=max_iter, + normalized=normalized, + do_expensive_check=False, + ) + except RuntimeError as exc: + # Errors from PLC are sometimes a little scary and not very helpful + raise nx.PowerIterationFailedConvergence(max_iter) from exc + return ( + G._nodearrays_to_dict(node_ids, hubs), + G._nodearrays_to_dict(node_ids, authorities), + ) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py new file mode 100644 index 000000000..63f6e89c3 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py @@ -0,0 +1,112 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import ( + _dtype_param, + _get_float_dtype, + index_dtype, + networkx_algorithm, +) + +__all__ = ["pagerank"] + + +@networkx_algorithm(extra_params=_dtype_param) +def pagerank( + G, + alpha=0.85, + personalization=None, + max_iter=100, + tol=1.0e-6, + nstart=None, + weight="weight", + dangling=None, + *, + dtype=None, +): + """`dangling` parameter is not supported, but it is checked for validity.""" + G = _to_graph(G, weight, 1, np.float32) + if (N := len(G)) == 0: + return {} + if dtype is not None: + dtype = _get_float_dtype(dtype) + elif weight in G.edge_values: + dtype = _get_float_dtype(G.edge_values[weight].dtype) + else: + dtype = np.float32 + if nstart is not None: + nstart = G._dict_to_nodearray(nstart, 0, dtype=dtype) + if (total := nstart.sum()) == 0: + raise ZeroDivisionError + nstart /= total + if personalization is not None: + personalization = G._dict_to_nodearray(personalization, 0, dtype=dtype) + if (total := personalization.sum()) == 0: + raise ZeroDivisionError + personalization /= total + if dangling is not None: + # Check if given dangling is valid even though we don't use it + dangling = G._dict_to_nodearray(dangling, 0) # Check validity + if dangling.sum() == 0: + raise ZeroDivisionError + if (G._out_degrees_array() == 0).any(): + raise NotImplementedError("custom dangling weights is not supported") + if max_iter <= 0: + raise nx.PowerIterationFailedConvergence(max_iter) + kwargs = { + "resource_handle": plc.ResourceHandle(), + "graph": G._get_plc_graph(weight, 1, dtype, store_transposed=True), + "precomputed_vertex_out_weight_vertices": None, + "precomputed_vertex_out_weight_sums": None, + "initial_guess_vertices": None + if nstart is None + else cp.arange(N, dtype=index_dtype), + "initial_guess_values": nstart, + "alpha": alpha, + "epsilon": N * tol, + "max_iterations": max_iter, + "do_expensive_check": False, + "fail_on_nonconvergence": False, + } + if personalization is None: + node_ids, values, is_converged = plc.pagerank(**kwargs) + else: + node_ids, values, is_converged = plc.personalized_pagerank( + personalization_vertices=cp.arange(N, dtype=index_dtype), # Why? + personalization_values=personalization, + **kwargs, + ) + if not is_converged: + raise nx.PowerIterationFailedConvergence(max_iter) + return G._nodearrays_to_dict(node_ids, values) + + +@pagerank._can_run +def pagerank( + G, + alpha=0.85, + personalization=None, + max_iter=100, + tol=1.0e-6, + nstart=None, + weight="weight", + dangling=None, + *, + dtype=None, +): + return dangling is None diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index fea318e03..e32f93d8b 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -79,7 +79,7 @@ class Graph: np.dtype(np.uint32): np.dtype(np.float64), np.dtype(np.uint64): np.dtype(np.float64), # raise if x > 2**53 # other - np.dtype(np.bool_): np.dtype(np.float16), + np.dtype(np.bool_): np.dtype(np.float32), np.dtype(np.float16): np.dtype(np.float32), } _plc_allowed_edge_types: ClassVar[set[np.dtype]] = { @@ -562,12 +562,13 @@ def _get_plc_graph( switch_indices: bool = False, edge_array: cp.ndarray[EdgeValue] | None = None, ): - if edge_array is not None: + if edge_array is not None or edge_attr is None: pass - elif edge_attr is None: - edge_array = None elif edge_attr not in self.edge_values: - raise KeyError("Graph has no edge attribute {edge_attr!r}") + if edge_default is None: + raise KeyError("Graph has no edge attribute {edge_attr!r}") + # If we were given a default edge value, then it's probably okay to + # use None for the edge_array if we don't have this edge attribute. elif edge_attr not in self.edge_masks: edge_array = self.edge_values[edge_attr] elif not self.edge_masks[edge_attr].all(): @@ -685,6 +686,9 @@ def _degrees_array(self): degrees += cp.bincount(self.dst_indices, minlength=self._N) return degrees + _in_degrees_array = _degrees_array + _out_degrees_array = _degrees_array + # Data conversions def _nodeiter_to_iter(self, node_ids: Iterable[IndexValue]) -> Iterable[NodeKey]: """Convert an iterable of node IDs to an iterable of node keys.""" @@ -748,20 +752,22 @@ def _dict_to_nodearrays( values = cp.fromiter(d.values(), dtype) return node_ids, values - # def _dict_to_nodearray( - # self, - # d: dict[NodeKey, NodeValue] | cp.ndarray[NodeValue], - # default: NodeValue | None = None, - # dtype: Dtype | None = None, - # ) -> cp.ndarray[NodeValue]: - # if isinstance(d, cp.ndarray): - # if d.shape[0] != len(self): - # raise ValueError - # return d - # if default is None: - # val_iter = map(d.__getitem__, self) - # else: - # val_iter = (d.get(node, default) for node in self) - # if dtype is None: - # return cp.array(list(val_iter)) - # return cp.fromiter(val_iter, dtype) + def _dict_to_nodearray( + self, + d: dict[NodeKey, NodeValue] | cp.ndarray[NodeValue], + default: NodeValue | None = None, + dtype: Dtype | None = None, + ) -> cp.ndarray[NodeValue]: + if isinstance(d, cp.ndarray): + if d.shape[0] != len(self): + raise ValueError + if dtype is not None and d.dtype != dtype: + return d.astype(dtype) + return d + if default is None: + val_iter = map(d.__getitem__, self) + else: + val_iter = (d.get(node, default) for node in self) + if dtype is None: + return cp.array(list(val_iter)) + return cp.fromiter(val_iter, dtype) diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 8903fdc54..be6b35960 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -72,12 +72,29 @@ def key(testpath): from packaging.version import parse nxver = parse(nx.__version__) - if nxver.major == 3 and nxver.minor in {0, 1}: + + if nxver.major == 3 and nxver.minor <= 2: + # Networkx versions prior to 3.2.1 have tests written to expect + # sp.sparse.linalg.ArpackNoConvergence exceptions raised on no + # convergence in HITS. Newer versions since the merge of + # https://github.com/networkx/networkx/pull/7084 expect + # nx.PowerIterationFailedConvergence, which is what nx_cugraph.hits + # raises, so we mark them as xfail for previous versions of NX. + xfail.update( + { + key( + "test_hits.py:TestHITS.test_hits_not_convergent" + ): "nx_cugraph.hits raises updated exceptions not caught in " + "these tests", + } + ) + + if nxver.major == 3 and nxver.minor <= 1: # MAINT: networkx 3.0, 3.1 # NetworkX 3.2 added the ability to "fallback to nx" if backend algorithms # raise NotImplementedError or `can_run` returns False. The tests below # exercise behavior we have not implemented yet, so we mark them as xfail - # for previous versions of NetworkX. + # for previous versions of NX. xfail.update( { key( diff --git a/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py b/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py index a3e4cee31..92fe23606 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_ktruss.py @@ -22,7 +22,7 @@ def test_k_truss(get_graph): Gnx = get_graph() Gcg = nxcg.from_networkx(Gnx, preserve_all_attrs=True) - for k in range(10): + for k in range(6): Hnx = nx.k_truss(Gnx, k) Hcg = nxcg.k_truss(Gcg, k) assert nx.utils.graphs_equal(Hnx, nxcg.to_networkx(Hcg)) diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py index 26f023bdc..e30337591 100644 --- a/python/nx-cugraph/nx_cugraph/utils/misc.py +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -16,11 +16,14 @@ import operator as op import sys from random import Random -from typing import SupportsIndex +from typing import TYPE_CHECKING, SupportsIndex import cupy as cp import numpy as np +if TYPE_CHECKING: + from ..typing import Dtype + try: from itertools import pairwise # Python >=3.10 except ImportError: @@ -33,11 +36,26 @@ def pairwise(it): prev = cur -__all__ = ["index_dtype", "_groupby", "_seed_to_int", "_get_int_dtype"] +__all__ = [ + "index_dtype", + "_groupby", + "_seed_to_int", + "_get_int_dtype", + "_get_float_dtype", + "_dtype_param", +] # This may switch to np.uint32 at some point index_dtype = np.int32 +# To add to `extra_params=` of `networkx_algorithm` +_dtype_param = { + "dtype : dtype or None, optional": ( + "The data type (np.float32, np.float64, or None) to use for the edge weights " + "in the algorithm. If None, then dtype is determined by the edge values." + ), +} + def _groupby( groups: cp.ndarray, values: cp.ndarray, groups_are_canonical: bool = False @@ -144,3 +162,15 @@ def _get_int_dtype( return np.dtype(dtype_string) except TypeError as exc: raise ValueError("Value is too large to store as integer: {val}") from exc + + +def _get_float_dtype(dtype: Dtype): + """Promote dtype to float32 or float64 as appropriate.""" + if dtype is None: + return np.dtype(np.float32) + rv = np.promote_types(dtype, np.float32) + if np.float32 != rv != np.float64: + raise TypeError( + f"Dtype {dtype} cannot be safely promoted to float32 or float64" + ) + return rv From d82d31952a8ed32c5bb41d0b8f8637fbd294809e Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:12:50 -0600 Subject: [PATCH 293/384] Adds missing connected_components algo to table. (#4019) --- python/nx-cugraph/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index 273a6112d..f6a9aac10 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -101,6 +101,7 @@ supported in nx-cugraph. | balanced_cut_clustering | ? | | betweenness_centrality | 23.10 | | bfs | ? | +| connected_components | 23.12 | | core_number | ? | | degree_centrality | 23.12 | | ecg | ? | From 6a55f6f2a452767c5fce43f9daff65d9e437ad85 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:23:00 -0600 Subject: [PATCH 294/384] Removes unsupported `setup.py` calls, cleans up text (#4024) closes #4008 * Removes unsupported `setup.py` calls, which resulted in issue #4008 . The document now describes how to use `build.sh`, which is more consistent with docs for other RAPIDS libs. * Removes `build.sh` output from docs in favor of documenting how to use `--help` to eliminate the doc being out-of-date with the script. * Removes extra wording in places and cleans up various sections. Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4024 --- .../source/installation/source_build.md | 195 ++++++------------ 1 file changed, 65 insertions(+), 130 deletions(-) diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md index f5ee0741d..1a129d452 100644 --- a/docs/cugraph/source/installation/source_build.md +++ b/docs/cugraph/source/installation/source_build.md @@ -1,53 +1,46 @@ # Building from Source -The following instructions are for users wishing to build cuGraph from source code. These instructions are tested on supported distributions of Linux, CUDA, and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) for list of supported environments. Other operating systems _might be_ compatible, but are not currently tested. - -The cuGraph package include both a C/C++ CUDA portion and a python portion. Both libraries need to be installed in order for cuGraph to operate correctly. +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 -__Compiler:__ +__Compilers:__ * `gcc` version 9.3+ -* `nvcc` version 11.0+ -* `cmake` version 3.20.1+ +* `nvcc` version 11.5+ __CUDA:__ -* CUDA 11.0+ +* CUDA 11.2+ * NVIDIA driver 450.80.02+ * Pascal architecture or better -You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). - -__Packages:__ -* `cmake` version 3.20.1+ -* `libcugraphops` (version matching source branch version, eg. `23.10`) - -You can obtain `libcugraphops` using `conda`/`mamba` from the `nvidia` channel, or using `pip` with the `--extra-index-url=https://pypi.nvidia.com` option. See the [RAPIDS docs](https://docs.rapids.ai/install#environment) for more details. - -## Building cuGraph -To install cuGraph from source, ensure the dependencies are met. +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 Repo and Configure Conda Environment -__GIT clone a version of the repository__ - - ```bash - # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME - export CUGRAPH_HOME=$(pwd)/cugraph - - # Download the cuGraph repo - if you have a folked version, use that path here instead - git clone https://github.com/rapidsai/cugraph.git $CUGRAPH_HOME +### Clone the repository: +```bash +CUGRAPH_HOME=$(pwd)/cugraph +git clone https://github.com/rapidsai/cugraph.git $CUGRAPH_HOME +cd $CUGRAPH_HOME +``` - cd $CUGRAPH_HOME - ``` +### Create the conda environment -__Create the conda development 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 -# create the conda environment (assuming in base `cugraph` directory) - # for CUDA 11.x -conda env create --name cugraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml +conda env create --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-118_arch-x86_64.yaml # activate the environment conda activate cugraph_dev @@ -56,101 +49,53 @@ conda activate cugraph_dev conda deactivate ``` - - The environment can be updated as development includes/changes the dependencies. To do so, run: - +The environment can be updated as cugraph adds/removes/updates its dependencies. To do so, run: ```bash - -# Where XXX is the CUDA 11 version -conda env update --name cugraph_dev --file conda/environments/cugraph_dev_cuda11.XXX.yml - +# 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 ``` +### Build and Install -### Build and Install Using the `build.sh` Script -Using the `build.sh` script make compiling and installing cuGraph a breeze. To build and install, simply do: +#### 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. -```bash -$ cd $CUGRAPH_HOME -$ ./build.sh clean -$ ./build.sh libcugraph -$ ./build.sh cugraph -``` +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: -There are several other options available on the build script for advanced users. -`build.sh` options: ```bash -build.sh [ ...] [ ...] - where is: - clean - remove all existing build artifacts and configuration (start over) - uninstall - uninstall libcugraph and cugraph from a prior build/install (see also -n) - libcugraph - build libcugraph.so and SG test binaries - libcugraph_etl - build libcugraph_etl.so and SG test binaries - pylibcugraph - build the pylibcugraph Python package - cugraph - build the cugraph Python package - nx-cugraph - build the nx-cugraph Python package - cugraph-service - build the cugraph-service_client and cugraph-service_server Python package - cpp-mgtests - build libcugraph and libcugraph_etl MG tests. Builds MPI communicator, adding MPI as a dependency. - cugraph-dgl - build the cugraph-dgl extensions for DGL - cugraph-pyg - build the cugraph-dgl extensions for PyG - docs - build the docs - and is: - -v - verbose build mode - -g - build for debug - -n - do not install after a successful build - --pydevelop - use setup.py develop instead of install - --allgpuarch - build for all supported GPU architectures - --skip_cpp_tests - do not build the SG test binaries as part of the libcugraph and libcugraph_etl targets - --without_cugraphops - do not build algos that require cugraph-ops - --cmake_default_generator - use the default cmake generator instead of ninja - --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) - -h - print this text - - default action (no args) is to build and install 'libcugraph' then 'libcugraph_etl' then 'pylibcugraph' then 'cugraph' then 'cugraph-service' targets - -examples: -$ ./build.sh clean # remove prior build artifacts (start over) -$ ./build.sh libcugraph -v # compile and install libcugraph with verbose output -$ ./build.sh libcugraph -g # compile and install libcugraph for debug -$ ./build.sh libcugraph -n # compile libcugraph but do not install - -# make parallelism options can also be defined: Example build jobs using 4 threads (make -j4) -$ PARALLEL_LEVEL=4 ./build.sh libcugraph - -Note that the libraries will be installed to the location set in `$PREFIX` if set (i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. +$ 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. -## Building each section independently -#### Build and Install the C++/CUDA `libcugraph` Library -CMake depends on the `nvcc` executable being on your path or defined in `$CUDACXX`. - -This project uses cmake for building the C/C++ library. To configure cmake, run: - - ```bash - # Set the localtion to cuGraph in an environment variable CUGRAPH_HOME - export CUGRAPH_HOME=$(pwd)/cugraph - - cd $CUGRAPH_HOME - cd cpp # enter cpp directory - mkdir build # create build directory - cd build # enter the build directory - cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX - - # now build the code - make -j # "-j" starts multiple threads - make install # install the libraries - ``` -The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/cugraph` respectively. +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. +`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. +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: +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 @@ -167,24 +112,10 @@ find_and_configure_raft(VERSION ${CUGRAPH_MIN_VERSION_raft} ) ``` -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. - -### Building and installing the Python package - -2) Install the Python packages to your Python path: - -```bash -cd $CUGRAPH_HOME -cd python -cd pylibcugraph -python setup.py build_ext --inplace -python setup.py install # install pylibcugraph -cd ../cugraph -python setup.py build_ext --inplace -python setup.py install # install cugraph python bindings - -``` - +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 @@ -240,7 +171,10 @@ Note: This conda installation only applies to Linux and Python versions 3.8/3.10 ### (OPTIONAL) Set environment variable on activation -It is possible to configure the conda environment to set environmental 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. +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 @@ -271,7 +205,8 @@ unset LD_LIBRARY_PATH ## Creating documentation -Python API documentation can be generated from _./docs/cugraph directory_. Or through using "./build.sh docs" +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 From 5b0534f1d3e5868433fcc9bfe367c9147e7f90d2 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 12 Dec 2023 10:26:32 -0600 Subject: [PATCH 295/384] nx-cugraph: update usage of `nodes_or_number` for nx compat (#4028) These changes will be necessary when https://github.com/networkx/networkx/pull/7066 is merged. Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4028 --- python/nx-cugraph/lint.yaml | 8 +++--- .../nx_cugraph/algorithms/__init__.py | 4 +-- .../algorithms/bipartite/generators.py | 5 ++-- .../nx-cugraph/nx_cugraph/algorithms/core.py | 6 ++++- .../nx_cugraph/generators/classic.py | 26 +++++++------------ .../nx-cugraph/nx_cugraph/utils/decorators.py | 13 +++++++++- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index a94aa9f04..de6f20bc4 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -45,12 +45,12 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 23.11.0 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.3 + rev: v0.1.7 hooks: - id: ruff args: [--fix-only, --show-fixes] # --unsafe-fixes] @@ -62,7 +62,7 @@ repos: additional_dependencies: &flake8_dependencies # These versions need updated manually - flake8==6.1.0 - - flake8-bugbear==23.9.16 + - flake8-bugbear==23.12.2 - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa rev: v1.5.0 @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.3 + rev: v0.1.7 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 63841b15b..e49474915 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -15,13 +15,13 @@ centrality, community, components, - shortest_paths, link_analysis, + shortest_paths, ) from .bipartite import complete_bipartite_graph from .centrality import * from .components import * from .core import * from .isolate import * -from .shortest_paths import * from .link_analysis import * +from .shortest_paths import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py index 1d3e762b4..25b9b3955 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py @@ -17,15 +17,14 @@ import numpy as np from nx_cugraph.generators._utils import _create_using_class, _number_and_nodes -from nx_cugraph.utils import index_dtype, networkx_algorithm, nodes_or_number +from nx_cugraph.utils import index_dtype, networkx_algorithm __all__ = [ "complete_bipartite_graph", ] -@nodes_or_number([0, 1]) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=[0, 1]) def complete_bipartite_graph(n1, n2, create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index 2219388bc..390598d07 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -31,7 +31,11 @@ def k_truss(G, k): if is_nx := isinstance(G, nx.Graph): G = nxcg.from_networkx(G, preserve_all_attrs=True) if nxcg.number_of_selfloops(G) > 0: - raise nx.NetworkXError( + if nx.__version__[:3] <= "3.2": + exc_class = nx.NetworkXError + else: + exc_class = nx.NetworkXNotImplemented + raise exc_class( "Input graph has self loops which is not permitted; " "Consider using G.remove_edges_from(nx.selfloop_edges(G))." ) diff --git a/python/nx-cugraph/nx_cugraph/generators/classic.py b/python/nx-cugraph/nx_cugraph/generators/classic.py index b196c2323..4213e6dd2 100644 --- a/python/nx-cugraph/nx_cugraph/generators/classic.py +++ b/python/nx-cugraph/nx_cugraph/generators/classic.py @@ -19,7 +19,7 @@ import nx_cugraph as nxcg -from ..utils import _get_int_dtype, index_dtype, networkx_algorithm, nodes_or_number +from ..utils import _get_int_dtype, index_dtype, networkx_algorithm from ._utils import ( _IS_NX32_OR_LESS, _common_small_graph, @@ -86,8 +86,7 @@ def circular_ladder_graph(n, create_using=None): return _ladder_graph(n, create_using, is_circular=True) -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def complete_graph(n, create_using=None): n, nodes = _number_and_nodes(n) if n < 3: @@ -143,8 +142,7 @@ def complete_multipartite_graph(*subset_sizes): ) -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def cycle_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) @@ -174,8 +172,7 @@ def cycle_graph(n, create_using=None): return G -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def empty_graph(n=0, create_using=None, default=nx.Graph): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using, default=default) @@ -242,8 +239,7 @@ def ladder_graph(n, create_using=None): return _ladder_graph(n, create_using) -@nodes_or_number([0, 1]) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=[0, 1]) def lollipop_graph(m, n, create_using=None): # Like complete_graph then path_graph orig_m, unused_nodes_m = m @@ -283,8 +279,7 @@ def null_graph(create_using=None): return _common_small_graph(0, None, create_using) -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def path_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) @@ -304,8 +299,7 @@ def path_graph(n, create_using=None): return G -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def star_graph(n, create_using=None): orig_n, orig_nodes = n n, nodes = _number_and_nodes(n) @@ -329,8 +323,7 @@ def star_graph(n, create_using=None): return G -@nodes_or_number([0, 1]) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=[0, 1]) def tadpole_graph(m, n, create_using=None): orig_m, unused_nodes_m = m orig_n, unused_nodes_n = n @@ -382,8 +375,7 @@ def turan_graph(n, r): return complete_multipartite_graph(*partitions) -@nodes_or_number(0) -@networkx_algorithm +@networkx_algorithm(nodes_or_number=0) def wheel_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py index 0048aee51..a0dbfcec8 100644 --- a/python/nx-cugraph/nx_cugraph/utils/decorators.py +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -15,6 +15,7 @@ from functools import partial, update_wrapper from textwrap import dedent +import networkx as nx from networkx.utils.decorators import nodes_or_number, not_implemented_for from nx_cugraph.interface import BackendInterface @@ -47,10 +48,18 @@ def __new__( *, name: str | None = None, extra_params: dict[str, str] | str | None = None, + nodes_or_number: list[int] | int | None = None, ): if func is None: - return partial(networkx_algorithm, name=name, extra_params=extra_params) + return partial( + networkx_algorithm, + name=name, + extra_params=extra_params, + nodes_or_number=nodes_or_number, + ) instance = object.__new__(cls) + if nodes_or_number is not None and nx.__version__[:3] > "3.2": + func = nx.utils.decorators.nodes_or_number(nodes_or_number)(func) # update_wrapper sets __wrapped__, which will be used for the signature update_wrapper(instance, func) instance.__defaults__ = func.__defaults__ @@ -76,6 +85,8 @@ def __new__( setattr(BackendInterface, instance.name, instance) # Set methods so they are in __dict__ instance._can_run = instance._can_run + if nodes_or_number is not None and nx.__version__[:3] <= "3.2": + instance = nx.utils.decorators.nodes_or_number(nodes_or_number)(instance) return instance def _can_run(self, func): From 8f34b5381727e739398f3ad806be0430d3e89992 Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Thu, 14 Dec 2023 12:10:10 -0800 Subject: [PATCH 296/384] Switch to scikit-build-core (#4053) Contributes to rapidsai/build-planning#2 Authors: - Vyas Ramasubramani (https://github.com/vyasr) Approvers: - Bradley Dice (https://github.com/bdice) - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4053 --- .../wholegraph/installation/source_build.md | 2 +- python/nx-cugraph/setup.py | 18 ------------------ 2 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 python/nx-cugraph/setup.py diff --git a/docs/cugraph/source/wholegraph/installation/source_build.md b/docs/cugraph/source/wholegraph/installation/source_build.md index c468048c3..a7727ac40 100644 --- a/docs/cugraph/source/wholegraph/installation/source_build.md +++ b/docs/cugraph/source/wholegraph/installation/source_build.md @@ -27,7 +27,7 @@ __Other Packages__: * cython * setuputils3 * scikit-learn -* scikit-build +* scikit-build-core * nanobind>=0.2.0 ## Building wholegraph diff --git a/python/nx-cugraph/setup.py b/python/nx-cugraph/setup.py deleted file mode 100644 index c4ab53592..000000000 --- a/python/nx-cugraph/setup.py +++ /dev/null @@ -1,18 +0,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. -from setuptools import find_packages, setup - -packages = find_packages(include=["nx_cugraph*"]) -setup( - package_data={key: ["VERSION"] for key in packages}, -) From 77836ee3ec6f2e0ccce04a153be6097ebbd9957f Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 20 Dec 2023 19:18:38 -0600 Subject: [PATCH 297/384] nx-cugraph: add `ancestors` and `descendants` (#4029) Authors: - Erik Welch (https://github.com/eriknw) Approvers: - AJ Schmidt (https://github.com/ajschmidt8) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4029 --- python/nx-cugraph/_nx_cugraph/__init__.py | 14 + .../nx_cugraph/algorithms/__init__.py | 3 + .../nx-cugraph/nx_cugraph/algorithms/core.py | 13 +- .../nx-cugraph/nx_cugraph/algorithms/dag.py | 55 ++++ .../algorithms/traversal/__init__.py | 13 + .../traversal/breadth_first_search.py | 250 ++++++++++++++++++ python/nx-cugraph/nx_cugraph/classes/graph.py | 23 ++ python/nx-cugraph/nx_cugraph/convert.py | 79 +++--- .../nx-cugraph/nx_cugraph/convert_matrix.py | 1 + python/nx-cugraph/nx_cugraph/interface.py | 45 ++++ python/nx-cugraph/nx_cugraph/utils/misc.py | 52 +++- 11 files changed, 500 insertions(+), 48 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/dag.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/traversal/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 1fd436bb8..d02c9c3e9 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -29,8 +29,14 @@ # "description": "TODO", "functions": { # BEGIN: functions + "ancestors", "barbell_graph", "betweenness_centrality", + "bfs_edges", + "bfs_layers", + "bfs_predecessors", + "bfs_successors", + "bfs_tree", "bull_graph", "caveman_graph", "chvatal_graph", @@ -44,6 +50,8 @@ "davis_southern_women_graph", "degree_centrality", "desargues_graph", + "descendants", + "descendants_at_distance", "diamond_graph", "dodecahedral_graph", "edge_betweenness_centrality", @@ -53,6 +61,7 @@ "from_pandas_edgelist", "from_scipy_sparse_array", "frucht_graph", + "generic_bfs_edges", "heawood_graph", "hits", "house_graph", @@ -99,9 +108,14 @@ "extra_docstrings": { # BEGIN: extra_docstrings "betweenness_centrality": "`weight` parameter is not yet supported.", + "bfs_edges": "`sort_neighbors` parameter is not yet supported.", + "bfs_predecessors": "`sort_neighbors` parameter is not yet supported.", + "bfs_successors": "`sort_neighbors` parameter is not yet supported.", + "bfs_tree": "`sort_neighbors` parameter is not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported.", "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.", "from_pandas_edgelist": "cudf.DataFrame inputs also supported.", + "generic_bfs_edges": "`neighbors` and `sort_neighbors` parameters are not yet supported.", "k_truss": ( "Currently raises `NotImplementedError` for graphs with more than one connected\n" "component when k >= 3. We expect to fix this soon." diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index e49474915..d28a629fe 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -17,11 +17,14 @@ components, link_analysis, shortest_paths, + traversal, ) from .bipartite import complete_bipartite_graph from .centrality import * from .components import * from .core import * +from .dag import * from .isolate import * from .link_analysis import * from .shortest_paths import * +from .traversal import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index 390598d07..c00df2d83 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -15,7 +15,12 @@ import pylibcugraph as plc import nx_cugraph as nxcg -from nx_cugraph.utils import _get_int_dtype, networkx_algorithm, not_implemented_for +from nx_cugraph.utils import ( + _get_int_dtype, + index_dtype, + networkx_algorithm, + not_implemented_for, +) __all__ = ["k_truss"] @@ -81,10 +86,8 @@ def k_truss(G, k): edge_values = {key: val[edge_indices] for key, val in G.edge_values.items()} edge_masks = {key: val[edge_indices] for key, val in G.edge_masks.items()} # Renumber step 2: edge indices - mapper = cp.zeros(len(G), src_indices.dtype) - mapper[node_indices] = cp.arange(node_indices.size, dtype=mapper.dtype) - src_indices = mapper[src_indices] - dst_indices = mapper[dst_indices] + src_indices = cp.searchsorted(node_indices, src_indices).astype(index_dtype) + dst_indices = cp.searchsorted(node_indices, dst_indices).astype(index_dtype) # Renumber step 3: node values node_values = {key: val[node_indices] for key, val in G.node_values.items()} node_masks = {key: val[node_indices] for key, val in G.node_masks.items()} diff --git a/python/nx-cugraph/nx_cugraph/algorithms/dag.py b/python/nx-cugraph/nx_cugraph/algorithms/dag.py new file mode 100644 index 000000000..067cfed91 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/dag.py @@ -0,0 +1,55 @@ +# 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. +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import index_dtype, networkx_algorithm + +__all__ = [ + "descendants", + "ancestors", +] + + +def _ancestors_and_descendants(G, source, *, is_ancestors): + G = _to_graph(G) + if source not in G: + hash(source) # To raise TypeError if appropriate + raise nx.NetworkXError( + f"The node {source} is not in the {G.__class__.__name__.lower()}." + ) + src_index = source if G.key_to_id is None else G.key_to_id[source] + distances, predecessors, node_ids = plc.bfs( + handle=plc.ResourceHandle(), + graph=G._get_plc_graph(switch_indices=is_ancestors), + sources=cp.array([src_index], dtype=index_dtype), + direction_optimizing=False, + depth_limit=-1, + compute_predecessors=False, + do_expensive_check=False, + ) + mask = (distances != np.iinfo(distances.dtype).max) & (distances != 0) + return G._nodearray_to_set(node_ids[mask]) + + +@networkx_algorithm +def descendants(G, source): + return _ancestors_and_descendants(G, source, is_ancestors=False) + + +@networkx_algorithm +def ancestors(G, source): + return _ancestors_and_descendants(G, source, is_ancestors=True) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/__init__.py new file mode 100644 index 000000000..1751cd469 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/__init__.py @@ -0,0 +1,13 @@ +# 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. +from .breadth_first_search import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py new file mode 100644 index 000000000..e2a7d46f4 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py @@ -0,0 +1,250 @@ +# 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. +from itertools import repeat + +import cupy as cp +import networkx as nx +import numpy as np +import pylibcugraph as plc + +import nx_cugraph as nxcg +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import _groupby, index_dtype, networkx_algorithm + +__all__ = [ + "bfs_edges", + "bfs_tree", + "bfs_predecessors", + "bfs_successors", + "descendants_at_distance", + "bfs_layers", + "generic_bfs_edges", +] + + +def _check_G_and_source(G, source): + G = _to_graph(G) + if source not in G: + hash(source) # To raise TypeError if appropriate + raise nx.NetworkXError( + f"The node {source} is not in the {G.__class__.__name__.lower()}." + ) + return G + + +def _bfs(G, source, *, depth_limit=None, reverse=False): + src_index = source if G.key_to_id is None else G.key_to_id[source] + distances, predecessors, node_ids = plc.bfs( + handle=plc.ResourceHandle(), + graph=G._get_plc_graph(switch_indices=reverse), + sources=cp.array([src_index], dtype=index_dtype), + direction_optimizing=False, + depth_limit=-1 if depth_limit is None else depth_limit, + compute_predecessors=True, + do_expensive_check=False, + ) + mask = predecessors >= 0 + return distances[mask], predecessors[mask], node_ids[mask] + + +@networkx_algorithm +def generic_bfs_edges(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): + """`neighbors` and `sort_neighbors` parameters are not yet supported.""" + return bfs_edges(source, depth_limit=depth_limit) + + +@generic_bfs_edges._can_run +def _(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): + return neighbors is None and sort_neighbors is None + + +@networkx_algorithm +def bfs_edges(G, source, reverse=False, depth_limit=None, sort_neighbors=None): + """`sort_neighbors` parameter is not yet supported.""" + G = _check_G_and_source(G, source) + if depth_limit is not None and depth_limit < 1: + return + distances, predecessors, node_ids = _bfs( + G, source, depth_limit=depth_limit, reverse=reverse + ) + # Using groupby like this is similar to bfs_predecessors + groups = _groupby([distances, predecessors], node_ids) + id_to_key = G.id_to_key + for key in sorted(groups): + children_ids = groups[key] + parent_id = key[1] + parent = id_to_key[parent_id] if id_to_key is not None else parent_id + yield from zip( + repeat(parent, children_ids.size), + G._nodeiter_to_iter(children_ids.tolist()), + ) + + +@bfs_edges._can_run +def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): + return sort_neighbors is None + + +@networkx_algorithm +def bfs_tree(G, source, reverse=False, depth_limit=None, sort_neighbors=None): + """`sort_neighbors` parameter is not yet supported.""" + G = _check_G_and_source(G, source) + if depth_limit is not None and depth_limit < 1: + return nxcg.DiGraph.from_coo( + 1, + cp.array([], dtype=index_dtype), + cp.array([], dtype=index_dtype), + id_to_key=[source], + ) + + distances, predecessors, node_ids = _bfs( + G, + source, + depth_limit=depth_limit, + reverse=reverse, + ) + if predecessors.size == 0: + return nxcg.DiGraph.from_coo( + 1, + cp.array([], dtype=index_dtype), + cp.array([], dtype=index_dtype), + id_to_key=[source], + ) + # TODO: create renumbering helper function(s) + unique_node_ids = cp.unique(cp.hstack((predecessors, node_ids))) + # Renumber edges + src_indices = cp.searchsorted(unique_node_ids, predecessors).astype(index_dtype) + dst_indices = cp.searchsorted(unique_node_ids, node_ids).astype(index_dtype) + # Renumber nodes + if (id_to_key := G.id_to_key) is not None: + key_to_id = { + id_to_key[old_index]: new_index + for new_index, old_index in enumerate(unique_node_ids.tolist()) + } + else: + key_to_id = { + old_index: new_index + for new_index, old_index in enumerate(unique_node_ids.tolist()) + } + return nxcg.DiGraph.from_coo( + unique_node_ids.size, + src_indices, + dst_indices, + key_to_id=key_to_id, + ) + + +@bfs_tree._can_run +def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): + return sort_neighbors is None + + +@networkx_algorithm +def bfs_successors(G, source, depth_limit=None, sort_neighbors=None): + """`sort_neighbors` parameter is not yet supported.""" + G = _check_G_and_source(G, source) + if depth_limit is not None and depth_limit < 1: + yield (source, []) + return + + distances, predecessors, node_ids = _bfs(G, source, depth_limit=depth_limit) + groups = _groupby([distances, predecessors], node_ids) + id_to_key = G.id_to_key + for key in sorted(groups): + children_ids = groups[key] + parent_id = key[1] + parent = id_to_key[parent_id] if id_to_key is not None else parent_id + children = G._nodearray_to_list(children_ids) + yield (parent, children) + + +@bfs_successors._can_run +def _(G, source, depth_limit=None, sort_neighbors=None): + return sort_neighbors is None + + +@networkx_algorithm +def bfs_layers(G, sources): + G = _to_graph(G) + if sources in G: + sources = [sources] + else: + sources = set(sources) + if not all(source in G for source in sources): + node = next(source for source in sources if source not in G) + raise nx.NetworkXError(f"The node {node} is not in the graph.") + sources = list(sources) + source_ids = G._list_to_nodearray(sources) + distances, predecessors, node_ids = plc.bfs( + handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + sources=source_ids, + direction_optimizing=False, + depth_limit=-1, + compute_predecessors=False, + do_expensive_check=False, + ) + mask = distances != np.iinfo(distances.dtype).max + distances = distances[mask] + node_ids = node_ids[mask] + groups = _groupby(distances, node_ids) + return (G._nodearray_to_list(groups[key]) for key in range(len(groups))) + + +@networkx_algorithm +def bfs_predecessors(G, source, depth_limit=None, sort_neighbors=None): + """`sort_neighbors` parameter is not yet supported.""" + G = _check_G_and_source(G, source) + if depth_limit is not None and depth_limit < 1: + return + + distances, predecessors, node_ids = _bfs(G, source, depth_limit=depth_limit) + # We include `predecessors` in the groupby for "nicer" iteration order + groups = _groupby([distances, predecessors], node_ids) + id_to_key = G.id_to_key + for key in sorted(groups): + children_ids = groups[key] + parent_id = key[1] + parent = id_to_key[parent_id] if id_to_key is not None else parent_id + yield from zip( + G._nodeiter_to_iter(children_ids.tolist()), + repeat(parent, children_ids.size), + ) + + +@bfs_predecessors._can_run +def _(G, source, depth_limit=None, sort_neighbors=None): + return sort_neighbors is None + + +@networkx_algorithm +def descendants_at_distance(G, source, distance): + G = _check_G_and_source(G, source) + if distance is None or distance < 0: + return set() + if distance == 0: + return {source} + + src_index = source if G.key_to_id is None else G.key_to_id[source] + distances, predecessors, node_ids = plc.bfs( + handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + sources=cp.array([src_index], dtype=index_dtype), + direction_optimizing=False, + depth_limit=distance, + compute_predecessors=False, + do_expensive_check=False, + ) + mask = distances == distance + node_ids = node_ids[mask] + return G._nodearray_to_set(node_ids) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index e32f93d8b..cdd3f744f 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -458,6 +458,24 @@ def has_edge(self, u: NodeKey, v: NodeKey) -> bool: return False return bool(((self.src_indices == u) & (self.dst_indices == v)).any()) + def _neighbors(self, n: NodeKey) -> cp.ndarray[NodeValue]: + if n not in self: + hash(n) # To raise TypeError if appropriate + raise nx.NetworkXError( + f"The node {n} is not in the {self.__class__.__name__.lower()}." + ) + if self.key_to_id is not None: + n = self.key_to_id[n] + nbrs = self.dst_indices[self.src_indices == n] + if self.is_multigraph(): + nbrs = cp.unique(nbrs) + return nbrs + + @networkx_api + def neighbors(self, n: NodeKey) -> Iterator[NodeKey]: + nbrs = self._neighbors(n) + return iter(self._nodeiter_to_iter(nbrs.tolist())) + @networkx_api def has_node(self, n: NodeKey) -> bool: return n in self @@ -701,6 +719,11 @@ def _nodearray_to_list(self, node_ids: cp.ndarray[IndexValue]) -> list[NodeKey]: return node_ids.tolist() return list(self._nodeiter_to_iter(node_ids.tolist())) + def _list_to_nodearray(self, nodes: list[NodeKey]) -> cp.ndarray[IndexValue]: + if (key_to_id := self.key_to_id) is not None: + nodes = [key_to_id[node] for node in nodes] + return cp.array(nodes, dtype=index_dtype) + def _nodearray_to_set(self, node_ids: cp.ndarray[IndexValue]) -> set[NodeKey]: if self.key_to_id is None: return set(node_ids.tolist()) diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index 3c0814370..f265540a1 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -39,6 +39,24 @@ REQUIRED = ... +def _iterate_values(graph, adj, is_dicts, func): + # Using `dict.values` is faster and is the common case, but it doesn't always work + if is_dicts is not False: + it = concat(map(dict.values, adj.values())) + if graph is not None and graph.is_multigraph(): + it = concat(map(dict.values, it)) + try: + return func(it), True + except TypeError: + if is_dicts is True: + raise + # May not be regular dicts + it = concat(x.values() for x in adj.values()) + if graph is not None and graph.is_multigraph(): + it = concat(x.values() for x in it) + return func(it), False + + def from_networkx( graph: nx.Graph, edge_attrs: AttrKey | dict[AttrKey, EdgeValue | None] | None = None, @@ -152,6 +170,7 @@ def from_networkx( if isinstance(adj, nx.classes.coreviews.FilterAdjacency): adj = {k: dict(v) for k, v in adj.items()} + is_dicts = None N = len(adj) if ( not preserve_edge_attrs @@ -162,12 +181,9 @@ def from_networkx( # Either we weren't asked to preserve edge attributes, or there are no edges edge_attrs = None elif preserve_edge_attrs: - # Using comprehensions should be just as fast starting in Python 3.11 - it = concat(map(dict.values, adj.values())) - if graph.is_multigraph(): - it = concat(map(dict.values, it)) - # PERF: should we add `filter(None, ...)` to remove empty data dicts? - attr_sets = set(map(frozenset, it)) + attr_sets, is_dicts = _iterate_values( + graph, adj, is_dicts, lambda it: set(map(frozenset, it)) + ) attrs = frozenset.union(*attr_sets) edge_attrs = dict.fromkeys(attrs, REQUIRED) if len(attr_sets) > 1: @@ -207,10 +223,9 @@ def from_networkx( del edge_attrs[attr] # Else some edges have attribute (default already None) else: - it = concat(map(dict.values, adj.values())) - if graph.is_multigraph(): - it = concat(map(dict.values, it)) - attr_sets = set(map(required.intersection, it)) + attr_sets, is_dicts = _iterate_values( + graph, adj, is_dicts, lambda it: set(map(required.intersection, it)) + ) for attr in required - frozenset.union(*attr_sets): # No edges have these attributes del edge_attrs[attr] @@ -269,17 +284,19 @@ def from_networkx( dst_iter = map(key_to_id.__getitem__, dst_iter) if graph.is_multigraph(): dst_indices = np.fromiter(dst_iter, index_dtype) - num_multiedges = np.fromiter( - map(len, concat(map(dict.values, adj.values()))), index_dtype + num_multiedges, is_dicts = _iterate_values( + None, adj, is_dicts, lambda it: np.fromiter(map(len, it), index_dtype) ) # cp.repeat is slow to use here, so use numpy instead dst_indices = cp.array(np.repeat(dst_indices, num_multiedges)) # Determine edge keys and edge ids for multigraphs - edge_keys = list(concat(concat(map(dict.values, adj.values())))) - edge_indices = cp.fromiter( - concat(map(range, map(len, concat(map(dict.values, adj.values()))))), - index_dtype, - ) + if is_dicts: + edge_keys = list(concat(concat(map(dict.values, adj.values())))) + it = concat(map(dict.values, adj.values())) + else: + edge_keys = list(concat(concat(x.values() for x in adj.values()))) + it = concat(x.values() for x in adj.values()) + edge_indices = cp.fromiter(concat(map(range, map(len, it))), index_dtype) if edge_keys == edge_indices.tolist(): edge_keys = None # Prefer edge_indices else: @@ -323,19 +340,21 @@ def from_networkx( edge_masks[edge_attr] = cp.fromiter(iter_mask, bool) edge_values[edge_attr] = cp.array(vals, dtype) # if vals.ndim > 1: ... + elif edge_default is REQUIRED: + if dtype is None: + + def func(it, edge_attr=edge_attr): + return cp.array(list(map(op.itemgetter(edge_attr), it))) + + else: + + def func(it, edge_attr=edge_attr, dtype=dtype): + return cp.fromiter(map(op.itemgetter(edge_attr), it), dtype) + + edge_value, is_dicts = _iterate_values(graph, adj, is_dicts, func) + edge_values[edge_attr] = edge_value else: - if edge_default is REQUIRED: - # Using comprehensions should be fast starting in Python 3.11 - # iter_values = ( - # edgedata[edge_attr] - # for rowdata in adj.values() - # for edgedata in rowdata.values() - # ) - it = concat(map(dict.values, adj.values())) - if graph.is_multigraph(): - it = concat(map(dict.values, it)) - iter_values = map(op.itemgetter(edge_attr), it) - elif graph.is_multigraph(): + if graph.is_multigraph(): iter_values = ( edgedata.get(edge_attr, edge_default) for rowdata in adj.values() @@ -352,7 +371,7 @@ def from_networkx( edge_values[edge_attr] = cp.array(list(iter_values)) else: edge_values[edge_attr] = cp.fromiter(iter_values, dtype) - # if vals.ndim > 1: ... + # if vals.ndim > 1: ... # cp.repeat is slow to use here, so use numpy instead src_indices = np.repeat( diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py index 6c8b8fb4a..80ca0c2fa 100644 --- a/python/nx-cugraph/nx_cugraph/convert_matrix.py +++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py @@ -36,6 +36,7 @@ def from_pandas_edgelist( graph_class, inplace = _create_using_class(create_using) src_array = df[source].to_numpy() dst_array = df[target].to_numpy() + # TODO: create renumbering helper function(s) # Renumber step 0: node keys nodes = np.unique(np.concatenate([src_array, dst_array])) N = nodes.size diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index be6b35960..3f6449f57 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -12,6 +12,7 @@ # limitations under the License. from __future__ import annotations +import os import sys import networkx as nx @@ -246,7 +247,51 @@ def key(testpath): key("test_tree_isomorphism.py:test_positive"): too_slow, key("test_tree_isomorphism.py:test_negative"): too_slow, key("test_efficiency.py:TestEfficiency.test_using_ego_graph"): maybe_oom, + key("test_dag.py:TestDAG.test_antichains"): maybe_oom, + key( + "test_lowest_common_ancestors.py:" + "TestDAGLCA.test_all_pairs_lca_pairs_without_lca" + ): maybe_oom, + key( + "test_lowest_common_ancestors.py:" + "TestMultiDiGraph_DAGLCA.test_all_pairs_lca_pairs_without_lca" + ): maybe_oom, + # These repeatedly call `bfs_layers`, which converts the graph every call + key( + "test_vf2pp.py:TestGraphISOVF2pp.test_custom_graph2_different_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp.test_custom_graph3_same_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp.test_custom_graph3_different_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp.test_custom_graph4_same_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp." + "test_disconnected_graph_all_same_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp." + "test_disconnected_graph_all_different_labels" + ): too_slow, + key( + "test_vf2pp.py:TestGraphISOVF2pp." + "test_disconnected_graph_some_same_labels" + ): too_slow, + key( + "test_vf2pp.py:TestMultiGraphISOVF2pp." + "test_custom_multigraph3_same_labels" + ): too_slow, + key( + "test_vf2pp_helpers.py:TestNodeOrdering." + "test_matching_order_all_branches" + ): too_slow, } + if os.environ.get("PYTEST_NO_SKIP", False): + skip.clear() for item in items: kset = set(item.keywords) diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py index e30337591..aa06d7fd2 100644 --- a/python/nx-cugraph/nx_cugraph/utils/misc.py +++ b/python/nx-cugraph/nx_cugraph/utils/misc.py @@ -58,16 +58,18 @@ def pairwise(it): def _groupby( - groups: cp.ndarray, values: cp.ndarray, groups_are_canonical: bool = False + groups: cp.ndarray | list[cp.ndarray], + values: cp.ndarray | list[cp.ndarray], + groups_are_canonical: bool = False, ) -> dict[int, cp.ndarray]: """Perform a groupby operation given an array of group IDs and array of values. Parameters ---------- - groups : cp.ndarray - Array that holds the group IDs. - values : cp.ndarray - Array of values to be grouped according to groups. + groups : cp.ndarray or list of cp.ndarray + Array or list of arrays that holds the group IDs. + values : cp.ndarray or list of cp.ndarray + Array or list of arrays of values to be grouped according to groups. Must be the same size as groups array. groups_are_canonical : bool, default False Whether the group IDs are consecutive integers beginning with 0. @@ -76,18 +78,42 @@ def _groupby( ------- dict with group IDs as keys and cp.ndarray as values. """ - if groups.size == 0: - return {} - sort_indices = cp.argsort(groups) - sorted_groups = groups[sort_indices] - sorted_values = values[sort_indices] - prepend = 1 if groups_are_canonical else sorted_groups[0] + 1 - left_bounds = cp.nonzero(cp.diff(sorted_groups, prepend=prepend))[0] - boundaries = pairwise(itertools.chain(left_bounds.tolist(), [groups.size])) + if isinstance(groups, list): + if groups_are_canonical: + raise ValueError( + "`groups_are_canonical=True` is not allowed when `groups` is a list." + ) + if len(groups) == 0 or (size := groups[0].size) == 0: + return {} + sort_indices = cp.lexsort(cp.vstack(groups[::-1])) + sorted_groups = cp.vstack([group[sort_indices] for group in groups]) + prepend = sorted_groups[:, 0].max() + 1 + changed = cp.abs(cp.diff(sorted_groups, prepend=prepend)).sum(axis=0) + changed[0] = 1 + left_bounds = cp.nonzero(changed)[0] + else: + if (size := groups.size) == 0: + return {} + sort_indices = cp.argsort(groups) + sorted_groups = groups[sort_indices] + prepend = 1 if groups_are_canonical else sorted_groups[0] + 1 + left_bounds = cp.nonzero(cp.diff(sorted_groups, prepend=prepend))[0] + if isinstance(values, list): + sorted_values = [vals[sort_indices] for vals in values] + else: + sorted_values = values[sort_indices] + boundaries = pairwise(itertools.chain(left_bounds.tolist(), [size])) if groups_are_canonical: it = enumerate(boundaries) + elif isinstance(groups, list): + it = zip(map(tuple, sorted_groups.T[left_bounds].tolist()), boundaries) else: it = zip(sorted_groups[left_bounds].tolist(), boundaries) + if isinstance(values, list): + return { + group: [sorted_vals[start:end] for sorted_vals in sorted_values] + for group, (start, end) in it + } return {group: sorted_values[start:end] for group, (start, end) in it} From 05e69ae5d4718f309df2034be300337246d3d17c Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:55:13 -0600 Subject: [PATCH 298/384] Adds `nx-cugraph` benchmarks for 23.12 algos (SSSP, pagerank, hits, katz_centrality, degree_centrality, eigenvector_centrality) (#4065) closes rapidsai/graph_dl#404 * Adds benchmarks for algos added in the 23.12 release * SSSP * pagerank * hits * katz_centrality * degree_centrality * eigenvector_centrality * Refactors fixtures for easier usage and mainentance * uses `benchmark.pedantic` instead of `benchmark` to provide complete control over how to benchmark the algos, since `benchmark` will result in no fewer than 3 runs (calibrate timer, timed run, run to generate func return value) which can be too time consuming for slower runs. * Removes code to create `Dataset` objects for larger datasets and replaces with the equivalent objects that are now part of `cugraph.datasets` Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4065 --- .../nx-cugraph/pytest-based/bench_algos.py | 440 ++++++++++++++---- 1 file changed, 343 insertions(+), 97 deletions(-) diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py index 971c3ff10..a8ed18a20 100644 --- a/benchmarks/nx-cugraph/pytest-based/bench_algos.py +++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -11,29 +11,13 @@ # 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 - -# FIXME: promote these to cugraph.datasets so the following steps aren't -# necessary -# -# These datasets can be downloaded using the script in the 'datasets' dir: -# -# cd /datasets -# ./get_test_data.sh --benchmark -# -# Then set the following env var so the dataset utils can find their location: -# -# export RAPIDS_DATASET_ROOT_DIR=/datasets -# -from cugraph_benchmarking.params import ( - hollywood, - europe_osm, - cit_patents, - soc_livejournal, -) +import nx_cugraph as nxcg # Attempt to import the NetworkX dispatching module, which is only needed when # testing with NX <3.2 in order to dynamically switch backends. NX >=3.2 allows @@ -45,22 +29,76 @@ ################################################################################ -# Fixtures and helpers -backend_params = ["cugraph", None] +# Fixtures and params + +# See https://pytest-benchmark.readthedocs.io/en/latest/glossary.html for how +# these variables are used. +rounds = 1 +iterations = 1 +warmup_rounds = 1 -dataset_params = [ +dataset_param_values = [ pytest.param(datasets.karate, marks=[pytest.mark.small, pytest.mark.undirected]), pytest.param(datasets.netscience, marks=[pytest.mark.small, pytest.mark.directed]), pytest.param( datasets.email_Eu_core, marks=[pytest.mark.small, pytest.mark.directed] ), - pytest.param(cit_patents, marks=[pytest.mark.medium, pytest.mark.directed]), - pytest.param(hollywood, marks=[pytest.mark.medium, pytest.mark.undirected]), - pytest.param(europe_osm, marks=[pytest.mark.medium, pytest.mark.undirected]), - pytest.param(soc_livejournal, marks=[pytest.mark.large, pytest.mark.directed]), + pytest.param( + datasets.cit_patents, marks=[pytest.mark.medium, pytest.mark.directed] + ), + pytest.param( + datasets.hollywood, marks=[pytest.mark.medium, pytest.mark.undirected] + ), + pytest.param( + datasets.soc_livejournal, marks=[pytest.mark.medium, pytest.mark.directed] + ), + pytest.param( + datasets.europe_osm, marks=[pytest.mark.large, pytest.mark.undirected] + ), ] +backend_param_values = ["cugraph", "cugraph-preconverted", None] + + +def setup_module(module): + """ + Trivial conversion call to force various one-time CUDA initialization + operations to happen outside of benchmarks. + """ + G = nx.karate_club_graph() + nxcg.from_networkx(G) + + +# Test IDs are generated using the lambda assigned to the ids arg to provide an +# easier-to-read name. This is especially helpful for Dataset objs (see +# https://docs.pytest.org/en/stable/reference/reference.html#pytest-fixture) +@pytest.fixture( + scope="module", params=dataset_param_values, ids=lambda ds: f"ds={str(ds)}" +) +def graph_obj(request): + """ + Returns a NX Graph or DiGraph obj from the dataset instance parameter. + """ + dataset = request.param + return nx_graph_from_dataset(dataset) + + +@pytest.fixture( + scope="module", + params=backend_param_values, + ids=lambda backend: f"backend={backend}", +) +def backend(request): + """ + Returns the backend name to use. This is done as a fixture for consistency + and simplicity when creating benchmarks (no need to mark the benchmark as + parametrized). + """ + return request.param + +################################################################################ +# Helpers def nx_graph_from_dataset(dataset_obj): """ Read the dataset specified by the dataset_obj and create and return a @@ -87,126 +125,334 @@ def nx_graph_from_dataset(dataset_obj): return G -# Test IDs are generated using the lambda assigned to the ids arg to provide an -# easier-to-read name from the Dataset obj string repr. -# See: https://docs.pytest.org/en/stable/reference/reference.html#pytest-fixture -@pytest.fixture(scope="module", params=dataset_params, ids=lambda ds: f"ds={str(ds)}") -def graph_obj(request): - """ - Returns a NX Graph or DiGraph obj from the dataset instance parameter. - """ - dataset = request.param - return nx_graph_from_dataset(dataset) - - -def get_legacy_backend_selector(backend_name): +def get_legacy_backend_wrapper(backend_name): """ Returns a callable that wraps an algo function with either the default - dispatch decorator, or the "testing" decorator which unconditionally - dispatches. + dispatcher (which dispatches based on input graph type), or the "testing" + dispatcher (which autoconverts and unconditionally dispatches). This is only supported for NetworkX <3.2 """ backends.plugin_name = "cugraph" orig_dispatch = backends._dispatch testing_dispatch = backends.test_override_dispatch - # Testing with the networkx <3.2 dispatch mechanism is based on decorating - # networkx APIs. The decorator is either one that only uses a backend if - # the input graph type is for that backend (the default decorator), or the - # "testing" decorator, which unconditionally converts a graph type to the - # type needed by the backend then calls the backend. If the cugraph backend - # is specified, create a callable that decorates the benchmarked function - # with the testing decorator. - # - # Because both the default and testing decorators assume they are only - # applied once and do bookkeeping to ensure algos are not registered - # multiple times, the callable also clears bookkeeping so the decorators - # can be reapplied multiple times. This is obviously a hack and networkx - # >=3.2 makes this use case properly supported. if backend_name == "cugraph": - - def wrapper(*args, **kwargs): - backends._registered_algorithms = {} - return testing_dispatch(*args, **kwargs) - + dispatch = testing_dispatch else: + dispatch = orig_dispatch + + def wrap_callable_for_dispatch(func, exhaust_returned_iterator=False): + # Networkx <3.2 registers functions when the dispatch decorator is + # applied (called) and errors if re-registered, so clear bookkeeping to + # allow it to be called repeatedly. + backends._registered_algorithms = {} + actual_func = dispatch(func) # returns the func the dispatcher picks def wrapper(*args, **kwargs): - backends._registered_algorithms = {} - return orig_dispatch(*args, **kwargs) + retval = actual_func(*args, **kwargs) + if exhaust_returned_iterator: + retval = list(retval) + return retval - return wrapper + return wrapper + + return wrap_callable_for_dispatch -def get_backend_selector(backend_name): +def get_backend_wrapper(backend_name): """ Returns a callable that wraps an algo function in order to set the "backend" kwarg on it. This is only supported for NetworkX >= 3.2 """ - def get_callable_for_func(func): + def wrap_callable_for_dispatch(func, exhaust_returned_iterator=False): def wrapper(*args, **kwargs): kwargs["backend"] = backend_name - return func(*args, **kwargs) + retval = func(*args, **kwargs) + if exhaust_returned_iterator: + retval = list(retval) + return retval return wrapper - return get_callable_for_func + return wrap_callable_for_dispatch @pytest.fixture( - scope="module", params=backend_params, ids=lambda backend: f"backend={backend}" + scope="module", + params=backend_param_values, + ids=lambda backend: f"backend={backend}", ) -def backend_selector(request): +def backend_wrapper(request): """ Returns a callable that takes a function algo and wraps it in another function that calls the algo using the appropriate backend. + + For example: if the backend to test is "cugraph", this will return a + function that calls nx.pagerank(..., backend='cugraph') """ backend_name = request.param + actual_backend_name = backend_name + + # Special case: cugraph-preconverted may be specified as a backend but this + # name is reserved to indicate a cugraph backend is to be used with a + # preconverted graph obj (rather than having the backend do the + # conversion). + if backend_name == "cugraph-preconverted": + actual_backend_name = "cugraph" + + # NX <3.2 does not support the backends= kwarg, so the backend must be + # enabled differently if backends is not None: - return get_legacy_backend_selector(backend_name) + wrapper = get_legacy_backend_wrapper(actual_backend_name) else: - return get_backend_selector(backend_name) + wrapper = get_backend_wrapper(actual_backend_name) + + wrapper.backend_name = backend_name + return wrapper + + +def get_graph_obj_for_benchmark(graph_obj, backend_wrapper): + """ + Given a Graph object and a backend name, return a converted Graph or the + original Graph object based on the backend to use. + + This is needed because some backend names are actually used as descriptions + for combinations of backends and converted/non-converted graphs. For + example, a benchmark may specify the "cugraph-preconverted" backend, which + is not an installed backend but instead refers to the "cugraph" backend + passed a NX Graph that has been converted to a nx-cugraph Graph object. + """ + G = graph_obj + if backend_wrapper.backend_name == "cugraph-preconverted": + G = nxcg.from_networkx(G) + return G ################################################################################ # Benchmarks -normalized_params = [True, False] -k_params = [10, 100] - - -@pytest.mark.parametrize("normalized", normalized_params, ids=lambda norm: f"{norm=}") -@pytest.mark.parametrize("k", k_params, ids=lambda k: f"{k=}") -def bench_betweenness_centrality(benchmark, graph_obj, backend_selector, normalized, k): - result = benchmark( - backend_selector(nx.betweenness_centrality), - graph_obj, - weight=None, - normalized=normalized, - k=k, +# normalized_param_values = [True, False] +# k_param_values = [10, 100] +normalized_param_values = [True] +k_param_values = [10] + + +@pytest.mark.parametrize( + "normalized", normalized_param_values, ids=lambda norm: f"{norm=}" +) +@pytest.mark.parametrize("k", k_param_values, ids=lambda k: f"{k=}") +def bench_betweenness_centrality(benchmark, graph_obj, backend_wrapper, normalized, k): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.betweenness_centrality), + args=(G,), + kwargs=dict( + weight=None, + normalized=normalized, + k=k, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, ) assert type(result) is dict -@pytest.mark.parametrize("normalized", normalized_params, ids=lambda norm: f"{norm=}") +@pytest.mark.parametrize( + "normalized", normalized_param_values, ids=lambda norm: f"{norm=}" +) +@pytest.mark.parametrize("k", k_param_values, ids=lambda k: f"{k=}") def bench_edge_betweenness_centrality( - benchmark, graph_obj, backend_selector, normalized + benchmark, graph_obj, backend_wrapper, normalized, k ): - result = benchmark( - backend_selector(nx.edge_betweenness_centrality), - graph_obj, - weight=None, - normalized=normalized, + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.edge_betweenness_centrality), + args=(G,), + kwargs=dict( + weight=None, + normalized=normalized, + k=k, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, ) assert type(result) is dict -def bench_louvain_communities(benchmark, graph_obj, backend_selector): +def bench_louvain_communities(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) # The cugraph backend for louvain_communities only supports undirected graphs - if isinstance(graph_obj, nx.DiGraph): - G = graph_obj.to_undirected() - else: - G = graph_obj - result = benchmark(backend_selector(nx.community.louvain_communities), G) + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.community.louvain_communities), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_degree_centrality(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.degree_centrality), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_eigenvector_centrality(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.eigenvector_centrality), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +@pytest.mark.parametrize( + "normalized", normalized_param_values, ids=lambda norm: f"{norm=}" +) +def bench_hits(benchmark, graph_obj, backend_wrapper, normalized): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.hits), + args=(G,), + kwargs=dict( + normalized=normalized, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is tuple + assert len(result) == 2 + assert type(result[0]) is dict + assert type(result[1]) is dict + + +def bench_in_degree_centrality(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.in_degree_centrality), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +@pytest.mark.parametrize( + "normalized", normalized_param_values, ids=lambda norm: f"{norm=}" +) +def bench_katz_centrality(benchmark, graph_obj, backend_wrapper, normalized): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.katz_centrality), + args=(G,), + kwargs=dict( + normalized=normalized, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_k_truss(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.k_truss), + args=(G,), + kwargs=dict( + k=2, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + # Check that this at least appears to be some kind of NX-like Graph + assert hasattr(result, "has_node") + + +def bench_out_degree_centrality(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.out_degree_centrality), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_pagerank(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.pagerank), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_single_source_shortest_path_length(benchmark, graph_obj, backend_wrapper): + # Use the node with the highest degree + degrees = graph_obj.degree() # list of tuples of (node, degree) + node = max(degrees, key=lambda t: t[1])[0] + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + + result = benchmark.pedantic( + target=backend_wrapper(nx.single_source_shortest_path_length), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_single_target_shortest_path_length(benchmark, graph_obj, backend_wrapper): + # Use the node with the highest degree + degrees = graph_obj.degree() # list of tuples of (node, degree) + node = max(degrees, key=lambda t: t[1])[0] + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + + result = benchmark.pedantic( + target=backend_wrapper( + nx.single_target_shortest_path_length, exhaust_returned_iterator=True + ), + args=(G,), + kwargs=dict( + target=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + # exhaust_returned_iterator=True forces the result to a list, but is not + # needed for this algo in NX 3.3+ which returns a dict instead of an + # iterator. Forcing to a list does not change the benchmark timing. assert type(result) is list From 43fb580bea476eb1f9672bd57df31530feca6348 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Thu, 11 Jan 2024 11:23:40 -0600 Subject: [PATCH 299/384] refactor CUDA versions in dependencies.yaml (#4084) Contributes to https://github.com/rapidsai/build-planning/issues/7. Proposes splitting the `cuda-version` dependency in `dependencies.yaml` out to its own thing, separate from the bits of the CUDA Toolkit this project needs. ### Benefits of this change * prevents accidental inclusion of multiple `cuda-version` version in environments * reduces update effort (via enabling more use of globs like `"12.*"`) * improves the chance that errors like "`conda` recipe is missing a dependency" are caught in CI Authors: - James Lamb (https://github.com/jameslamb) - Bradley Dice (https://github.com/bdice) Approvers: - Vyas Ramasubramani (https://github.com/vyasr) - Bradley Dice (https://github.com/bdice) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/4084 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bab39557c..188ea1a26 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: pass_filenames: false additional_dependencies: [gitpython] - repo: https://github.com/rapidsai/dependency-file-generator - rev: v1.5.1 + rev: v1.8.0 hooks: - id: rapids-dependency-file-generator args: ["--clean"] From d671c82f43199a782cb377064b3a088eb74bb48e Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Thu, 11 Jan 2024 15:11:00 -0600 Subject: [PATCH 300/384] nx-cugraph: indicate which plc algorithms are used and version_added (#4069) Pretty simple PR. I would like for us to use this metadata when creating tables of supported algorithms. Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4069 --- .../algorithms/bipartite/generators.py | 4 +- .../algorithms/centrality/betweenness.py | 20 +- .../algorithms/centrality/degree_alg.py | 8 +- .../algorithms/centrality/eigenvector.py | 9 +- .../nx_cugraph/algorithms/centrality/katz.py | 9 +- .../algorithms/community/louvain.py | 10 +- .../algorithms/components/connected.py | 10 +- .../nx-cugraph/nx_cugraph/algorithms/core.py | 4 +- .../nx-cugraph/nx_cugraph/algorithms/dag.py | 6 +- .../nx_cugraph/algorithms/isolate.py | 8 +- .../algorithms/link_analysis/hits_alg.py | 6 +- .../algorithms/link_analysis/pagerank_alg.py | 11 +- .../algorithms/shortest_paths/unweighted.py | 6 +- .../traversal/breadth_first_search.py | 16 +- .../nx-cugraph/nx_cugraph/classes/function.py | 4 +- .../nx-cugraph/nx_cugraph/convert_matrix.py | 9 +- .../nx_cugraph/generators/classic.py | 32 +-- .../nx_cugraph/generators/community.py | 4 +- .../nx-cugraph/nx_cugraph/generators/small.py | 44 ++-- .../nx_cugraph/generators/social.py | 10 +- .../nx-cugraph/nx_cugraph/scripts/__init__.py | 12 + .../nx-cugraph/nx_cugraph/scripts/__main__.py | 38 +++ .../nx_cugraph/scripts/print_table.py | 78 ++++++ .../nx_cugraph/scripts/print_tree.py | 241 ++++++++++++++++++ .../nx-cugraph/nx_cugraph/utils/decorators.py | 31 ++- python/nx-cugraph/pyproject.toml | 8 + 26 files changed, 538 insertions(+), 100 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/scripts/__init__.py create mode 100755 python/nx-cugraph/nx_cugraph/scripts/__main__.py create mode 100755 python/nx-cugraph/nx_cugraph/scripts/print_table.py create mode 100755 python/nx-cugraph/nx_cugraph/scripts/print_tree.py diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py index 25b9b3955..5a0c970c9 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -24,7 +24,7 @@ ] -@networkx_algorithm(nodes_or_number=[0, 1]) +@networkx_algorithm(nodes_or_number=[0, 1], version_added="23.12") def complete_bipartite_graph(n1, n2, create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py index 210e1f0a2..ba2b3d9c8 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -18,11 +18,16 @@ __all__ = ["betweenness_centrality", "edge_betweenness_centrality"] -@networkx_algorithm +@networkx_algorithm( + is_incomplete=True, # weight not supported + is_different=True, # RNG with seed is different + plc="betweenness_centrality", + version_added="23.10", +) def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None ): - """`weight` parameter is not yet supported.""" + """`weight` parameter is not yet supported, and RNG with seed may be different.""" if weight is not None: raise NotImplementedError( "Weighted implementation of betweenness centrality not currently supported" @@ -46,9 +51,14 @@ def _(G, k=None, normalized=True, weight=None, endpoints=False, seed=None): return weight is None -@networkx_algorithm +@networkx_algorithm( + is_incomplete=True, # weight not supported + is_different=True, # RNG with seed is different + plc="edge_betweenness_centrality", + version_added="23.10", +) def edge_betweenness_centrality(G, k=None, normalized=True, weight=None, seed=None): - """`weight` parameter is not yet supported.""" + """`weight` parameter is not yet supported, and RNG with seed may be different.""" if weight is not None: raise NotImplementedError( "Weighted implementation of betweenness centrality not currently supported" diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py index 0b2fd24af..a319eb3a1 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -16,7 +16,7 @@ __all__ = ["degree_centrality", "in_degree_centrality", "out_degree_centrality"] -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def degree_centrality(G): G = _to_graph(G) if len(G) <= 1: @@ -27,7 +27,7 @@ def degree_centrality(G): @not_implemented_for("undirected") -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def in_degree_centrality(G): G = _to_directed_graph(G) if len(G) <= 1: @@ -38,7 +38,7 @@ def in_degree_centrality(G): @not_implemented_for("undirected") -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def out_degree_centrality(G): G = _to_directed_graph(G) if len(G) <= 1: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py index c0f02a625..9e615955a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -26,7 +26,12 @@ @not_implemented_for("multigraph") -@networkx_algorithm(extra_params=_dtype_param) +@networkx_algorithm( + extra_params=_dtype_param, + is_incomplete=True, # nstart not supported + plc="eigenvector_centrality", + version_added="23.12", +) def eigenvector_centrality( G, max_iter=100, tol=1.0e-6, nstart=None, weight=None, *, dtype=None ): diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py index b61b811b8..a2fb950c1 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -26,7 +26,12 @@ @not_implemented_for("multigraph") -@networkx_algorithm(extra_params=_dtype_param) +@networkx_algorithm( + extra_params=_dtype_param, + is_incomplete=True, # nstart and normalized=False not supported + plc="katz_centrality", + version_added="23.12", +) def katz_centrality( G, alpha=0.1, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index 936d837da..d023bab1a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -35,7 +35,11 @@ "Upper limit of the number of macro-iterations (max: 500)." ), **_dtype_param, - } + }, + is_incomplete=True, # seed not supported; self-loops not supported + is_different=True, # RNG different + plc="louvain", + version_added="23.10", ) def louvain_communities( G, @@ -47,7 +51,7 @@ def louvain_communities( max_level=None, dtype=None, ): - """`seed` parameter is currently ignored.""" + """`seed` parameter is currently ignored, and self-loops are not yet supported.""" # NetworkX allows both directed and undirected, but cugraph only allows undirected. seed = _seed_to_int(seed) # Unused, but ensure it's valid for future compatibility G = _to_undirected_graph(G, weight) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py index 41f3457d5..cb12aed1d 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -30,7 +30,7 @@ @not_implemented_for("directed") -@networkx_algorithm +@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def number_connected_components(G): return sum(1 for _ in connected_components(G)) # PREFERRED IMPLEMENTATION, BUT PLC DOES NOT HANDLE ISOLATED VERTICES WELL @@ -57,7 +57,7 @@ def _(G): @not_implemented_for("directed") -@networkx_algorithm +@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def connected_components(G): G = _to_undirected_graph(G) if G.src_indices.size == 0: @@ -86,7 +86,7 @@ def connected_components(G): @not_implemented_for("directed") -@networkx_algorithm +@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def is_connected(G): G = _to_undirected_graph(G) if len(G) == 0: @@ -110,7 +110,7 @@ def is_connected(G): @not_implemented_for("directed") -@networkx_algorithm +@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def node_connected_component(G, n): # We could also do plain BFS from n G = _to_undirected_graph(G) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index c00df2d83..e4520c271 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -27,7 +27,7 @@ @not_implemented_for("directed") @not_implemented_for("multigraph") -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="k_truss_subgraph", version_added="23.12") def k_truss(G, k): """ Currently raises `NotImplementedError` for graphs with more than one connected diff --git a/python/nx-cugraph/nx_cugraph/algorithms/dag.py b/python/nx-cugraph/nx_cugraph/algorithms/dag.py index 067cfed91..ad5b7594a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/dag.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/dag.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -45,11 +45,11 @@ def _ancestors_and_descendants(G, source, *, is_ancestors): return G._nodearray_to_set(node_ids[mask]) -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="24.02") def descendants(G, source): return _ancestors_and_descendants(G, source, is_ancestors=False) -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="24.02") def ancestors(G, source): return _ancestors_and_descendants(G, source, is_ancestors=True) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py index d32223fb3..c7e5d7113 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -25,7 +25,7 @@ __all__ = ["is_isolate", "isolates", "number_of_isolates"] -@networkx_algorithm +@networkx_algorithm(version_added="23.10") def is_isolate(G, n): G = _to_graph(G) index = n if G.key_to_id is None else G.key_to_id[n] @@ -51,13 +51,13 @@ def _isolates(G) -> cp.ndarray[IndexValue]: return cp.nonzero(_mark_isolates(G))[0] -@networkx_algorithm +@networkx_algorithm(version_added="23.10") def isolates(G): G = _to_graph(G) return G._nodeiter_to_iter(iter(_isolates(G).tolist())) -@networkx_algorithm +@networkx_algorithm(version_added="23.10") def number_of_isolates(G): G = _to_graph(G) return _mark_isolates(G).sum().tolist() diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py index 1c8a47c24..caa01327a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -32,7 +32,9 @@ "The edge attribute to use as the edge weight." ), **_dtype_param, - } + }, + plc="hits", + version_added="23.12", ) def hits( G, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py index 63f6e89c3..d45d019c1 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -26,7 +26,12 @@ __all__ = ["pagerank"] -@networkx_algorithm(extra_params=_dtype_param) +@networkx_algorithm( + extra_params=_dtype_param, + is_incomplete=True, # dangling not supported + plc={"pagerank", "personalized_pagerank"}, + version_added="23.12", +) def pagerank( G, alpha=0.85, @@ -97,7 +102,7 @@ def pagerank( @pagerank._can_run -def pagerank( +def _( G, alpha=0.85, personalization=None, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py index 3413a637b..b1032a823 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -21,12 +21,12 @@ __all__ = ["single_source_shortest_path_length", "single_target_shortest_path_length"] -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="23.12") def single_source_shortest_path_length(G, source, cutoff=None): return _single_shortest_path_length(G, source, cutoff, "Source") -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="23.12") def single_target_shortest_path_length(G, target, cutoff=None): return _single_shortest_path_length(G, target, cutoff, "Target") diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py index e2a7d46f4..aa671bbb7 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -57,7 +57,7 @@ def _bfs(G, source, *, depth_limit=None, reverse=False): return distances[mask], predecessors[mask], node_ids[mask] -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") def generic_bfs_edges(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): """`neighbors` and `sort_neighbors` parameters are not yet supported.""" return bfs_edges(source, depth_limit=depth_limit) @@ -68,7 +68,7 @@ def _(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): return neighbors is None and sort_neighbors is None -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") def bfs_edges(G, source, reverse=False, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" G = _check_G_and_source(G, source) @@ -95,7 +95,7 @@ def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") def bfs_tree(G, source, reverse=False, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" G = _check_G_and_source(G, source) @@ -149,7 +149,7 @@ def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") def bfs_successors(G, source, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" G = _check_G_and_source(G, source) @@ -173,7 +173,7 @@ def _(G, source, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="24.02") def bfs_layers(G, sources): G = _to_graph(G) if sources in G: @@ -201,7 +201,7 @@ def bfs_layers(G, sources): return (G._nodearray_to_list(groups[key]) for key in range(len(groups))) -@networkx_algorithm +@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") def bfs_predecessors(G, source, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" G = _check_G_and_source(G, source) @@ -227,7 +227,7 @@ def _(G, source, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm +@networkx_algorithm(plc="bfs", version_added="24.02") def descendants_at_distance(G, source, distance): G = _check_G_and_source(G, source) if distance is None or distance < 0: diff --git a/python/nx-cugraph/nx_cugraph/classes/function.py b/python/nx-cugraph/nx_cugraph/classes/function.py index 633e4abd7..435dfe372 100644 --- a/python/nx-cugraph/nx_cugraph/classes/function.py +++ b/python/nx-cugraph/nx_cugraph/classes/function.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -16,7 +16,7 @@ __all__ = ["number_of_selfloops"] -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def number_of_selfloops(G): G = _to_graph(G) is_selfloop = G.src_indices == G.dst_indices diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py index 80ca0c2fa..1a2ecde9b 100644 --- a/python/nx-cugraph/nx_cugraph/convert_matrix.py +++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -23,7 +23,8 @@ ] -@networkx_algorithm +# Value columns with string dtype is not supported +@networkx_algorithm(is_incomplete=True, version_added="23.12") def from_pandas_edgelist( df, source="source", @@ -32,7 +33,7 @@ def from_pandas_edgelist( create_using=None, edge_key=None, ): - """cudf.DataFrame inputs also supported.""" + """cudf.DataFrame inputs also supported; value columns with str is unsuppported.""" graph_class, inplace = _create_using_class(create_using) src_array = df[source].to_numpy() dst_array = df[target].to_numpy() @@ -120,7 +121,7 @@ def from_pandas_edgelist( return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def from_scipy_sparse_array( A, parallel_edges=False, create_using=None, edge_attribute="weight" ): diff --git a/python/nx-cugraph/nx_cugraph/generators/classic.py b/python/nx-cugraph/nx_cugraph/generators/classic.py index 4213e6dd2..a548beea3 100644 --- a/python/nx-cugraph/nx_cugraph/generators/classic.py +++ b/python/nx-cugraph/nx_cugraph/generators/classic.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -51,7 +51,7 @@ concat = itertools.chain.from_iterable -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def barbell_graph(m1, m2, create_using=None): # Like two complete graphs and a path_graph m1 = _ensure_nonnegative_int(m1) @@ -81,12 +81,12 @@ def barbell_graph(m1, m2, create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def circular_ladder_graph(n, create_using=None): return _ladder_graph(n, create_using, is_circular=True) -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def complete_graph(n, create_using=None): n, nodes = _number_and_nodes(n) if n < 3: @@ -99,7 +99,7 @@ def complete_graph(n, create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def complete_multipartite_graph(*subset_sizes): if not subset_sizes: return nxcg.Graph() @@ -142,7 +142,7 @@ def complete_multipartite_graph(*subset_sizes): ) -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def cycle_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) @@ -172,7 +172,7 @@ def cycle_graph(n, create_using=None): return G -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def empty_graph(n=0, create_using=None, default=nx.Graph): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using, default=default) @@ -234,12 +234,12 @@ def _ladder_graph(n, create_using, *, is_circular=False): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def ladder_graph(n, create_using=None): return _ladder_graph(n, create_using) -@networkx_algorithm(nodes_or_number=[0, 1]) +@networkx_algorithm(nodes_or_number=[0, 1], version_added="23.12") def lollipop_graph(m, n, create_using=None): # Like complete_graph then path_graph orig_m, unused_nodes_m = m @@ -274,12 +274,12 @@ def lollipop_graph(m, n, create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def null_graph(create_using=None): return _common_small_graph(0, None, create_using) -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def path_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) @@ -299,7 +299,7 @@ def path_graph(n, create_using=None): return G -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def star_graph(n, create_using=None): orig_n, orig_nodes = n n, nodes = _number_and_nodes(n) @@ -323,7 +323,7 @@ def star_graph(n, create_using=None): return G -@networkx_algorithm(nodes_or_number=[0, 1]) +@networkx_algorithm(nodes_or_number=[0, 1], version_added="23.12") def tadpole_graph(m, n, create_using=None): orig_m, unused_nodes_m = m orig_n, unused_nodes_n = n @@ -361,12 +361,12 @@ def tadpole_graph(m, n, create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def trivial_graph(create_using=None): return _common_small_graph(1, None, create_using) -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def turan_graph(n, r): if not 1 <= r <= n: raise nx.NetworkXError("Must satisfy 1 <= r <= n") @@ -375,7 +375,7 @@ def turan_graph(n, r): return complete_multipartite_graph(*partitions) -@networkx_algorithm(nodes_or_number=0) +@networkx_algorithm(nodes_or_number=0, version_added="23.12") def wheel_graph(n, create_using=None): n, nodes = _number_and_nodes(n) graph_class, inplace = _create_using_class(create_using) diff --git a/python/nx-cugraph/nx_cugraph/generators/community.py b/python/nx-cugraph/nx_cugraph/generators/community.py index e5cb03e8c..9b0e0848d 100644 --- a/python/nx-cugraph/nx_cugraph/generators/community.py +++ b/python/nx-cugraph/nx_cugraph/generators/community.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -27,7 +27,7 @@ ] -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def caveman_graph(l, k): # noqa: E741 l = _ensure_int(l) # noqa: E741 k = _ensure_int(k) diff --git a/python/nx-cugraph/nx_cugraph/generators/small.py b/python/nx-cugraph/nx_cugraph/generators/small.py index b9a189c31..45487571c 100644 --- a/python/nx-cugraph/nx_cugraph/generators/small.py +++ b/python/nx-cugraph/nx_cugraph/generators/small.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -43,7 +43,7 @@ ] -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def bull_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -56,7 +56,7 @@ def bull_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def chvatal_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -85,7 +85,7 @@ def chvatal_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def cubical_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -105,7 +105,7 @@ def cubical_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def desargues_graph(create_using=None): # This can also be defined w.r.t. LCF_graph graph_class, inplace = _create_using_class(create_using) @@ -146,7 +146,7 @@ def desargues_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def diamond_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -159,7 +159,7 @@ def diamond_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def dodecahedral_graph(create_using=None): # This can also be defined w.r.t. LCF_graph graph_class, inplace = _create_using_class(create_using) @@ -200,7 +200,7 @@ def dodecahedral_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def frucht_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -235,7 +235,7 @@ def frucht_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def heawood_graph(create_using=None): # This can also be defined w.r.t. LCF_graph graph_class, inplace = _create_using_class(create_using) @@ -274,7 +274,7 @@ def heawood_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def house_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -287,7 +287,7 @@ def house_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def house_x_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -306,7 +306,7 @@ def house_x_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def icosahedral_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -337,7 +337,7 @@ def icosahedral_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def krackhardt_kite_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -366,7 +366,7 @@ def krackhardt_kite_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def moebius_kantor_graph(create_using=None): # This can also be defined w.r.t. LCF_graph graph_class, inplace = _create_using_class(create_using) @@ -407,7 +407,7 @@ def moebius_kantor_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def octahedral_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -428,7 +428,7 @@ def octahedral_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def pappus_graph(): # This can also be defined w.r.t. LCF_graph # fmt: off @@ -452,7 +452,7 @@ def pappus_graph(): return nxcg.Graph.from_coo(18, src_indices, dst_indices, name="Pappus Graph") -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def petersen_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -479,7 +479,7 @@ def petersen_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def sedgewick_maze_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -500,7 +500,7 @@ def sedgewick_maze_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def tetrahedral_graph(create_using=None): # This can also be defined w.r.t. complete_graph graph_class, inplace = _create_using_class(create_using) @@ -517,7 +517,7 @@ def tetrahedral_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def truncated_cube_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -548,7 +548,7 @@ def truncated_cube_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def truncated_tetrahedron_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): @@ -583,7 +583,7 @@ def truncated_tetrahedron_graph(create_using=None): return G -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def tutte_graph(create_using=None): graph_class, inplace = _create_using_class(create_using) if graph_class.is_directed(): diff --git a/python/nx-cugraph/nx_cugraph/generators/social.py b/python/nx-cugraph/nx_cugraph/generators/social.py index 3c936d07a..07e82c63f 100644 --- a/python/nx-cugraph/nx_cugraph/generators/social.py +++ b/python/nx-cugraph/nx_cugraph/generators/social.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -25,7 +25,7 @@ ] -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def davis_southern_women_graph(): # fmt: off src_indices = cp.array( @@ -88,7 +88,7 @@ def davis_southern_women_graph(): ) -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def florentine_families_graph(): # fmt: off src_indices = cp.array( @@ -114,7 +114,7 @@ def florentine_families_graph(): return nxcg.Graph.from_coo(15, src_indices, dst_indices, id_to_key=nodes) -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def karate_club_graph(): # fmt: off src_indices = cp.array( @@ -175,7 +175,7 @@ def karate_club_graph(): ) -@networkx_algorithm +@networkx_algorithm(version_added="23.12") def les_miserables_graph(): # fmt: off src_indices = cp.array( diff --git a/python/nx-cugraph/nx_cugraph/scripts/__init__.py b/python/nx-cugraph/nx_cugraph/scripts/__init__.py new file mode 100644 index 000000000..aeae60781 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/scripts/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 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 +# +# 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/python/nx-cugraph/nx_cugraph/scripts/__main__.py b/python/nx-cugraph/nx_cugraph/scripts/__main__.py new file mode 100755 index 000000000..c0963e64c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/scripts/__main__.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# Copyright (c) 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 +# +# 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. +if __name__ == "__main__": + import argparse + + from nx_cugraph.scripts import print_table, print_tree + + parser = argparse.ArgumentParser( + parents=[ + print_table.get_argumentparser(add_help=False), + print_tree.get_argumentparser(add_help=False), + ], + description="Print info about functions implemented by nx-cugraph", + ) + parser.add_argument("action", choices=["print_table", "print_tree"]) + args = parser.parse_args() + if args.action == "print_table": + print_table.main() + else: + print_tree.main( + by=args.by, + networkx_path=args.networkx_path, + dispatch_name=args.dispatch_name or args.dispatch_name_always, + version_added=args.version_added, + plc=args.plc, + dispatch_name_if_different=not args.dispatch_name_always, + ) diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_table.py b/python/nx-cugraph/nx_cugraph/scripts/print_table.py new file mode 100755 index 000000000..7e69de63d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/scripts/print_table.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# Copyright (c) 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 +# +# 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. +import argparse +import sys +from collections import namedtuple + +from networkx.utils.backends import _registered_algorithms as algos + +from _nx_cugraph import get_info +from nx_cugraph.interface import BackendInterface + + +def get_funcpath(func): + return f"{func.__module__}.{func.__name__}" + + +def get_path_to_name(): + return { + get_funcpath(algos[funcname]): funcname + for funcname in get_info()["functions"].keys() & algos.keys() + } + + +Info = namedtuple( + "Info", + "networkx_path, dispatch_name, version_added, plc, is_incomplete, is_different", +) + + +def get_path_to_info(path_to_name=None, version_added_sep=".", plc_sep="/"): + if path_to_name is None: + path_to_name = get_path_to_name() + rv = {} + for funcpath in sorted(path_to_name): + funcname = path_to_name[funcpath] + cufunc = getattr(BackendInterface, funcname) + plc = plc_sep.join(sorted(cufunc._plc_names)) if cufunc._plc_names else "" + version_added = cufunc.version_added.replace(".", version_added_sep) + is_incomplete = cufunc.is_incomplete + is_different = cufunc.is_different + rv[funcpath] = Info( + funcpath, funcname, version_added, plc, is_incomplete, is_different + ) + return rv + + +def main(path_to_info=None, *, file=sys.stdout): + if path_to_info is None: + path_to_info = get_path_to_info(version_added_sep=".") + lines = ["networkx_path,dispatch_name,version_added,plc,is_incomplete,is_different"] + lines.extend(",".join(info) for info in path_to_info.values()) + text = "\n".join(lines) + print(text, file=file) + return text + + +def get_argumentparser(add_help=True): + return argparse.ArgumentParser( + description="Print info about functions implemented by nx-cugraph as CSV", + add_help=add_help, + ) + + +if __name__ == "__main__": + parser = get_argumentparser() + args = parser.parse_args() + main() diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_tree.py b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py new file mode 100755 index 000000000..bb75d735c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python +# Copyright (c) 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 +# +# 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. +import argparse +import re +import sys + +import networkx as nx + +from nx_cugraph.scripts.print_table import get_path_to_info + + +def add_branch(G, path, extra="", *, skip=0): + branch = path.split(".") + prev = ".".join(branch[: skip + 1]) + for i in range(skip + 2, len(branch)): + cur = ".".join(branch[:i]) + G.add_edge(prev, cur) + prev = cur + if extra: + if not isinstance(extra, str): + extra = ", ".join(extra) + path += f" ({extra})" + G.add_edge(prev, path) + + +def get_extra( + info, + *, + networkx_path=False, + dispatch_name=False, + version_added=False, + plc=False, + dispatch_name_if_different=False, + incomplete=False, + different=False, +): + extra = [] + if networkx_path: + extra.append(info.networkx_path) + if dispatch_name and ( + not dispatch_name_if_different + or info.dispatch_name != info.networkx_path.rsplit(".", 1)[-1] + ): + extra.append(info.dispatch_name) + if version_added: + v = info.version_added + if len(v) != 5: + raise ValueError(f"Is there something wrong with version: {v!r}?") + extra.append(v[:2] + "." + v[-2:]) + if plc and info.plc: + extra.append(info.plc) + if incomplete and info.is_incomplete: + extra.append("is-incomplete") + if different and info.is_different: + extra.append("is-different") + return extra + + +def create_tree( + path_to_info=None, + *, + by="networkx_path", + skip=0, + networkx_path=False, + dispatch_name=False, + version_added=False, + plc=False, + dispatch_name_if_different=False, + incomplete=False, + different=False, + prefix="", +): + if path_to_info is None: + path_to_info = get_path_to_info() + if isinstance(by, str): + by = [by] + G = nx.DiGraph() + for info in sorted( + path_to_info.values(), + key=lambda x: (*(getattr(x, b) for b in by), x.networkx_path), + ): + if not all(getattr(info, b) for b in by): + continue + path = prefix + ".".join(getattr(info, b) for b in by) + extra = get_extra( + info, + networkx_path=networkx_path, + dispatch_name=dispatch_name, + version_added=version_added, + plc=plc, + dispatch_name_if_different=dispatch_name_if_different, + incomplete=incomplete, + different=different, + ) + add_branch(G, path, extra=extra, skip=skip) + return G + + +def main( + path_to_info=None, + *, + by="networkx_path", + networkx_path=False, + dispatch_name=False, + version_added=False, + plc=False, + dispatch_name_if_different=True, + incomplete=False, + different=False, + file=sys.stdout, +): + if path_to_info is None: + path_to_info = get_path_to_info(version_added_sep="-") + kwargs = { + "networkx_path": networkx_path, + "dispatch_name": dispatch_name, + "version_added": version_added, + "plc": plc, + "dispatch_name_if_different": dispatch_name_if_different, + "incomplete": incomplete, + "different": different, + } + if by == "networkx_path": + G = create_tree(path_to_info, by="networkx_path", **kwargs) + text = re.sub(r"[A-Za-z_\./]+\.", "", ("\n".join(nx.generate_network_text(G)))) + elif by == "plc": + G = create_tree( + path_to_info, by=["plc", "networkx_path"], prefix="plc-", **kwargs + ) + text = re.sub( + "plc-", + "plc.", + re.sub( + r" plc-[A-Za-z_\./]*\.", + " ", + "\n".join(nx.generate_network_text(G)), + ), + ) + elif by == "version_added": + G = create_tree( + path_to_info, + by=["version_added", "networkx_path"], + prefix="version_added-", + **kwargs, + ) + text = re.sub( + "version_added-", + "version: ", + re.sub( + r" version_added-[-0-9A-Za-z_\./]*\.", + " ", + "\n".join(nx.generate_network_text(G)), + ), + ).replace("-", ".") + else: + raise ValueError( + "`by` argument should be one of {'networkx_path', 'plc', 'version_added' " + f"got: {by}" + ) + print(text, file=file) + return text + + +def get_argumentparser(add_help=True): + parser = argparse.ArgumentParser( + "Print a tree showing NetworkX functions implemented by nx-cugraph", + add_help=add_help, + ) + parser.add_argument( + "--by", + choices=["networkx_path", "plc", "version_added"], + default="networkx_path", + help="How to group functions", + ) + parser.add_argument( + "--dispatch-name", + "--dispatch_name", + action="store_true", + help="Show the dispatch name in parentheses if different from NetworkX name", + ) + parser.add_argument( + "--dispatch-name-always", + "--dispatch_name_always", + action="store_true", + help="Always show the dispatch name in parentheses", + ) + parser.add_argument( + "--plc", + "--pylibcugraph", + action="store_true", + help="Show the used pylibcugraph function in parentheses", + ) + parser.add_argument( + "--version-added", + "--version_added", + action="store_true", + help="Show the version added in parentheses", + ) + parser.add_argument( + "--networkx-path", + "--networkx_path", + action="store_true", + help="Show the full networkx path in parentheses", + ) + parser.add_argument( + "--incomplete", + action="store_true", + help="Show which functions are incomplete", + ) + parser.add_argument( + "--different", + action="store_true", + help="Show which functions are different", + ) + return parser + + +if __name__ == "__main__": + parser = get_argumentparser() + args = parser.parse_args() + main( + by=args.by, + networkx_path=args.networkx_path, + dispatch_name=args.dispatch_name or args.dispatch_name_always, + version_added=args.version_added, + plc=args.plc, + dispatch_name_if_different=not args.dispatch_name_always, + incomplete=args.incomplete, + different=args.different, + ) diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py index a0dbfcec8..d09a9e961 100644 --- a/python/nx-cugraph/nx_cugraph/utils/decorators.py +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -41,14 +41,25 @@ class networkx_algorithm: name: str extra_doc: str | None extra_params: dict[str, str] | None + version_added: str + is_incomplete: bool + is_different: bool + _plc_names: set[str] | None def __new__( cls, func=None, *, name: str | None = None, + # Extra parameter info that is added to NetworkX docstring extra_params: dict[str, str] | str | None = None, + # Applies `nodes_or_number` decorator compatibly across versions (3.3 changed) nodes_or_number: list[int] | int | None = None, + # Metadata (for introspection only) + version_added: str, # Required + is_incomplete: bool = False, # See self.extra_doc for details if True + is_different: bool = False, # See self.extra_doc for details if True + plc: str | set[str] | None = None, # Hidden from user, may be removed someday ): if func is None: return partial( @@ -56,6 +67,10 @@ def __new__( name=name, extra_params=extra_params, nodes_or_number=nodes_or_number, + plc=plc, + version_added=version_added, + is_incomplete=is_incomplete, + is_different=is_different, ) instance = object.__new__(cls) if nodes_or_number is not None and nx.__version__[:3] > "3.2": @@ -74,6 +89,15 @@ def __new__( f"extra_params must be dict, str, or None; got {type(extra_params)}" ) instance.extra_params = extra_params + if plc is None or isinstance(plc, set): + instance._plc_names = plc + elif isinstance(plc, str): + instance._plc_names = {plc} + else: + raise TypeError(f"plc argument must be str, set, or None; got {type(plc)}") + instance.version_added = version_added + instance.is_incomplete = is_incomplete + instance.is_different = is_different # The docstring on our function is added to the NetworkX docstring. instance.extra_doc = ( dedent(func.__doc__.lstrip("\n").rstrip()) if func.__doc__ else None @@ -91,6 +115,11 @@ def __new__( def _can_run(self, func): """Set the `can_run` attribute to the decorated function.""" + if not func.__name__.startswith("_"): + raise ValueError( + "The name of the function used by `_can_run` must begin with '_'; " + f"got: {func.__name__!r}" + ) self.can_run = func def __call__(self, /, *args, **kwargs): diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index b29578b03..63ac11591 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -52,12 +52,20 @@ test = [ Homepage = "https://github.com/rapidsai/cugraph" Documentation = "https://docs.rapids.ai/api/cugraph/stable/" +# "plugin" used in nx version < 3.2 [project.entry-points."networkx.plugins"] cugraph = "nx_cugraph.interface:BackendInterface" [project.entry-points."networkx.plugin_info"] cugraph = "_nx_cugraph:get_info" +# "backend" used in nx version >= 3.2 +[project.entry-points."networkx.backends"] +cugraph = "nx_cugraph.interface:BackendInterface" + +[project.entry-points."networkx.backend_info"] +cugraph = "_nx_cugraph:get_info" + [tool.setuptools] license-files = ["LICENSE"] From 06f8970523913639fe1156d8d635754f199693eb Mon Sep 17 00:00:00 2001 From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:06:46 -0500 Subject: [PATCH 301/384] Fix OOB error, BFS C API should validate that the source vertex is a valid vertex (#4077) * Added error check to be sure that the source vertex is a valid vertex in the graph. * Updated `nx_cugraph.Graph` class to create PLC graphs using `vertices_array` in order to include isolated vertices. This is now needed since the error check added in this PR prevents NetworkX tests from passing if isolated vertices are treated as invalid, so this change prevents that. * This resolves the problem that required the test workarounds done [here](https://github.com/rapidsai/cugraph/pull/4029#discussion_r1433332010) in [4029](https://github.com/rapidsai/cugraph/pull/4029), so those workarounds have been removed in this PR. Closes #4067 Authors: - Chuck Hastings (https://github.com/ChuckHastings) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Seunghwa Kang (https://github.com/seunghwak) - Ray Douglass (https://github.com/raydouglass) - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4077 --- python/nx-cugraph/nx_cugraph/classes/graph.py | 17 ++++++++++++++++- python/nx-cugraph/nx_cugraph/interface.py | 13 +------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index cdd3f744f..cb6b4e7ae 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -65,6 +65,7 @@ class Graph: key_to_id: dict[NodeKey, IndexValue] | None _id_to_key: list[NodeKey] | None _N: int + _node_ids: cp.ndarray[IndexValue] | None # holds plc.SGGraph.vertices_array data # Used by graph._get_plc_graph _plc_type_map: ClassVar[dict[np.dtype, np.dtype]] = { @@ -116,6 +117,7 @@ def from_coo( new_graph.key_to_id = None if key_to_id is None else dict(key_to_id) new_graph._id_to_key = None if id_to_key is None else list(id_to_key) new_graph._N = op.index(N) # Ensure N is integral + new_graph._node_ids = None new_graph.graph = new_graph.graph_attr_dict_factory() new_graph.graph.update(attr) size = new_graph.src_indices.size @@ -157,6 +159,16 @@ def from_coo( f"(got {new_graph.dst_indices.dtype.name})." ) new_graph.dst_indices = dst_indices + + # If the graph contains isolates, plc.SGGraph() must be passed a value + # for vertices_array that contains every vertex ID, since the + # src/dst_indices arrays will not contain IDs for isolates. Create this + # only if needed. Like src/dst_indices, the _node_ids array must be + # maintained for the lifetime of the plc.SGGraph + isolates = nxcg.algorithms.isolate._isolates(new_graph) + if len(isolates) > 0: + new_graph._node_ids = cp.arange(new_graph._N, dtype=index_dtype) + return new_graph @classmethod @@ -405,6 +417,7 @@ def clear(self) -> None: self.src_indices = cp.empty(0, self.src_indices.dtype) self.dst_indices = cp.empty(0, self.dst_indices.dtype) self._N = 0 + self._node_ids = None self.key_to_id = None self._id_to_key = None @@ -637,6 +650,7 @@ def _get_plc_graph( dst_indices = self.dst_indices if switch_indices: src_indices, dst_indices = dst_indices, src_indices + return plc.SGGraph( resource_handle=plc.ResourceHandle(), graph_properties=plc.GraphProperties( @@ -649,6 +663,7 @@ def _get_plc_graph( store_transposed=store_transposed, renumber=False, do_expensive_check=False, + vertices_array=self._node_ids, ) def _sort_edge_indices(self, primary="src"): diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 3f6449f57..34eb59698 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -242,20 +242,9 @@ def key(testpath): ) too_slow = "Too slow to run" - maybe_oom = "out of memory in CI" skip = { key("test_tree_isomorphism.py:test_positive"): too_slow, key("test_tree_isomorphism.py:test_negative"): too_slow, - key("test_efficiency.py:TestEfficiency.test_using_ego_graph"): maybe_oom, - key("test_dag.py:TestDAG.test_antichains"): maybe_oom, - key( - "test_lowest_common_ancestors.py:" - "TestDAGLCA.test_all_pairs_lca_pairs_without_lca" - ): maybe_oom, - key( - "test_lowest_common_ancestors.py:" - "TestMultiDiGraph_DAGLCA.test_all_pairs_lca_pairs_without_lca" - ): maybe_oom, # These repeatedly call `bfs_layers`, which converts the graph every call key( "test_vf2pp.py:TestGraphISOVF2pp.test_custom_graph2_different_labels" From 775fc5ab6ea7164e6496fac0aa7dbf4496a8a684 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 16 Jan 2024 09:39:31 -0600 Subject: [PATCH 302/384] nx-cugraph: PLC now handles isolated nodes; clean up our workarounds (#4092) Hooray for removing and cleaning code! Tests also added (we already tested isolated nodes for Louvain). nx-cugraph was updated to handle isolated nodes by passing the node set to PLC in #4077 Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4092 --- python/nx-cugraph/_nx_cugraph/__init__.py | 10 +-- python/nx-cugraph/nx_cugraph/_version.py | 6 +- .../algorithms/community/louvain.py | 12 +--- .../algorithms/components/connected.py | 64 +++++++------------ .../nx-cugraph/nx_cugraph/tests/__init__.py | 3 +- .../nx_cugraph/tests/test_connected.py | 30 +++++++++ 6 files changed, 61 insertions(+), 64 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_connected.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index d02c9c3e9..4e869c76b 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -107,21 +107,21 @@ }, "extra_docstrings": { # BEGIN: extra_docstrings - "betweenness_centrality": "`weight` parameter is not yet supported.", + "betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "bfs_edges": "`sort_neighbors` parameter is not yet supported.", "bfs_predecessors": "`sort_neighbors` parameter is not yet supported.", "bfs_successors": "`sort_neighbors` parameter is not yet supported.", "bfs_tree": "`sort_neighbors` parameter is not yet supported.", - "edge_betweenness_centrality": "`weight` parameter is not yet supported.", + "edge_betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.", - "from_pandas_edgelist": "cudf.DataFrame inputs also supported.", + "from_pandas_edgelist": "cudf.DataFrame inputs also supported; value columns with str is unsuppported.", "generic_bfs_edges": "`neighbors` and `sort_neighbors` parameters are not yet supported.", "k_truss": ( "Currently raises `NotImplementedError` for graphs with more than one connected\n" "component when k >= 3. We expect to fix this soon." ), "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.", - "louvain_communities": "`seed` parameter is currently ignored.", + "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.", "pagerank": "`dangling` parameter is not supported, but it is checked for validity.", # END: extra_docstrings }, diff --git a/python/nx-cugraph/nx_cugraph/_version.py b/python/nx-cugraph/nx_cugraph/_version.py index 868a2e194..a528a3bfe 100644 --- a/python/nx-cugraph/nx_cugraph/_version.py +++ b/python/nx-cugraph/nx_cugraph/_version.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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. @@ -11,12 +11,10 @@ # 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. -# - import importlib.resources # Read VERSION file from the module that is symlinked to VERSION file -# in the root of the repo at build time or copied to the moudle at +# in the root of the repo at build time or copied to the module at # installation. VERSION is a separate file that allows CI build-time scripts # to update version info (including commit hashes) without modifying # source files. diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index d023bab1a..413ff9ca5 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -23,8 +23,6 @@ not_implemented_for, ) -from ..isolate import _isolates - __all__ = ["louvain_communities"] @@ -56,7 +54,6 @@ def louvain_communities( seed = _seed_to_int(seed) # Unused, but ensure it's valid for future compatibility G = _to_undirected_graph(G, weight) if G.src_indices.size == 0: - # TODO: PLC doesn't handle empty graphs gracefully! return [{key} for key in G._nodeiter_to_iter(range(len(G)))] if max_level is None: max_level = 500 @@ -76,14 +73,7 @@ def louvain_communities( do_expensive_check=False, ) groups = _groupby(clusters, node_ids, groups_are_canonical=True) - rv = [set(G._nodearray_to_list(ids)) for ids in groups.values()] - # TODO: PLC doesn't handle isolated node_ids yet, so this is a temporary fix - isolates = _isolates(G) - if isolates.size > 0: - isolates = isolates[isolates > node_ids.max()] - if isolates.size > 0: - rv.extend({node} for node in G._nodearray_to_list(isolates)) - return rv + return [set(G._nodearray_to_list(ids)) for ids in groups.values()] @louvain_communities._can_run diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py index cb12aed1d..95cc907a8 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py @@ -10,8 +10,6 @@ # 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. -import itertools - import cupy as cp import networkx as nx import pylibcugraph as plc @@ -19,8 +17,6 @@ from nx_cugraph.convert import _to_undirected_graph from nx_cugraph.utils import _groupby, networkx_algorithm, not_implemented_for -from ..isolate import _isolates - __all__ = [ "number_connected_components", "connected_components", @@ -32,19 +28,17 @@ @not_implemented_for("directed") @networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def number_connected_components(G): - return sum(1 for _ in connected_components(G)) - # PREFERRED IMPLEMENTATION, BUT PLC DOES NOT HANDLE ISOLATED VERTICES WELL - # G = _to_undirected_graph(G) - # unused_node_ids, labels = plc.weakly_connected_components( - # resource_handle=plc.ResourceHandle(), - # graph=G._get_plc_graph(), - # offsets=None, - # indices=None, - # weights=None, - # labels=None, - # do_expensive_check=False, - # ) - # return cp.unique(labels).size + G = _to_undirected_graph(G) + unused_node_ids, labels = plc.weakly_connected_components( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + offsets=None, + indices=None, + weights=None, + labels=None, + do_expensive_check=False, + ) + return cp.unique(labels).size @number_connected_components._can_run @@ -61,7 +55,6 @@ def _(G): def connected_components(G): G = _to_undirected_graph(G) if G.src_indices.size == 0: - # TODO: PLC doesn't handle empty graphs (or isolated nodes) gracefully! return [{key} for key in G._nodeiter_to_iter(range(len(G)))] node_ids, labels = plc.weakly_connected_components( resource_handle=plc.ResourceHandle(), @@ -73,16 +66,7 @@ def connected_components(G): do_expensive_check=False, ) groups = _groupby(labels, node_ids) - it = (G._nodearray_to_set(connected_ids) for connected_ids in groups.values()) - # TODO: PLC doesn't handle isolated vertices yet, so this is a temporary fix - isolates = _isolates(G) - if isolates.size > 0: - isolates = isolates[isolates > node_ids.max()] - if isolates.size > 0: - it = itertools.chain( - it, ({node} for node in G._nodearray_to_list(isolates)) - ) - return it + return (G._nodearray_to_set(connected_ids) for connected_ids in groups.values()) @not_implemented_for("directed") @@ -93,20 +77,16 @@ def is_connected(G): raise nx.NetworkXPointlessConcept( "Connectivity is undefined for the null graph." ) - for community in connected_components(G): - return len(community) == len(G) - raise RuntimeError # pragma: no cover - # PREFERRED IMPLEMENTATION, BUT PLC DOES NOT HANDLE ISOLATED VERTICES WELL - # unused_node_ids, labels = plc.weakly_connected_components( - # resource_handle=plc.ResourceHandle(), - # graph=G._get_plc_graph(), - # offsets=None, - # indices=None, - # weights=None, - # labels=None, - # do_expensive_check=False, - # ) - # return labels.size == len(G) and cp.unique(labels).size == 1 + unused_node_ids, labels = plc.weakly_connected_components( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + offsets=None, + indices=None, + weights=None, + labels=None, + do_expensive_check=False, + ) + return bool((labels == labels[0]).all()) @not_implemented_for("directed") diff --git a/python/nx-cugraph/nx_cugraph/tests/__init__.py b/python/nx-cugraph/nx_cugraph/tests/__init__.py index ce94db52f..c2002fd3f 100644 --- a/python/nx-cugraph/nx_cugraph/tests/__init__.py +++ b/python/nx-cugraph/nx_cugraph/tests/__init__.py @@ -1,5 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. -# +# Copyright (c) 2023-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 diff --git a/python/nx-cugraph/nx_cugraph/tests/test_connected.py b/python/nx-cugraph/nx_cugraph/tests/test_connected.py new file mode 100644 index 000000000..fa9f283ab --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_connected.py @@ -0,0 +1,30 @@ +# Copyright (c) 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 +# +# 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. +import networkx as nx + +import nx_cugraph as nxcg + + +def test_connected_isolated_nodes(): + G = nx.complete_graph(4) + G.add_node(max(G) + 1) + assert nx.is_connected(G) is False + assert nxcg.is_connected(G) is False + assert nx.number_connected_components(G) == 2 + assert nxcg.number_connected_components(G) == 2 + assert sorted(nx.connected_components(G)) == [{0, 1, 2, 3}, {4}] + assert sorted(nxcg.connected_components(G)) == [{0, 1, 2, 3}, {4}] + assert nx.node_connected_component(G, 0) == {0, 1, 2, 3} + assert nxcg.node_connected_component(G, 0) == {0, 1, 2, 3} + assert nx.node_connected_component(G, 4) == {4} + assert nxcg.node_connected_component(G, 4) == {4} From 203784c34362f3869e346afe9f11be85925a5a9b Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 16 Jan 2024 19:39:48 -0600 Subject: [PATCH 303/384] nx-cugraph: add weakly connected components (#4071) This doesn't currently work, because `plc.weakly_connected_components` only works on symmetric graphs (so it's not actually performing wcc now is it?): > RuntimeError: non-success value returned from cugraph_weakly_connected_components: CUGRAPH_UNKNOWN_ERROR cuGraph failure at file=[...]/cugraph/cpp/src/components/weakly_connected_components_impl.cuh line=283: Invalid input argument: input graph should be symmetric for weakly connected components. _These are high-priority algorithms for `nx-cugraph`, because they are widely used by networkx dependents._ Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4071 --- python/nx-cugraph/_nx_cugraph/__init__.py | 6 ++ .../algorithms/components/__init__.py | 4 +- .../algorithms/components/connected.py | 22 ++++- .../components/strongly_connected.py | 85 +++++++++++++++++++ .../algorithms/components/weakly_connected.py | 47 ++++++++++ .../nx_cugraph/algorithms/isolate.py | 24 ++++-- python/nx-cugraph/nx_cugraph/classes/graph.py | 23 ++++- python/nx-cugraph/nx_cugraph/interface.py | 7 +- 8 files changed, 204 insertions(+), 14 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 4e869c76b..d9b997411 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -70,6 +70,8 @@ "in_degree_centrality", "is_connected", "is_isolate", + "is_strongly_connected", + "is_weakly_connected", "isolates", "k_truss", "karate_club_graph", @@ -85,6 +87,8 @@ "number_connected_components", "number_of_isolates", "number_of_selfloops", + "number_strongly_connected_components", + "number_weakly_connected_components", "octahedral_graph", "out_degree_centrality", "pagerank", @@ -95,6 +99,7 @@ "single_source_shortest_path_length", "single_target_shortest_path_length", "star_graph", + "strongly_connected_components", "tadpole_graph", "tetrahedral_graph", "trivial_graph", @@ -102,6 +107,7 @@ "truncated_tetrahedron_graph", "turan_graph", "tutte_graph", + "weakly_connected_components", "wheel_graph", # END: functions }, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py index 26816ef36..12a09b535 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -11,3 +11,5 @@ # See the License for the specific language governing permissions and # limitations under the License. from .connected import * +from .strongly_connected import * +from .weakly_connected import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py index 95cc907a8..cdb9f54f6 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py @@ -29,9 +29,15 @@ @networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def number_connected_components(G): G = _to_undirected_graph(G) + return _number_connected_components(G) + + +def _number_connected_components(G, symmetrize=None): + if G.src_indices.size == 0: + return len(G) unused_node_ids, labels = plc.weakly_connected_components( resource_handle=plc.ResourceHandle(), - graph=G._get_plc_graph(), + graph=G._get_plc_graph(symmetrize=symmetrize), offsets=None, indices=None, weights=None, @@ -54,11 +60,15 @@ def _(G): @networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def connected_components(G): G = _to_undirected_graph(G) + return _connected_components(G) + + +def _connected_components(G, symmetrize=None): if G.src_indices.size == 0: return [{key} for key in G._nodeiter_to_iter(range(len(G)))] node_ids, labels = plc.weakly_connected_components( resource_handle=plc.ResourceHandle(), - graph=G._get_plc_graph(), + graph=G._get_plc_graph(symmetrize=symmetrize), offsets=None, indices=None, weights=None, @@ -73,13 +83,19 @@ def connected_components(G): @networkx_algorithm(plc="weakly_connected_components", version_added="23.12") def is_connected(G): G = _to_undirected_graph(G) + return _is_connected(G) + + +def _is_connected(G, symmetrize=None): if len(G) == 0: raise nx.NetworkXPointlessConcept( "Connectivity is undefined for the null graph." ) + if G.src_indices.size == 0: + return len(G) == 1 unused_node_ids, labels = plc.weakly_connected_components( resource_handle=plc.ResourceHandle(), - graph=G._get_plc_graph(), + graph=G._get_plc_graph(symmetrize=symmetrize), offsets=None, indices=None, weights=None, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py new file mode 100644 index 000000000..8fdf99ed5 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py @@ -0,0 +1,85 @@ +# Copyright (c) 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 +# +# 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. +import cupy as cp +import networkx as nx +import pylibcugraph as plc + +from nx_cugraph.convert import _to_directed_graph +from nx_cugraph.utils import ( + _groupby, + index_dtype, + networkx_algorithm, + not_implemented_for, +) + +__all__ = [ + "number_strongly_connected_components", + "strongly_connected_components", + "is_strongly_connected", +] + + +def _strongly_connected_components(G): + # TODO: create utility function to convert just the indices to CSR + # TODO: this uses a legacy PLC function (strongly_connected_components) + N = len(G) + indices = cp.lexsort(cp.vstack((G.dst_indices, G.src_indices))) + dst_indices = G.dst_indices[indices] + offsets = cp.searchsorted( + G.src_indices, cp.arange(N + 1, dtype=index_dtype), sorter=indices + ).astype(index_dtype) + labels = cp.zeros(N, dtype=index_dtype) + plc.strongly_connected_components( + offsets=offsets, + indices=dst_indices, + weights=None, + num_verts=N, + num_edges=dst_indices.size, + labels=labels, + ) + return labels + + +@not_implemented_for("undirected") +@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +def strongly_connected_components(G): + G = _to_directed_graph(G) + if G.src_indices.size == 0: + return [{key} for key in G._nodeiter_to_iter(range(len(G)))] + labels = _strongly_connected_components(G) + groups = _groupby(labels, cp.arange(len(G), dtype=index_dtype)) + return (G._nodearray_to_set(connected_ids) for connected_ids in groups.values()) + + +@not_implemented_for("undirected") +@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +def number_strongly_connected_components(G): + G = _to_directed_graph(G) + if G.src_indices.size == 0: + return len(G) + labels = _strongly_connected_components(G) + return cp.unique(labels).size + + +@not_implemented_for("undirected") +@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +def is_strongly_connected(G): + G = _to_directed_graph(G) + if len(G) == 0: + raise nx.NetworkXPointlessConcept( + "Connectivity is undefined for the null graph." + ) + if G.src_indices.size == 0: + return len(G) == 1 + labels = _strongly_connected_components(G) + return bool((labels == labels[0]).all()) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py new file mode 100644 index 000000000..5b797b391 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py @@ -0,0 +1,47 @@ +# Copyright (c) 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 +# +# 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. +from nx_cugraph.convert import _to_directed_graph +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +from .connected import ( + _connected_components, + _is_connected, + _number_connected_components, +) + +__all__ = [ + "number_weakly_connected_components", + "weakly_connected_components", + "is_weakly_connected", +] + + +@not_implemented_for("undirected") +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def weakly_connected_components(G): + G = _to_directed_graph(G) + return _connected_components(G, symmetrize="union") + + +@not_implemented_for("undirected") +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def number_weakly_connected_components(G): + G = _to_directed_graph(G) + return _number_connected_components(G, symmetrize="union") + + +@not_implemented_for("undirected") +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def is_weakly_connected(G): + G = _to_directed_graph(G) + return _is_connected(G, symmetrize="union") diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py index c7e5d7113..62b47a9b3 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py @@ -15,9 +15,10 @@ from typing import TYPE_CHECKING import cupy as cp +import numpy as np from nx_cugraph.convert import _to_graph -from nx_cugraph.utils import networkx_algorithm +from nx_cugraph.utils import index_dtype, networkx_algorithm if TYPE_CHECKING: # pragma: no cover from nx_cugraph.typing import IndexValue @@ -36,19 +37,28 @@ def is_isolate(G, n): ) -def _mark_isolates(G) -> cp.ndarray[bool]: +def _mark_isolates(G, symmetrize=None) -> cp.ndarray[bool]: """Return a boolean mask array indicating indices of isolated nodes.""" mark_isolates = cp.ones(len(G), bool) - mark_isolates[G.src_indices] = False - if G.is_directed(): - mark_isolates[G.dst_indices] = False + if G.is_directed() and symmetrize == "intersection": + N = G._N + # Upcast to int64 so indices don't overflow + src_dst = N * G.src_indices.astype(np.int64) + G.dst_indices + src_dst_T = G.src_indices + N * G.dst_indices.astype(np.int64) + src_dst_new = cp.intersect1d(src_dst, src_dst_T) + new_indices = cp.floor_divide(src_dst_new, N, dtype=index_dtype) + mark_isolates[new_indices] = False + else: + mark_isolates[G.src_indices] = False + if G.is_directed(): + mark_isolates[G.dst_indices] = False return mark_isolates -def _isolates(G) -> cp.ndarray[IndexValue]: +def _isolates(G, symmetrize=None) -> cp.ndarray[IndexValue]: """Like isolates, but return an array of indices instead of an iterator of nodes.""" G = _to_graph(G) - return cp.nonzero(_mark_isolates(G))[0] + return cp.nonzero(_mark_isolates(G, symmetrize=symmetrize))[0] @networkx_algorithm(version_added="23.10") diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index cb6b4e7ae..251e92b70 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -592,6 +592,7 @@ def _get_plc_graph( store_transposed: bool = False, switch_indices: bool = False, edge_array: cp.ndarray[EdgeValue] | None = None, + symmetrize: str | None = None, ): if edge_array is not None or edge_attr is None: pass @@ -650,12 +651,30 @@ def _get_plc_graph( dst_indices = self.dst_indices if switch_indices: src_indices, dst_indices = dst_indices, src_indices + if symmetrize is not None: + if edge_array is not None: + raise NotImplementedError( + "edge_array must be None when symmetrizing the graph" + ) + N = self._N + # Upcast to int64 so indices don't overflow + src_dst = N * src_indices.astype(np.int64) + dst_indices + src_dst_T = src_indices + N * dst_indices.astype(np.int64) + if symmetrize == "union": + src_dst_new = cp.union1d(src_dst, src_dst_T) + elif symmetrize == "intersection": + src_dst_new = cp.intersect1d(src_dst, src_dst_T) + else: + raise ValueError( + f'symmetrize must be "union" or "intersection"; got "{symmetrize}"' + ) + src_indices, dst_indices = cp.divmod(src_dst_new, N, dtype=index_dtype) return plc.SGGraph( resource_handle=plc.ResourceHandle(), graph_properties=plc.GraphProperties( - is_multigraph=self.is_multigraph(), - is_symmetric=not self.is_directed(), + is_multigraph=self.is_multigraph() and symmetrize is None, + is_symmetric=not self.is_directed() or symmetrize is not None, ), src_or_offset_array=src_indices, dst_or_index_array=dst_indices, diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 34eb59698..04591c0e9 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -68,7 +68,12 @@ def key(testpath): louvain_different = "Louvain may be different due to RNG" no_string_dtype = "string edge values not currently supported" - xfail = {} + xfail = { + key( + "test_strongly_connected.py:" + "TestStronglyConnected.test_condensation_mapping_and_members" + ): "Strongly connected groups in different iteration order", + } from packaging.version import parse From bdd29fe713862ea595068463576208f5d0b563d3 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Thu, 18 Jan 2024 05:22:11 -0600 Subject: [PATCH 304/384] `nx-cugraph`: add `to_undirected` method; add reciprocity algorithms (#4063) Getting `G.to_undirected` to work was more involved than I expected, but at least we got two algorithms "for free" out of the effort! We raise `NotImplementedError` for `multidigraph.to_undirected()` for now. I would say that understanding the reciprocity algorithms is the first step to understanding `to_undirected`. Authors: - Erik Welch (https://github.com/eriknw) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4063 --- python/nx-cugraph/_nx_cugraph/__init__.py | 2 + python/nx-cugraph/lint.yaml | 14 +-- .../nx_cugraph/algorithms/__init__.py | 3 +- .../nx_cugraph/algorithms/reciprocity.py | 93 ++++++++++++++ .../nx-cugraph/nx_cugraph/classes/digraph.py | 114 +++++++++++++++++- python/nx-cugraph/nx_cugraph/classes/graph.py | 7 +- .../nx_cugraph/classes/multidigraph.py | 10 +- .../nx_cugraph/classes/multigraph.py | 4 +- .../nx_cugraph/tests/test_generators.py | 27 +---- .../nx_cugraph/tests/test_graph_methods.py | 67 ++++++++++ .../nx_cugraph/tests/testing_utils.py | 38 ++++++ 11 files changed, 342 insertions(+), 37 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/reciprocity.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_graph_methods.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/testing_utils.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index d9b997411..69320e6b5 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -91,10 +91,12 @@ "number_weakly_connected_components", "octahedral_graph", "out_degree_centrality", + "overall_reciprocity", "pagerank", "pappus_graph", "path_graph", "petersen_graph", + "reciprocity", "sedgewick_maze_graph", "single_source_shortest_path_length", "single_target_shortest_path_length", diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index de6f20bc4..0d4f0b594 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-2024, NVIDIA CORPORATION. # # https://pre-commit.com/ # @@ -36,7 +36,7 @@ repos: - id: autoflake args: [--in-place] - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort - repo: https://github.com/asottile/pyupgrade @@ -45,23 +45,23 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.11.0 + rev: 23.12.1 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.7 + rev: v0.1.13 hooks: - id: ruff args: [--fix-only, --show-fixes] # --unsafe-fixes] - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.0.0 hooks: - id: flake8 args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501', '--extend-ignore=SIM105'] # Why is this necessary? additional_dependencies: &flake8_dependencies # These versions need updated manually - - flake8==6.1.0 + - flake8==7.0.0 - flake8-bugbear==23.12.2 - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.7 + rev: v0.1.13 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index d28a629fe..65700838f 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -26,5 +26,6 @@ from .dag import * from .isolate import * from .link_analysis import * +from .reciprocity import * from .shortest_paths import * from .traversal import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/reciprocity.py b/python/nx-cugraph/nx_cugraph/algorithms/reciprocity.py new file mode 100644 index 000000000..c87abdf9f --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/reciprocity.py @@ -0,0 +1,93 @@ +# Copyright (c) 2023-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 +# +# 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. +import cupy as cp +import networkx as nx +import numpy as np + +from nx_cugraph.convert import _to_directed_graph +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +__all__ = ["reciprocity", "overall_reciprocity"] + + +@not_implemented_for("undirected", "multigraph") +@networkx_algorithm(version_added="24.02") +def reciprocity(G, nodes=None): + if nodes is None: + return overall_reciprocity(G) + G = _to_directed_graph(G) + N = G._N + # 'nodes' can also be a single node identifier + if nodes in G: + index = nodes if G.key_to_id is None else G.key_to_id[nodes] + mask = (G.src_indices == index) | (G.dst_indices == index) + src_indices = G.src_indices[mask] + if src_indices.size == 0: + raise nx.NetworkXError("Not defined for isolated nodes.") + dst_indices = G.dst_indices[mask] + # Create two lists of edge identifiers, one for each direction. + # Edge identifiers can be created from a pair of node + # identifiers. Simply adding src IDs to dst IDs is not adequate, so + # make one set of values (either src or dst depending on direction) + # unique by multiplying values by N. + # Upcast to int64 so indices don't overflow. + edges_a_b = N * src_indices.astype(np.int64) + dst_indices + edges_b_a = src_indices + N * dst_indices.astype(np.int64) + # Find the matching edge identifiers in each list. The edge identifier + # generation ensures the ID for A->B == the ID for B->A + recip_indices = cp.intersect1d( + edges_a_b, + edges_b_a, + # assume_unique=True, # cupy <= 12.2.0 also assumes sorted + ) + num_selfloops = (src_indices == dst_indices).sum().tolist() + return (recip_indices.size - num_selfloops) / edges_a_b.size + + # Don't include self-loops + mask = G.src_indices != G.dst_indices + src_indices = G.src_indices[mask] + dst_indices = G.dst_indices[mask] + # Create two lists of edges, one for each direction, and find the matching + # IDs in each list (see description above). + edges_a_b = N * src_indices.astype(np.int64) + dst_indices + edges_b_a = src_indices + N * dst_indices.astype(np.int64) + recip_indices = cp.intersect1d( + edges_a_b, + edges_b_a, + # assume_unique=True, # cupy <= 12.2.0 also assumes sorted + ) + numer = cp.bincount(recip_indices // N, minlength=N) + denom = cp.bincount(src_indices, minlength=N) + denom += cp.bincount(dst_indices, minlength=N) + recip = 2 * numer / denom + node_ids = G._nodekeys_to_nodearray(nodes) + return G._nodearrays_to_dict(node_ids, recip[node_ids]) + + +@not_implemented_for("undirected", "multigraph") +@networkx_algorithm(version_added="24.02") +def overall_reciprocity(G): + G = _to_directed_graph(G) + if G.number_of_edges() == 0: + raise nx.NetworkXError("Not defined for empty graphs") + # Create two lists of edges, one for each direction, and find the matching + # IDs in each list (see description in reciprocity()). + edges_a_b = G._N * G.src_indices.astype(np.int64) + G.dst_indices + edges_b_a = G.src_indices + G._N * G.dst_indices.astype(np.int64) + recip_indices = cp.intersect1d( + edges_a_b, + edges_b_a, + # assume_unique=True, # cupy <= 12.2.0 also assumes sorted + ) + num_selfloops = (G.src_indices == G.dst_indices).sum().tolist() + return (recip_indices.size - num_selfloops) / edges_a_b.size diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index 52ea2334c..3392f3362 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -12,13 +12,16 @@ # limitations under the License. from __future__ import annotations +from copy import deepcopy from typing import TYPE_CHECKING import cupy as cp import networkx as nx +import numpy as np import nx_cugraph as nxcg +from ..utils import index_dtype from .graph import Graph if TYPE_CHECKING: # pragma: no cover @@ -59,6 +62,115 @@ def number_of_edges( def reverse(self, copy: bool = True) -> DiGraph: return self._copy(not copy, self.__class__, reverse=True) + @networkx_api + def to_undirected(self, reciprocal=False, as_view=False): + N = self._N + # Upcast to int64 so indices don't overflow + src_dst_indices_old = N * self.src_indices.astype(np.int64) + self.dst_indices + if reciprocal: + src_dst_indices_new = cp.intersect1d( + src_dst_indices_old, + self.src_indices + N * self.dst_indices.astype(np.int64), + # assume_unique=True, # cupy <= 12.2.0 also assumes sorted + ) + if self.edge_values: + sorter = cp.argsort(src_dst_indices_old) + idx = cp.searchsorted( + src_dst_indices_old, src_dst_indices_new, sorter=sorter + ) + indices = sorter[idx] + src_indices = self.src_indices[indices].copy() + dst_indices = self.dst_indices[indices].copy() + edge_values = { + key: val[indices].copy() for key, val in self.edge_values.items() + } + edge_masks = { + key: val[indices].copy() for key, val in self.edge_masks.items() + } + else: + src_indices, dst_indices = cp.divmod( + src_dst_indices_new, N, dtype=index_dtype + ) + else: + src_dst_indices_old_T = self.src_indices + N * self.dst_indices.astype( + np.int64 + ) + if self.edge_values: + src_dst_extra = cp.setdiff1d( + src_dst_indices_old_T, src_dst_indices_old, assume_unique=True + ) + sorter = cp.argsort(src_dst_indices_old_T) + idx = cp.searchsorted( + src_dst_indices_old_T, src_dst_extra, sorter=sorter + ) + indices = sorter[idx] + src_indices = cp.hstack((self.src_indices, self.dst_indices[indices])) + dst_indices = cp.hstack((self.dst_indices, self.src_indices[indices])) + edge_values = { + key: cp.hstack((val, val[indices])) + for key, val in self.edge_values.items() + } + edge_masks = { + key: cp.hstack((val, val[indices])) + for key, val in self.edge_masks.items() + } + else: + src_dst_indices_new = cp.union1d( + src_dst_indices_old, src_dst_indices_old_T + ) + src_indices, dst_indices = cp.divmod( + src_dst_indices_new, N, dtype=index_dtype + ) + + if self.edge_values: + recip_indices = cp.lexsort(cp.vstack((src_indices, dst_indices))) + for key, mask in edge_masks.items(): + # Make sure we choose a value that isn't masked out + val = edge_values[key] + rmask = mask[recip_indices] + recip_only = rmask & ~mask + val[recip_only] = val[recip_indices[recip_only]] + only = mask & ~rmask + val[recip_indices[only]] = val[only] + mask |= mask[recip_indices] + # Arbitrarily choose to use value from (j > i) edge + mask = src_indices < dst_indices + left_idx = cp.nonzero(mask)[0] + right_idx = recip_indices[mask] + for val in edge_values.values(): + val[left_idx] = val[right_idx] + else: + edge_values = {} + edge_masks = {} + + node_values = self.node_values + node_masks = self.node_masks + key_to_id = self.key_to_id + id_to_key = None if key_to_id is None else self._id_to_key + if not as_view: + node_values = {key: val.copy() for key, val in node_values.items()} + node_masks = {key: val.copy() for key, val in node_masks.items()} + if key_to_id is not None: + key_to_id = key_to_id.copy() + if id_to_key is not None: + id_to_key = id_to_key.copy() + rv = self.to_undirected_class().from_coo( + N, + src_indices, + dst_indices, + edge_values, + edge_masks, + node_values, + node_masks, + key_to_id=key_to_id, + id_to_key=id_to_key, + ) + if as_view: + rv.graph = self.graph + else: + rv.graph.update(deepcopy(self.graph)) + return rv + # Many more methods to implement... ################### diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 251e92b70..45f81ad11 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -531,7 +531,7 @@ def to_directed(self, as_view: bool = False) -> nxcg.DiGraph: @networkx_api def to_undirected(self, as_view: bool = False) -> Graph: # Does deep copy in networkx - return self.copy(as_view) + return self._copy(as_view, self.to_undirected_class()) # Not implemented... # adj, adjacency, add_edge, add_edges_from, add_node, @@ -742,6 +742,11 @@ def _degrees_array(self): _out_degrees_array = _degrees_array # Data conversions + def _nodekeys_to_nodearray(self, nodes: Iterable[NodeKey]) -> cp.array[IndexValue]: + if self.key_to_id is None: + return cp.fromiter(nodes, dtype=index_dtype) + return cp.fromiter(map(self.key_to_id.__getitem__, nodes), dtype=index_dtype) + def _nodeiter_to_iter(self, node_ids: Iterable[IndexValue]) -> Iterable[NodeKey]: """Convert an iterable of node IDs to an iterable of node keys.""" if (id_to_key := self.id_to_key) is not None: diff --git a/python/nx-cugraph/nx_cugraph/classes/multidigraph.py b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py index 2c7bfc007..2e7a55a9e 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multidigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multidigraph.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -33,3 +33,11 @@ def is_directed(cls) -> bool: @classmethod def to_networkx_class(cls) -> type[nx.MultiDiGraph]: return nx.MultiDiGraph + + ########################## + # NetworkX graph methods # + ########################## + + @networkx_api + def to_undirected(self, reciprocal=False, as_view=False): + raise NotImplementedError diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py index 23466dc7d..fb787369e 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -399,7 +399,7 @@ def to_directed(self, as_view: bool = False) -> nxcg.MultiDiGraph: @networkx_api def to_undirected(self, as_view: bool = False) -> MultiGraph: # Does deep copy in networkx - return self.copy(as_view) + return self._copy(as_view, self.to_undirected_class()) ################### # Private methods # diff --git a/python/nx-cugraph/nx_cugraph/tests/test_generators.py b/python/nx-cugraph/nx_cugraph/tests/test_generators.py index 511f8dcd8..c751b0fe2 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_generators.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_generators.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -17,30 +17,9 @@ import nx_cugraph as nxcg -nxver = parse(nx.__version__) - +from .testing_utils import assert_graphs_equal -def assert_graphs_equal(Gnx, Gcg): - assert isinstance(Gnx, nx.Graph) - assert isinstance(Gcg, nxcg.Graph) - assert Gnx.number_of_nodes() == Gcg.number_of_nodes() - assert Gnx.number_of_edges() == Gcg.number_of_edges() - assert Gnx.is_directed() == Gcg.is_directed() - assert Gnx.is_multigraph() == Gcg.is_multigraph() - G = nxcg.to_networkx(Gcg) - rv = nx.utils.graphs_equal(G, Gnx) - if not rv: - print("GRAPHS ARE NOT EQUAL!") - assert sorted(G) == sorted(Gnx) - assert sorted(G._adj) == sorted(Gnx._adj) - assert sorted(G._node) == sorted(Gnx._node) - for k in sorted(G._adj): - print(k, sorted(G._adj[k]), sorted(Gnx._adj[k])) - print(nx.to_scipy_sparse_array(G).todense()) - print(nx.to_scipy_sparse_array(Gnx).todense()) - print(G.graph) - print(Gnx.graph) - assert rv +nxver = parse(nx.__version__) if nxver.major == 3 and nxver.minor < 2: diff --git a/python/nx-cugraph/nx_cugraph/tests/test_graph_methods.py b/python/nx-cugraph/nx_cugraph/tests/test_graph_methods.py new file mode 100644 index 000000000..3120995a2 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_graph_methods.py @@ -0,0 +1,67 @@ +# Copyright (c) 2023-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 +# +# 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. +import networkx as nx +import pytest + +import nx_cugraph as nxcg + +from .testing_utils import assert_graphs_equal + + +def _create_Gs(): + rv = [] + rv.append(nx.DiGraph()) + G = nx.DiGraph() + G.add_edge(0, 1) + G.add_edge(1, 0) + rv.append(G) + G = G.copy() + G.add_edge(0, 2) + rv.append(G) + G = G.copy() + G.add_edge(1, 1) + rv.append(G) + G = nx.DiGraph() + G.add_edge(0, 1, x=1, y=2) + G.add_edge(1, 0, x=10, z=3) + rv.append(G) + G = G.copy() + G.add_edge(0, 2, a=42) + rv.append(G) + G = G.copy() + G.add_edge(1, 1, a=4) + rv.append(G) + return rv + + +@pytest.mark.parametrize("Gnx", _create_Gs()) +@pytest.mark.parametrize("reciprocal", [False, True]) +def test_to_undirected_directed(Gnx, reciprocal): + Gcg = nxcg.DiGraph(Gnx) + assert_graphs_equal(Gnx, Gcg) + Hnx1 = Gnx.to_undirected(reciprocal=reciprocal) + Hcg1 = Gcg.to_undirected(reciprocal=reciprocal) + assert_graphs_equal(Hnx1, Hcg1) + Hnx2 = Hnx1.to_directed() + Hcg2 = Hcg1.to_directed() + assert_graphs_equal(Hnx2, Hcg2) + + +def test_multidigraph_to_undirected(): + Gnx = nx.MultiDiGraph() + Gnx.add_edge(0, 1) + Gnx.add_edge(0, 1) + Gnx.add_edge(1, 0) + Gcg = nxcg.MultiDiGraph(Gnx) + with pytest.raises(NotImplementedError): + Gcg.to_undirected() diff --git a/python/nx-cugraph/nx_cugraph/tests/testing_utils.py b/python/nx-cugraph/nx_cugraph/tests/testing_utils.py new file mode 100644 index 000000000..6d4741c9c --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/testing_utils.py @@ -0,0 +1,38 @@ +# Copyright (c) 2023-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 +# +# 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. +import networkx as nx + +import nx_cugraph as nxcg + + +def assert_graphs_equal(Gnx, Gcg): + assert isinstance(Gnx, nx.Graph) + assert isinstance(Gcg, nxcg.Graph) + assert Gnx.number_of_nodes() == Gcg.number_of_nodes() + assert Gnx.number_of_edges() == Gcg.number_of_edges() + assert Gnx.is_directed() == Gcg.is_directed() + assert Gnx.is_multigraph() == Gcg.is_multigraph() + G = nxcg.to_networkx(Gcg) + rv = nx.utils.graphs_equal(G, Gnx) + if not rv: + print("GRAPHS ARE NOT EQUAL!") + assert sorted(G) == sorted(Gnx) + assert sorted(G._adj) == sorted(Gnx._adj) + assert sorted(G._node) == sorted(Gnx._node) + for k in sorted(G._adj): + print(k, sorted(G._adj[k]), sorted(Gnx._adj[k])) + print(nx.to_scipy_sparse_array(G).todense()) + print(nx.to_scipy_sparse_array(Gnx).todense()) + print(G.graph) + print(Gnx.graph) + assert rv From 76cb77ff60d0d8a80feffb2cf11b33ad4fc24665 Mon Sep 17 00:00:00 2001 From: Ray Douglass Date: Thu, 18 Jan 2024 14:59:02 -0500 Subject: [PATCH 305/384] DOC v24.04 Updates [skip ci] --- VERSION | 2 +- docs/cugraph/source/conf.py | 4 ++-- python/nx-cugraph/_nx_cugraph/__init__.py | 4 ++-- python/nx-cugraph/pyproject.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index 3c6c5e2b7..4a2fe8aa5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -24.02.00 +24.04.00 diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index cef06a584..141e14a04 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -77,9 +77,9 @@ # built documents. # # The short X.Y version. -version = '24.02' +version = '24.04' # The full version, including alpha/beta/rc tags. -release = '24.02.00' +release = '24.04.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 69320e6b5..3e30bb451 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -24,7 +24,7 @@ "backend_name": "cugraph", "project": "nx-cugraph", "package": "nx_cugraph", - "url": "https://github.com/rapidsai/cugraph/tree/branch-24.02/python/nx-cugraph", + "url": "https://github.com/rapidsai/cugraph/tree/branch-24.04/python/nx-cugraph", "short_summary": "GPU-accelerated backend.", # "description": "TODO", "functions": { @@ -182,7 +182,7 @@ def get_info(): # FIXME: can this use the standard VERSION file and update mechanism? -__version__ = "24.02.00" +__version__ = "24.04.00" if __name__ == "__main__": from pathlib import Path diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 63ac11591..a7525530a 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "cupy-cuda11x>=12.0.0", "networkx>=3.0", "numpy>=1.21", - "pylibcugraph==24.2.*", + "pylibcugraph==24.4.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. [project.optional-dependencies] From 7557a948e47a70196e71fa676d7265ffcb2fc487 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Fri, 19 Jan 2024 09:15:36 -0600 Subject: [PATCH 306/384] nx-cugraph: add triangles and clustering algorithms (#4093) NetworkX tests are somewhat underspecified regarding how to handle self-loops for these algorithms. Also, I'm not sure if transitivity is supposed to work on directed graphs. Once #4071 is merged, it should be easy to add `is_bipartite` function (and maybe others?). Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4093 --- python/nx-cugraph/_nx_cugraph/__init__.py | 8 ++ .../nx_cugraph/algorithms/__init__.py | 4 +- .../algorithms/bipartite/__init__.py | 3 +- .../nx_cugraph/algorithms/bipartite/basic.py | 31 ++++ .../nx_cugraph/algorithms/cluster.py | 136 ++++++++++++++++++ .../nx-cugraph/nx_cugraph/classes/digraph.py | 18 ++- python/nx-cugraph/nx_cugraph/classes/graph.py | 13 +- .../nx_cugraph/tests/test_cluster.py | 48 +++++++ 8 files changed, 251 insertions(+), 10 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/cluster.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_cluster.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 69320e6b5..5bfbf082c 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -30,6 +30,7 @@ "functions": { # BEGIN: functions "ancestors", + "average_clustering", "barbell_graph", "betweenness_centrality", "bfs_edges", @@ -41,6 +42,7 @@ "caveman_graph", "chvatal_graph", "circular_ladder_graph", + "clustering", "complete_bipartite_graph", "complete_graph", "complete_multipartite_graph", @@ -68,6 +70,7 @@ "house_x_graph", "icosahedral_graph", "in_degree_centrality", + "is_bipartite", "is_connected", "is_isolate", "is_strongly_connected", @@ -104,6 +107,8 @@ "strongly_connected_components", "tadpole_graph", "tetrahedral_graph", + "transitivity", + "triangles", "trivial_graph", "truncated_cube_graph", "truncated_tetrahedron_graph", @@ -115,11 +120,13 @@ }, "extra_docstrings": { # BEGIN: extra_docstrings + "average_clustering": "Directed graphs and `weight` parameter are not yet supported.", "betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "bfs_edges": "`sort_neighbors` parameter is not yet supported.", "bfs_predecessors": "`sort_neighbors` parameter is not yet supported.", "bfs_successors": "`sort_neighbors` parameter is not yet supported.", "bfs_tree": "`sort_neighbors` parameter is not yet supported.", + "clustering": "Directed graphs and `weight` parameter are not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.", "from_pandas_edgelist": "cudf.DataFrame inputs also supported; value columns with str is unsuppported.", @@ -131,6 +138,7 @@ "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.", "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.", "pagerank": "`dangling` parameter is not supported, but it is checked for validity.", + "transitivity": "Directed graphs are not yet supported.", # END: extra_docstrings }, "extra_parameters": { diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 65700838f..de4e9466b 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -13,14 +13,16 @@ from . import ( bipartite, centrality, + cluster, community, components, link_analysis, shortest_paths, traversal, ) -from .bipartite import complete_bipartite_graph +from .bipartite import complete_bipartite_graph, is_bipartite from .centrality import * +from .cluster import * from .components import * from .core import * from .dag import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py index 062be973d..e028299c6 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -10,4 +10,5 @@ # 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. +from .basic import * from .generators import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py new file mode 100644 index 000000000..d0e9a5c7f --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py @@ -0,0 +1,31 @@ +# Copyright (c) 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 +# +# 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. +import cupy as cp + +from nx_cugraph.algorithms.cluster import _triangles +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import networkx_algorithm + +__all__ = [ + "is_bipartite", +] + + +@networkx_algorithm(plc="triangle_count", version_added="24.02") +def is_bipartite(G): + G = _to_graph(G) + # Counting triangles may not be the fastest way to do this, but it is simple. + node_ids, triangles, is_single_node = _triangles( + G, None, symmetrize="union" if G.is_directed() else None + ) + return int(cp.count_nonzero(triangles)) == 0 diff --git a/python/nx-cugraph/nx_cugraph/algorithms/cluster.py b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py new file mode 100644 index 000000000..951c358ff --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py @@ -0,0 +1,136 @@ +# Copyright (c) 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 +# +# 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. +import cupy as cp +import pylibcugraph as plc + +from nx_cugraph.convert import _to_undirected_graph +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +__all__ = [ + "triangles", + "average_clustering", + "clustering", + "transitivity", +] + + +def _triangles(G, nodes, symmetrize=None): + if nodes is not None: + if is_single_node := (nodes in G): + nodes = [nodes if G.key_to_id is None else G.key_to_id[nodes]] + else: + nodes = list(nodes) + nodes = G._list_to_nodearray(nodes) + else: + is_single_node = False + if len(G) == 0: + return None, None, is_single_node + node_ids, triangles = plc.triangle_count( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(symmetrize=symmetrize), + start_list=nodes, + do_expensive_check=False, + ) + return node_ids, triangles, is_single_node + + +@not_implemented_for("directed") +@networkx_algorithm(plc="triangle_count", version_added="24.02") +def triangles(G, nodes=None): + G = _to_undirected_graph(G) + node_ids, triangles, is_single_node = _triangles(G, nodes) + if len(G) == 0: + return {} + if is_single_node: + return int(triangles[0]) + return G._nodearrays_to_dict(node_ids, triangles) + + +@not_implemented_for("directed") +@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +def clustering(G, nodes=None, weight=None): + """Directed graphs and `weight` parameter are not yet supported.""" + G = _to_undirected_graph(G) + node_ids, triangles, is_single_node = _triangles(G, nodes) + if len(G) == 0: + return {} + if is_single_node: + numer = int(triangles[0]) + if numer == 0: + return 0 + degree = int((G.src_indices == nodes).sum()) + return 2 * numer / (degree * (degree - 1)) + degrees = G._degrees_array(ignore_selfloops=True)[node_ids] + denom = degrees * (degrees - 1) + results = 2 * triangles / denom + results = cp.where(denom, results, 0) # 0 where we divided by 0 + return G._nodearrays_to_dict(node_ids, results) + + +@clustering._can_run +def _(G, nodes=None, weight=None): + return weight is None and not G.is_directed() + + +@not_implemented_for("directed") +@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +def average_clustering(G, nodes=None, weight=None, count_zeros=True): + """Directed graphs and `weight` parameter are not yet supported.""" + G = _to_undirected_graph(G) + node_ids, triangles, is_single_node = _triangles(G, nodes) + if len(G) == 0: + raise ZeroDivisionError + degrees = G._degrees_array(ignore_selfloops=True)[node_ids] + if not count_zeros: + mask = triangles != 0 + triangles = triangles[mask] + if triangles.size == 0: + raise ZeroDivisionError + degrees = degrees[mask] + denom = degrees * (degrees - 1) + results = 2 * triangles / denom + if count_zeros: + results = cp.where(denom, results, 0) # 0 where we divided by 0 + return float(results.mean()) + + +@average_clustering._can_run +def _(G, nodes=None, weight=None, count_zeros=True): + return weight is None and not G.is_directed() + + +@not_implemented_for("directed") +@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +def transitivity(G): + """Directed graphs are not yet supported.""" + G = _to_undirected_graph(G) + if len(G) == 0: + return 0 + node_ids, triangles = plc.triangle_count( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + start_list=None, + do_expensive_check=False, + ) + numer = int(triangles.sum()) + if numer == 0: + return 0 + degrees = G._degrees_array(ignore_selfloops=True)[node_ids] + denom = int((degrees * (degrees - 1)).sum()) + return 2 * numer / denom + + +@transitivity._can_run +def _(G): + # Is transitivity supposed to work on directed graphs? + return not G.is_directed() diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index 3392f3362..f8217a2c7 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -177,8 +177,16 @@ def to_undirected(self, reciprocal=False, as_view=False): # Private methods # ################### - def _in_degrees_array(self): - return cp.bincount(self.dst_indices, minlength=self._N) - - def _out_degrees_array(self): - return cp.bincount(self.src_indices, minlength=self._N) + def _in_degrees_array(self, *, ignore_selfloops=False): + dst_indices = self.dst_indices + if ignore_selfloops: + not_selfloops = self.src_indices != dst_indices + dst_indices = dst_indices[not_selfloops] + return cp.bincount(dst_indices, minlength=self._N) + + def _out_degrees_array(self, *, ignore_selfloops=False): + src_indices = self.src_indices + if ignore_selfloops: + not_selfloops = src_indices != self.dst_indices + src_indices = src_indices[not_selfloops] + return cp.bincount(src_indices, minlength=self._N) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 45f81ad11..4aa2de153 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -732,10 +732,17 @@ def _become(self, other: Graph): self.graph = graph return self - def _degrees_array(self): - degrees = cp.bincount(self.src_indices, minlength=self._N) + def _degrees_array(self, *, ignore_selfloops=False): + src_indices = self.src_indices + dst_indices = self.dst_indices + if ignore_selfloops: + not_selfloops = src_indices != dst_indices + src_indices = src_indices[not_selfloops] + if self.is_directed(): + dst_indices = dst_indices[not_selfloops] + degrees = cp.bincount(src_indices, minlength=self._N) if self.is_directed(): - degrees += cp.bincount(self.dst_indices, minlength=self._N) + degrees += cp.bincount(dst_indices, minlength=self._N) return degrees _in_degrees_array = _degrees_array diff --git a/python/nx-cugraph/nx_cugraph/tests/test_cluster.py b/python/nx-cugraph/nx_cugraph/tests/test_cluster.py new file mode 100644 index 000000000..ad4770f1a --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_cluster.py @@ -0,0 +1,48 @@ +# Copyright (c) 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 +# +# 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. +import networkx as nx +import pytest +from packaging.version import parse + +nxver = parse(nx.__version__) + +if nxver.major == 3 and nxver.minor < 2: + pytest.skip("Need NetworkX >=3.2 to test clustering", allow_module_level=True) + + +def test_selfloops(): + G = nx.complete_graph(5) + H = nx.complete_graph(5) + H.add_edge(0, 0) + H.add_edge(1, 1) + H.add_edge(2, 2) + # triangles + expected = nx.triangles(G) + assert expected == nx.triangles(H) + assert expected == nx.triangles(G, backend="cugraph") + assert expected == nx.triangles(H, backend="cugraph") + # average_clustering + expected = nx.average_clustering(G) + assert expected == nx.average_clustering(H) + assert expected == nx.average_clustering(G, backend="cugraph") + assert expected == nx.average_clustering(H, backend="cugraph") + # clustering + expected = nx.clustering(G) + assert expected == nx.clustering(H) + assert expected == nx.clustering(G, backend="cugraph") + assert expected == nx.clustering(H, backend="cugraph") + # transitivity + expected = nx.transitivity(G) + assert expected == nx.transitivity(H) + assert expected == nx.transitivity(G, backend="cugraph") + assert expected == nx.transitivity(H, backend="cugraph") From a176b44ffc5ee811f7d67501b0b2aa8b79121354 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Fri, 19 Jan 2024 12:46:12 -0600 Subject: [PATCH 307/384] nx-cugraph: add `core_number` (undirected graphs only) (#4100) Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4100 --- python/nx-cugraph/_nx_cugraph/__init__.py | 2 ++ .../nx-cugraph/nx_cugraph/algorithms/core.py | 30 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 5bfbf082c..8deac55f4 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -47,6 +47,7 @@ "complete_graph", "complete_multipartite_graph", "connected_components", + "core_number", "cubical_graph", "cycle_graph", "davis_southern_women_graph", @@ -127,6 +128,7 @@ "bfs_successors": "`sort_neighbors` parameter is not yet supported.", "bfs_tree": "`sort_neighbors` parameter is not yet supported.", "clustering": "Directed graphs and `weight` parameter are not yet supported.", + "core_number": "Directed graphs are not yet supported.", "edge_betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.", "from_pandas_edgelist": "cudf.DataFrame inputs also supported; value columns with str is unsuppported.", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index e4520c271..f323cdf60 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -15,6 +15,7 @@ import pylibcugraph as plc import nx_cugraph as nxcg +from nx_cugraph.convert import _to_undirected_graph from nx_cugraph.utils import ( _get_int_dtype, index_dtype, @@ -22,7 +23,34 @@ not_implemented_for, ) -__all__ = ["k_truss"] +__all__ = ["core_number", "k_truss"] + + +@not_implemented_for("directed") +@not_implemented_for("multigraph") +@networkx_algorithm(is_incomplete=True, plc="core_number", version_added="24.02") +def core_number(G): + """Directed graphs are not yet supported.""" + G = _to_undirected_graph(G) + if len(G) == 0: + return {} + if nxcg.number_of_selfloops(G) > 0: + raise nx.NetworkXNotImplemented( + "Input graph has self loops which is not permitted; " + "Consider using G.remove_edges_from(nx.selfloop_edges(G))." + ) + node_ids, core_numbers = plc.core_number( + resource_handle=plc.ResourceHandle(), + graph=G._get_plc_graph(), + degree_type="bidirectional", + do_expensive_check=False, + ) + return G._nodearrays_to_dict(node_ids, core_numbers) + + +@core_number._can_run +def _(G): + return not G.is_directed() @not_implemented_for("directed") From 1252999bbb190683b17b6c095aac2c15ae51d237 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Mon, 22 Jan 2024 10:31:48 -0600 Subject: [PATCH 308/384] nx-cugraph: add `is_tree`, etc. (#4097) These are now possible b/c we have `connected_components` and `weakly_connected_components` (and their `is_*` equivalents). Authors: - Erik Welch (https://github.com/eriknw) - Rick Ratzel (https://github.com/rlratzel) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4097 --- python/nx-cugraph/_nx_cugraph/__init__.py | 4 + .../nx_cugraph/algorithms/__init__.py | 2 + .../nx_cugraph/algorithms/isolate.py | 2 +- .../nx_cugraph/algorithms/tree/__init__.py | 13 ++++ .../nx_cugraph/algorithms/tree/recognition.py | 74 +++++++++++++++++++ .../nx-cugraph/nx_cugraph/classes/digraph.py | 12 +-- .../nx-cugraph/nx_cugraph/classes/function.py | 4 +- python/nx-cugraph/nx_cugraph/classes/graph.py | 4 +- 8 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/tree/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 8deac55f4..9bca031a2 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -71,10 +71,14 @@ "house_x_graph", "icosahedral_graph", "in_degree_centrality", + "is_arborescence", "is_bipartite", + "is_branching", "is_connected", + "is_forest", "is_isolate", "is_strongly_connected", + "is_tree", "is_weakly_connected", "isolates", "k_truss", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index de4e9466b..08658ad94 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -19,6 +19,7 @@ link_analysis, shortest_paths, traversal, + tree, ) from .bipartite import complete_bipartite_graph, is_bipartite from .centrality import * @@ -31,3 +32,4 @@ from .reciprocity import * from .shortest_paths import * from .traversal import * +from .tree.recognition import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py index 62b47a9b3..9621fbeaa 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py @@ -70,4 +70,4 @@ def isolates(G): @networkx_algorithm(version_added="23.10") def number_of_isolates(G): G = _to_graph(G) - return _mark_isolates(G).sum().tolist() + return int(cp.count_nonzero(_mark_isolates(G))) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/tree/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/tree/__init__.py new file mode 100644 index 000000000..91bf72417 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/tree/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 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 +# +# 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. +from .recognition import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py b/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py new file mode 100644 index 000000000..0b82f079d --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py @@ -0,0 +1,74 @@ +# Copyright (c) 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 +# +# 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. +import cupy as cp +import networkx as nx + +import nx_cugraph as nxcg +from nx_cugraph.convert import _to_directed_graph, _to_graph +from nx_cugraph.utils import networkx_algorithm, not_implemented_for + +__all__ = ["is_arborescence", "is_branching", "is_forest", "is_tree"] + + +@not_implemented_for("undirected") +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def is_arborescence(G): + G = _to_directed_graph(G) + return is_tree(G) and int(G._in_degrees_array().max()) <= 1 + + +@not_implemented_for("undirected") +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def is_branching(G): + G = _to_directed_graph(G) + return is_forest(G) and int(G._in_degrees_array().max()) <= 1 + + +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def is_forest(G): + G = _to_graph(G) + if len(G) == 0: + raise nx.NetworkXPointlessConcept("G has no nodes.") + if is_directed := G.is_directed(): + connected_components = nxcg.weakly_connected_components + else: + connected_components = nxcg.connected_components + for components in connected_components(G): + node_ids = G._list_to_nodearray(list(components)) + # TODO: create utilities for creating subgraphs + mask = cp.isin(G.src_indices, node_ids) & cp.isin(G.dst_indices, node_ids) + # A tree must have an edge count equal to the number of nodes minus the + # tree's root node. + if is_directed: + if int(cp.count_nonzero(mask)) != len(components) - 1: + return False + else: + src_indices = G.src_indices[mask] + dst_indices = G.dst_indices[mask] + if int(cp.count_nonzero(src_indices <= dst_indices)) != len(components) - 1: + return False + return True + + +@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +def is_tree(G): + G = _to_graph(G) + if len(G) == 0: + raise nx.NetworkXPointlessConcept("G has no nodes.") + if G.is_directed(): + is_connected = nxcg.is_weakly_connected + else: + is_connected = nxcg.is_connected + # A tree must have an edge count equal to the number of nodes minus the + # tree's root node. + return len(G) - 1 == G.number_of_edges() and is_connected(G) diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index f8217a2c7..169815eb0 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -25,7 +25,7 @@ from .graph import Graph if TYPE_CHECKING: # pragma: no cover - from nx_cugraph.typing import NodeKey + from nx_cugraph.typing import AttrKey __all__ = ["DiGraph"] @@ -47,10 +47,8 @@ def to_networkx_class(cls) -> type[nx.DiGraph]: return nx.DiGraph @networkx_api - def number_of_edges( - self, u: NodeKey | None = None, v: NodeKey | None = None - ) -> int: - if u is not None or v is not None: + def size(self, weight: AttrKey | None = None) -> int: + if weight is not None: raise NotImplementedError return self.src_indices.size @@ -182,6 +180,8 @@ def _in_degrees_array(self, *, ignore_selfloops=False): if ignore_selfloops: not_selfloops = self.src_indices != dst_indices dst_indices = dst_indices[not_selfloops] + if dst_indices.size == 0: + return cp.zeros(self._N, dtype=np.int64) return cp.bincount(dst_indices, minlength=self._N) def _out_degrees_array(self, *, ignore_selfloops=False): @@ -189,4 +189,6 @@ def _out_degrees_array(self, *, ignore_selfloops=False): if ignore_selfloops: not_selfloops = src_indices != self.dst_indices src_indices = src_indices[not_selfloops] + if src_indices.size == 0: + return cp.zeros(self._N, dtype=np.int64) return cp.bincount(src_indices, minlength=self._N) diff --git a/python/nx-cugraph/nx_cugraph/classes/function.py b/python/nx-cugraph/nx_cugraph/classes/function.py index 435dfe372..7212a4d2d 100644 --- a/python/nx-cugraph/nx_cugraph/classes/function.py +++ b/python/nx-cugraph/nx_cugraph/classes/function.py @@ -10,6 +10,8 @@ # 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. +import cupy as cp + from nx_cugraph.convert import _to_graph from nx_cugraph.utils import networkx_algorithm @@ -20,4 +22,4 @@ def number_of_selfloops(G): G = _to_graph(G) is_selfloop = G.src_indices == G.dst_indices - return is_selfloop.sum().tolist() + return int(cp.count_nonzero(is_selfloop)) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 4aa2de153..f69766875 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -522,7 +522,7 @@ def size(self, weight: AttrKey | None = None) -> int: if weight is not None: raise NotImplementedError # If no self-edges, then `self.src_indices.size // 2` - return int((self.src_indices <= self.dst_indices).sum()) + return int(cp.count_nonzero(self.src_indices <= self.dst_indices)) @networkx_api def to_directed(self, as_view: bool = False) -> nxcg.DiGraph: @@ -740,6 +740,8 @@ def _degrees_array(self, *, ignore_selfloops=False): src_indices = src_indices[not_selfloops] if self.is_directed(): dst_indices = dst_indices[not_selfloops] + if src_indices.size == 0: + return cp.zeros(self._N, dtype=np.int64) degrees = cp.bincount(src_indices, minlength=self._N) if self.is_directed(): degrees += cp.bincount(dst_indices, minlength=self._N) From 14d04e37f6845a3b2ab9dc3b24e922ffeb3c6236 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 24 Jan 2024 16:54:30 -0600 Subject: [PATCH 309/384] nx-cugraph: rename `plc=` to `_plc=` (#4106) As discussed here: https://github.com/rapidsai/cugraph/pull/4093#discussion_r1458012713 Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4106 --- python/nx-cugraph/lint.yaml | 6 +-- .../nx_cugraph/algorithms/bipartite/basic.py | 2 +- .../algorithms/centrality/betweenness.py | 4 +- .../algorithms/centrality/eigenvector.py | 2 +- .../nx_cugraph/algorithms/centrality/katz.py | 2 +- .../nx_cugraph/algorithms/cluster.py | 16 ++++++-- .../algorithms/community/louvain.py | 2 +- .../algorithms/components/connected.py | 13 +++---- .../components/strongly_connected.py | 6 +-- .../algorithms/components/weakly_connected.py | 6 +-- .../nx-cugraph/nx_cugraph/algorithms/core.py | 4 +- .../nx-cugraph/nx_cugraph/algorithms/dag.py | 4 +- .../algorithms/link_analysis/hits_alg.py | 2 +- .../algorithms/link_analysis/pagerank_alg.py | 2 +- .../algorithms/shortest_paths/unweighted.py | 4 +- .../traversal/breadth_first_search.py | 38 +++++++++++++++---- .../nx_cugraph/algorithms/tree/recognition.py | 8 ++-- .../nx-cugraph/nx_cugraph/utils/decorators.py | 16 ++++---- 18 files changed, 84 insertions(+), 53 deletions(-) diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 0d4f0b594..5a4773168 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -50,7 +50,7 @@ repos: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.13 + rev: v0.1.14 hooks: - id: ruff args: [--fix-only, --show-fixes] # --unsafe-fixes] @@ -62,7 +62,7 @@ repos: additional_dependencies: &flake8_dependencies # These versions need updated manually - flake8==7.0.0 - - flake8-bugbear==23.12.2 + - flake8-bugbear==24.1.17 - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa rev: v1.5.0 @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.13 + rev: v0.1.14 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py index d0e9a5c7f..46c6b5407 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py @@ -21,7 +21,7 @@ ] -@networkx_algorithm(plc="triangle_count", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="triangle_count") def is_bipartite(G): G = _to_graph(G) # Counting triangles may not be the fastest way to do this, but it is simple. diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py index ba2b3d9c8..f6bb142cd 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/betweenness.py @@ -21,8 +21,8 @@ @networkx_algorithm( is_incomplete=True, # weight not supported is_different=True, # RNG with seed is different - plc="betweenness_centrality", version_added="23.10", + _plc="betweenness_centrality", ) def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None @@ -54,8 +54,8 @@ def _(G, k=None, normalized=True, weight=None, endpoints=False, seed=None): @networkx_algorithm( is_incomplete=True, # weight not supported is_different=True, # RNG with seed is different - plc="edge_betweenness_centrality", version_added="23.10", + _plc="edge_betweenness_centrality", ) def edge_betweenness_centrality(G, k=None, normalized=True, weight=None, seed=None): """`weight` parameter is not yet supported, and RNG with seed may be different.""" diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py index 9e615955a..65a863366 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py @@ -29,8 +29,8 @@ @networkx_algorithm( extra_params=_dtype_param, is_incomplete=True, # nstart not supported - plc="eigenvector_centrality", version_added="23.12", + _plc="eigenvector_centrality", ) def eigenvector_centrality( G, max_iter=100, tol=1.0e-6, nstart=None, weight=None, *, dtype=None diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py index a2fb950c1..4a0684f72 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py @@ -29,8 +29,8 @@ @networkx_algorithm( extra_params=_dtype_param, is_incomplete=True, # nstart and normalized=False not supported - plc="katz_centrality", version_added="23.12", + _plc="katz_centrality", ) def katz_centrality( G, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/cluster.py b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py index 951c358ff..a458e6c04 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/cluster.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py @@ -45,7 +45,7 @@ def _triangles(G, nodes, symmetrize=None): @not_implemented_for("directed") -@networkx_algorithm(plc="triangle_count", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="triangle_count") def triangles(G, nodes=None): G = _to_undirected_graph(G) node_ids, triangles, is_single_node = _triangles(G, nodes) @@ -57,9 +57,13 @@ def triangles(G, nodes=None): @not_implemented_for("directed") -@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="triangle_count") def clustering(G, nodes=None, weight=None): """Directed graphs and `weight` parameter are not yet supported.""" + if weight is not None: + raise NotImplementedError( + "Weighted implementation of clustering not currently supported" + ) G = _to_undirected_graph(G) node_ids, triangles, is_single_node = _triangles(G, nodes) if len(G) == 0: @@ -83,9 +87,13 @@ def _(G, nodes=None, weight=None): @not_implemented_for("directed") -@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="triangle_count") def average_clustering(G, nodes=None, weight=None, count_zeros=True): """Directed graphs and `weight` parameter are not yet supported.""" + if weight is not None: + raise NotImplementedError( + "Weighted implementation of average_clustering not currently supported" + ) G = _to_undirected_graph(G) node_ids, triangles, is_single_node = _triangles(G, nodes) if len(G) == 0: @@ -110,7 +118,7 @@ def _(G, nodes=None, weight=None, count_zeros=True): @not_implemented_for("directed") -@networkx_algorithm(is_incomplete=True, plc="triangle_count", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="triangle_count") def transitivity(G): """Directed graphs are not yet supported.""" G = _to_undirected_graph(G) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index 413ff9ca5..f58f1000f 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -36,8 +36,8 @@ }, is_incomplete=True, # seed not supported; self-loops not supported is_different=True, # RNG different - plc="louvain", version_added="23.10", + _plc="louvain", ) def louvain_communities( G, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py index cdb9f54f6..24955e3ea 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/connected.py @@ -26,7 +26,7 @@ @not_implemented_for("directed") -@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="weakly_connected_components") def number_connected_components(G): G = _to_undirected_graph(G) return _number_connected_components(G) @@ -50,14 +50,11 @@ def _number_connected_components(G, symmetrize=None): @number_connected_components._can_run def _(G): # NetworkX <= 3.2.1 does not check directedness for us - try: - return not G.is_directed() - except Exception: - return False + return not G.is_directed() @not_implemented_for("directed") -@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="weakly_connected_components") def connected_components(G): G = _to_undirected_graph(G) return _connected_components(G) @@ -80,7 +77,7 @@ def _connected_components(G, symmetrize=None): @not_implemented_for("directed") -@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="weakly_connected_components") def is_connected(G): G = _to_undirected_graph(G) return _is_connected(G) @@ -106,7 +103,7 @@ def _is_connected(G, symmetrize=None): @not_implemented_for("directed") -@networkx_algorithm(plc="weakly_connected_components", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="weakly_connected_components") def node_connected_component(G, n): # We could also do plain BFS from n G = _to_undirected_graph(G) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py index 8fdf99ed5..d17131297 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py @@ -51,7 +51,7 @@ def _strongly_connected_components(G): @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def strongly_connected_components(G): G = _to_directed_graph(G) if G.src_indices.size == 0: @@ -62,7 +62,7 @@ def strongly_connected_components(G): @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def number_strongly_connected_components(G): G = _to_directed_graph(G) if G.src_indices.size == 0: @@ -72,7 +72,7 @@ def number_strongly_connected_components(G): @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", plc="strongly_connected_components") +@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def is_strongly_connected(G): G = _to_directed_graph(G) if len(G) == 0: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py index 5b797b391..e42acdd3d 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/weakly_connected.py @@ -27,21 +27,21 @@ @not_implemented_for("undirected") -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def weakly_connected_components(G): G = _to_directed_graph(G) return _connected_components(G, symmetrize="union") @not_implemented_for("undirected") -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def number_weakly_connected_components(G): G = _to_directed_graph(G) return _number_connected_components(G, symmetrize="union") @not_implemented_for("undirected") -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def is_weakly_connected(G): G = _to_directed_graph(G) return _is_connected(G, symmetrize="union") diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py index f323cdf60..71f61abf4 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/core.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py @@ -28,7 +28,7 @@ @not_implemented_for("directed") @not_implemented_for("multigraph") -@networkx_algorithm(is_incomplete=True, plc="core_number", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="core_number") def core_number(G): """Directed graphs are not yet supported.""" G = _to_undirected_graph(G) @@ -55,7 +55,7 @@ def _(G): @not_implemented_for("directed") @not_implemented_for("multigraph") -@networkx_algorithm(is_incomplete=True, plc="k_truss_subgraph", version_added="23.12") +@networkx_algorithm(is_incomplete=True, version_added="23.12", _plc="k_truss_subgraph") def k_truss(G, k): """ Currently raises `NotImplementedError` for graphs with more than one connected diff --git a/python/nx-cugraph/nx_cugraph/algorithms/dag.py b/python/nx-cugraph/nx_cugraph/algorithms/dag.py index ad5b7594a..64be0a581 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/dag.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/dag.py @@ -45,11 +45,11 @@ def _ancestors_and_descendants(G, source, *, is_ancestors): return G._nodearray_to_set(node_ids[mask]) -@networkx_algorithm(plc="bfs", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="bfs") def descendants(G, source): return _ancestors_and_descendants(G, source, is_ancestors=False) -@networkx_algorithm(plc="bfs", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="bfs") def ancestors(G, source): return _ancestors_and_descendants(G, source, is_ancestors=True) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py index caa01327a..9e723624a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py @@ -33,8 +33,8 @@ ), **_dtype_param, }, - plc="hits", version_added="23.12", + _plc="hits", ) def hits( G, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py index d45d019c1..55fcc3e52 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py @@ -29,8 +29,8 @@ @networkx_algorithm( extra_params=_dtype_param, is_incomplete=True, # dangling not supported - plc={"pagerank", "personalized_pagerank"}, version_added="23.12", + _plc={"pagerank", "personalized_pagerank"}, ) def pagerank( G, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py index b1032a823..201249595 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py @@ -21,12 +21,12 @@ __all__ = ["single_source_shortest_path_length", "single_target_shortest_path_length"] -@networkx_algorithm(plc="bfs", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="bfs") def single_source_shortest_path_length(G, source, cutoff=None): return _single_shortest_path_length(G, source, cutoff, "Source") -@networkx_algorithm(plc="bfs", version_added="23.12") +@networkx_algorithm(version_added="23.12", _plc="bfs") def single_target_shortest_path_length(G, target, cutoff=None): return _single_shortest_path_length(G, target, cutoff, "Target") diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py index aa671bbb7..ef1c01136 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py @@ -57,9 +57,17 @@ def _bfs(G, source, *, depth_limit=None, reverse=False): return distances[mask], predecessors[mask], node_ids[mask] -@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") def generic_bfs_edges(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): """`neighbors` and `sort_neighbors` parameters are not yet supported.""" + if neighbors is not None: + raise NotImplementedError( + "neighbors argument in generic_bfs_edges is not currently supported" + ) + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in generic_bfs_edges is not currently supported" + ) return bfs_edges(source, depth_limit=depth_limit) @@ -68,9 +76,13 @@ def _(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): return neighbors is None and sort_neighbors is None -@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") def bfs_edges(G, source, reverse=False, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in bfs_edges is not currently supported" + ) G = _check_G_and_source(G, source) if depth_limit is not None and depth_limit < 1: return @@ -95,9 +107,13 @@ def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") def bfs_tree(G, source, reverse=False, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in bfs_tree is not currently supported" + ) G = _check_G_and_source(G, source) if depth_limit is not None and depth_limit < 1: return nxcg.DiGraph.from_coo( @@ -149,9 +165,13 @@ def _(G, source, reverse=False, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") def bfs_successors(G, source, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in bfs_successors is not currently supported" + ) G = _check_G_and_source(G, source) if depth_limit is not None and depth_limit < 1: yield (source, []) @@ -173,7 +193,7 @@ def _(G, source, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm(plc="bfs", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="bfs") def bfs_layers(G, sources): G = _to_graph(G) if sources in G: @@ -201,9 +221,13 @@ def bfs_layers(G, sources): return (G._nodearray_to_list(groups[key]) for key in range(len(groups))) -@networkx_algorithm(is_incomplete=True, plc="bfs", version_added="24.02") +@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") def bfs_predecessors(G, source, depth_limit=None, sort_neighbors=None): """`sort_neighbors` parameter is not yet supported.""" + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in bfs_predecessors is not currently supported" + ) G = _check_G_and_source(G, source) if depth_limit is not None and depth_limit < 1: return @@ -227,7 +251,7 @@ def _(G, source, depth_limit=None, sort_neighbors=None): return sort_neighbors is None -@networkx_algorithm(plc="bfs", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="bfs") def descendants_at_distance(G, source, distance): G = _check_G_and_source(G, source) if distance is None or distance < 0: diff --git a/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py b/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py index 0b82f079d..74f57b5ea 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/tree/recognition.py @@ -21,20 +21,20 @@ @not_implemented_for("undirected") -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def is_arborescence(G): G = _to_directed_graph(G) return is_tree(G) and int(G._in_degrees_array().max()) <= 1 @not_implemented_for("undirected") -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def is_branching(G): G = _to_directed_graph(G) return is_forest(G) and int(G._in_degrees_array().max()) <= 1 -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def is_forest(G): G = _to_graph(G) if len(G) == 0: @@ -60,7 +60,7 @@ def is_forest(G): return True -@networkx_algorithm(plc="weakly_connected_components", version_added="24.02") +@networkx_algorithm(version_added="24.02", _plc="weakly_connected_components") def is_tree(G): G = _to_graph(G) if len(G) == 0: diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py index d09a9e961..011ebfd6e 100644 --- a/python/nx-cugraph/nx_cugraph/utils/decorators.py +++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py @@ -59,7 +59,7 @@ def __new__( version_added: str, # Required is_incomplete: bool = False, # See self.extra_doc for details if True is_different: bool = False, # See self.extra_doc for details if True - plc: str | set[str] | None = None, # Hidden from user, may be removed someday + _plc: str | set[str] | None = None, # Hidden from user, may be removed someday ): if func is None: return partial( @@ -67,10 +67,10 @@ def __new__( name=name, extra_params=extra_params, nodes_or_number=nodes_or_number, - plc=plc, version_added=version_added, is_incomplete=is_incomplete, is_different=is_different, + _plc=_plc, ) instance = object.__new__(cls) if nodes_or_number is not None and nx.__version__[:3] > "3.2": @@ -89,12 +89,14 @@ def __new__( f"extra_params must be dict, str, or None; got {type(extra_params)}" ) instance.extra_params = extra_params - if plc is None or isinstance(plc, set): - instance._plc_names = plc - elif isinstance(plc, str): - instance._plc_names = {plc} + if _plc is None or isinstance(_plc, set): + instance._plc_names = _plc + elif isinstance(_plc, str): + instance._plc_names = {_plc} else: - raise TypeError(f"plc argument must be str, set, or None; got {type(plc)}") + raise TypeError( + f"_plc argument must be str, set, or None; got {type(_plc)}" + ) instance.version_added = version_added instance.is_incomplete = is_incomplete instance.is_different = is_different From bb68892338a2bc54b03af76d12c97f70554b8307 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Thu, 25 Jan 2024 14:05:45 -0600 Subject: [PATCH 310/384] nx-cugraph: add `complement` and `reverse` (#4103) We apparently already had `G.reverse()`, which made that function extra easy :) Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4103 --- python/nx-cugraph/_nx_cugraph/__init__.py | 2 + .../nx_cugraph/algorithms/__init__.py | 2 + .../algorithms/operators/__init__.py | 13 +++++ .../nx_cugraph/algorithms/operators/unary.py | 55 +++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/operators/__init__.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 9bca031a2..2f283aa15 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -43,6 +43,7 @@ "chvatal_graph", "circular_ladder_graph", "clustering", + "complement", "complete_bipartite_graph", "complete_graph", "complete_multipartite_graph", @@ -105,6 +106,7 @@ "path_graph", "petersen_graph", "reciprocity", + "reverse", "sedgewick_maze_graph", "single_source_shortest_path_length", "single_target_shortest_path_length", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py index 08658ad94..7aafa85f5 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py @@ -17,6 +17,7 @@ community, components, link_analysis, + operators, shortest_paths, traversal, tree, @@ -29,6 +30,7 @@ from .dag import * from .isolate import * from .link_analysis import * +from .operators import * from .reciprocity import * from .shortest_paths import * from .traversal import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/operators/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/operators/__init__.py new file mode 100644 index 000000000..32fd45f57 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/operators/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 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 +# +# 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. +from .unary import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py b/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py new file mode 100644 index 000000000..08abc9f28 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py @@ -0,0 +1,55 @@ +# Copyright (c) 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 +# +# 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. +import cupy as cp +import networkx as nx +import numpy as np + +import nx_cugraph as nxcg +from nx_cugraph.convert import _to_graph +from nx_cugraph.utils import index_dtype, networkx_algorithm + +__all__ = ["complement", "reverse"] + + +@networkx_algorithm(version_added="24.02") +def complement(G): + G = _to_graph(G) + N = G._N + # Upcast to int64 so indices don't overflow. + edges_a_b = N * G.src_indices.astype(np.int64) + G.dst_indices + # Now compute flattened indices for all edges except self-loops + # Alt (slower): + # edges_full = np.arange(N * N) + # edges_full = edges_full[(edges_full % (N + 1)).astype(bool)] + edges_full = cp.arange(1, N * (N - 1) + 1) + cp.repeat(cp.arange(N - 1), N) + edges_comp = cp.setdiff1d( + edges_full, + edges_a_b, + assume_unique=not G.is_multigraph(), + ) + src_indices, dst_indices = cp.divmod(edges_comp, N) + return G.__class__.from_coo( + N, + src_indices.astype(index_dtype), + dst_indices.astype(index_dtype), + key_to_id=G.key_to_id, + ) + + +@networkx_algorithm(version_added="24.02") +def reverse(G, copy=True): + if not G.is_directed(): + raise nx.NetworkXError("Cannot reverse an undirected graph.") + if isinstance(G, nx.Graph): + G = nxcg.from_networkx(G, preserve_all_attrs=True) + return G.reverse(copy=copy) From 0aa3579a6b8794ef1253ea839a7ed9ab06ffc989 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:14:49 -0600 Subject: [PATCH 311/384] Adds option to rapids_cpm_find for raft to disable hnswlib feature, adds updates for pytest 8 compat, temporarily skips IO intensive test in CI (#4121) * Adds option to rapids_cpm_find for raft to disable hnswlib feature, which is not needed by cugraph. This resolves cmake failures such as the following: ``` CMake Error at /home/coder/cugraph/cpp/build/release/_deps/raft-build/raft-targets.cmake:56 (set_target_properties): The link interface of target "raft::raft" contains: hnswlib::hnswlib but the target was not found. ``` * TEMPORARILY skips bulk sampling IO tests which were hanging on CI runners. These tests pass locally, so we believe this is related to IO issues on CI runners, but will investigate further in 24.04 * Adds updates for pytest >=8 * Adds option to pytest to append source paths to PYTHONPATH instead of prepend (the default). The prepended PYTHONPATH caused the dask `LocalCUDACluster` to import cugraph modules from the source tree instead of the install location, which resulted in `ImportError`s. This appears to be a behavior change in pytest 8. * Adds an `xfail` for an [NX test known to be incompatible with pytest>=8](https://github.com/networkx/networkx/pull/7203) Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Divye Gala (https://github.com/divyegala) - Chuck Hastings (https://github.com/ChuckHastings) - Ray Douglass (https://github.com/raydouglass) - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4121 --- python/nx-cugraph/nx_cugraph/interface.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 04591c0e9..a57074aab 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -80,18 +80,26 @@ def key(testpath): nxver = parse(nx.__version__) if nxver.major == 3 and nxver.minor <= 2: - # Networkx versions prior to 3.2.1 have tests written to expect - # sp.sparse.linalg.ArpackNoConvergence exceptions raised on no - # convergence in HITS. Newer versions since the merge of - # https://github.com/networkx/networkx/pull/7084 expect - # nx.PowerIterationFailedConvergence, which is what nx_cugraph.hits - # raises, so we mark them as xfail for previous versions of NX. xfail.update( { + # NetworkX versions prior to 3.2.1 have tests written to + # expect sp.sparse.linalg.ArpackNoConvergence exceptions + # raised on no convergence in HITS. Newer versions since + # the merge of + # https://github.com/networkx/networkx/pull/7084 expect + # nx.PowerIterationFailedConvergence, which is what + # nx_cugraph.hits raises, so we mark them as xfail for + # previous versions of NX. key( "test_hits.py:TestHITS.test_hits_not_convergent" ): "nx_cugraph.hits raises updated exceptions not caught in " "these tests", + # NetworkX versions 3.2 and older contain tests that fail + # with pytest>=8. Assume pytest>=8 and mark xfail. + key( + "test_strongly_connected.py:" + "TestStronglyConnected.test_connected_raise" + ): "test is incompatible with pytest>=8", } ) From 1b897fae06213b00737d6fe493be978884309402 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:57:24 -0600 Subject: [PATCH 312/384] Adds benchmarks for additional nx-cugraph 24.02 algos (#4112) * Adds 23 benchmarks for BFS, connected components, triangles, and other related algos * Adds a shell script to run the algo benchmarks individually for easier comparison to NX * Fixes a bug in `nx_cugraph.generic_bfs_edges()` uncovered by these benchmarks Authors: - Rick Ratzel (https://github.com/rlratzel) - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) Approvers: - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4112 --- .../nx-cugraph/pytest-based/bench_algos.py | 366 +++++++++++++++++- .../nx-cugraph/pytest-based/run-2402.sh | 46 +++ .../traversal/breadth_first_search.py | 2 +- .../nx-cugraph/nx_cugraph/classes/digraph.py | 12 +- python/nx-cugraph/nx_cugraph/classes/graph.py | 4 +- 5 files changed, 413 insertions(+), 17 deletions(-) create mode 100755 benchmarks/nx-cugraph/pytest-based/run-2402.sh diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py index a8ed18a20..97eb32e2a 100644 --- a/benchmarks/nx-cugraph/pytest-based/bench_algos.py +++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py @@ -38,20 +38,27 @@ warmup_rounds = 1 dataset_param_values = [ + # name: karate, nodes: 34, edges: 156 pytest.param(datasets.karate, marks=[pytest.mark.small, pytest.mark.undirected]), + # name: netscience, nodes: 1461, edges: 5484 pytest.param(datasets.netscience, marks=[pytest.mark.small, pytest.mark.directed]), + # name: email-Eu-core, nodes: 1005, edges: 25571 pytest.param( datasets.email_Eu_core, marks=[pytest.mark.small, pytest.mark.directed] ), + # name: cit-Patents, nodes: 3774768, edges: 16518948 pytest.param( datasets.cit_patents, marks=[pytest.mark.medium, pytest.mark.directed] ), + # name: hollywood, nodes: 1139905, edges: 57515616 pytest.param( datasets.hollywood, marks=[pytest.mark.medium, pytest.mark.undirected] ), + # name: soc-LiveJournal1, nodes: 4847571, edges: 68993773 pytest.param( datasets.soc_livejournal, marks=[pytest.mark.medium, pytest.mark.directed] ), + # name: europe_osm, nodes: 50912018, edges: 54054660 pytest.param( datasets.europe_osm, marks=[pytest.mark.large, pytest.mark.undirected] ), @@ -226,12 +233,21 @@ def get_graph_obj_for_benchmark(graph_obj, backend_wrapper): """ G = graph_obj if backend_wrapper.backend_name == "cugraph-preconverted": - G = nxcg.from_networkx(G) + G = nxcg.from_networkx(G, preserve_all_attrs=True) return G +def get_highest_degree_node(graph_obj): + degrees = graph_obj.degree() # list of tuples of (node, degree) + return max(degrees, key=lambda t: t[1])[0] + + ################################################################################ # Benchmarks +def bench_from_networkx(benchmark, graph_obj): + benchmark(nxcg.from_networkx, graph_obj) + + # normalized_param_values = [True, False] # k_param_values = [10, 100] normalized_param_values = [True] @@ -284,7 +300,7 @@ def bench_edge_betweenness_centrality( def bench_louvain_communities(benchmark, graph_obj, backend_wrapper): G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) - # The cugraph backend for louvain_communities only supports undirected graphs + # DiGraphs are not supported if G.is_directed(): G = G.to_undirected() result = benchmark.pedantic( @@ -416,10 +432,8 @@ def bench_pagerank(benchmark, graph_obj, backend_wrapper): def bench_single_source_shortest_path_length(benchmark, graph_obj, backend_wrapper): - # Use the node with the highest degree - degrees = graph_obj.degree() # list of tuples of (node, degree) - node = max(degrees, key=lambda t: t[1])[0] G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) result = benchmark.pedantic( target=backend_wrapper(nx.single_source_shortest_path_length), @@ -435,11 +449,8 @@ def bench_single_source_shortest_path_length(benchmark, graph_obj, backend_wrapp def bench_single_target_shortest_path_length(benchmark, graph_obj, backend_wrapper): - # Use the node with the highest degree - degrees = graph_obj.degree() # list of tuples of (node, degree) - node = max(degrees, key=lambda t: t[1])[0] G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) - + node = get_highest_degree_node(graph_obj) result = benchmark.pedantic( target=backend_wrapper( nx.single_target_shortest_path_length, exhaust_returned_iterator=True @@ -456,3 +467,340 @@ def bench_single_target_shortest_path_length(benchmark, graph_obj, backend_wrapp # needed for this algo in NX 3.3+ which returns a dict instead of an # iterator. Forcing to a list does not change the benchmark timing. assert type(result) is list + + +def bench_ancestors(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.ancestors), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is set + + +def bench_average_clustering(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported by nx-cugraph + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.average_clustering), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is float + + +def bench_generic_bfs_edges(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.generic_bfs_edges, exhaust_returned_iterator=True), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_bfs_edges(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.bfs_edges, exhaust_returned_iterator=True), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_bfs_layers(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.bfs_layers, exhaust_returned_iterator=True), + args=(G,), + kwargs=dict( + sources=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_bfs_predecessors(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.bfs_predecessors, exhaust_returned_iterator=True), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_bfs_successors(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.bfs_successors, exhaust_returned_iterator=True), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_bfs_tree(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.bfs_tree), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + # Check that this at least appears to be some kind of NX-like Graph + assert hasattr(result, "has_node") + + +def bench_clustering(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported by nx-cugraph + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.clustering), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_core_number(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported by nx-cugraph + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.core_number), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_descendants(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.descendants), + args=(G,), + kwargs=dict( + source=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is set + + +def bench_descendants_at_distance(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.descendants_at_distance), + args=(G,), + kwargs=dict( + source=node, + distance=1, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is set + + +def bench_is_bipartite(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.is_bipartite), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is bool + + +def bench_is_strongly_connected(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.is_strongly_connected), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is bool + + +def bench_is_weakly_connected(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.is_weakly_connected), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is bool + + +def bench_number_strongly_connected_components(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.number_strongly_connected_components), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is int + + +def bench_number_weakly_connected_components(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.number_weakly_connected_components), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is int + + +def bench_overall_reciprocity(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper(nx.overall_reciprocity), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is float + + +def bench_reciprocity(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + node = get_highest_degree_node(graph_obj) + result = benchmark.pedantic( + target=backend_wrapper(nx.reciprocity), + args=(G,), + kwargs=dict( + nodes=node, + ), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is float + + +def bench_strongly_connected_components(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper( + nx.strongly_connected_components, exhaust_returned_iterator=True + ), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list + + +def bench_transitivity(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported by nx-cugraph + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.transitivity), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is float + + +def bench_triangles(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + # DiGraphs are not supported + if G.is_directed(): + G = G.to_undirected() + result = benchmark.pedantic( + target=backend_wrapper(nx.triangles), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + +def bench_weakly_connected_components(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + result = benchmark.pedantic( + target=backend_wrapper( + nx.weakly_connected_components, exhaust_returned_iterator=True + ), + args=(G,), + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is list diff --git a/benchmarks/nx-cugraph/pytest-based/run-2402.sh b/benchmarks/nx-cugraph/pytest-based/run-2402.sh new file mode 100755 index 000000000..44ed0bda4 --- /dev/null +++ b/benchmarks/nx-cugraph/pytest-based/run-2402.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# +# Copyright (c) 2024, NVIDIA CORPORATION. +# +# Runs benchmarks for the 24.02 algos. +# Pass either a or b or both. This is useful for separating batches of runs on different GPUs: +# CUDA_VISIBLE_DEVICES=1 run-2402.sh b + +mkdir -p logs + +# benches="$benches ..." pattern is easy to comment out individual runs +benches= + +while [[ $1 != "" ]]; do + if [[ $1 == "a" ]]; then + benches="$benches bench_ancestors" + benches="$benches bench_average_clustering" + benches="$benches bench_generic_bfs_edges" + benches="$benches bench_bfs_edges" + benches="$benches bench_bfs_layers" + benches="$benches bench_bfs_predecessors" + benches="$benches bench_bfs_successors" + benches="$benches bench_bfs_tree" + benches="$benches bench_clustering" + benches="$benches bench_core_number" + benches="$benches bench_descendants" + elif [[ $1 == "b" ]]; then + benches="$benches bench_descendants_at_distance" + benches="$benches bench_is_bipartite" + benches="$benches bench_is_strongly_connected" + benches="$benches bench_is_weakly_connected" + benches="$benches bench_number_strongly_connected_components" + benches="$benches bench_number_weakly_connected_components" + benches="$benches bench_overall_reciprocity" + benches="$benches bench_reciprocity" + benches="$benches bench_strongly_connected_components" + benches="$benches bench_transitivity" + benches="$benches bench_triangles" + benches="$benches bench_weakly_connected_components" + fi + shift +done + +for bench in $benches; do + pytest -sv -k "soc-livejournal1" "bench_algos.py::$bench" 2>&1 | tee "logs/${bench}.log" +done diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py index ef1c01136..f5d5e2a99 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py @@ -68,7 +68,7 @@ def generic_bfs_edges(G, source, neighbors=None, depth_limit=None, sort_neighbor raise NotImplementedError( "sort_neighbors argument in generic_bfs_edges is not currently supported" ) - return bfs_edges(source, depth_limit=depth_limit) + return bfs_edges(G, source, depth_limit=depth_limit) @generic_bfs_edges._can_run diff --git a/python/nx-cugraph/nx_cugraph/classes/digraph.py b/python/nx-cugraph/nx_cugraph/classes/digraph.py index 169815eb0..e5cfb8f68 100644 --- a/python/nx-cugraph/nx_cugraph/classes/digraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/digraph.py @@ -86,9 +86,9 @@ def to_undirected(self, reciprocal=False, as_view=False): key: val[indices].copy() for key, val in self.edge_masks.items() } else: - src_indices, dst_indices = cp.divmod( - src_dst_indices_new, N, dtype=index_dtype - ) + src_indices, dst_indices = cp.divmod(src_dst_indices_new, N) + src_indices = src_indices.astype(index_dtype) + dst_indices = dst_indices.astype(index_dtype) else: src_dst_indices_old_T = self.src_indices + N * self.dst_indices.astype( np.int64 @@ -116,9 +116,9 @@ def to_undirected(self, reciprocal=False, as_view=False): src_dst_indices_new = cp.union1d( src_dst_indices_old, src_dst_indices_old_T ) - src_indices, dst_indices = cp.divmod( - src_dst_indices_new, N, dtype=index_dtype - ) + src_indices, dst_indices = cp.divmod(src_dst_indices_new, N) + src_indices = src_indices.astype(index_dtype) + dst_indices = dst_indices.astype(index_dtype) if self.edge_values: recip_indices = cp.lexsort(cp.vstack((src_indices, dst_indices))) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index f69766875..0951ee6b1 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -668,7 +668,9 @@ def _get_plc_graph( raise ValueError( f'symmetrize must be "union" or "intersection"; got "{symmetrize}"' ) - src_indices, dst_indices = cp.divmod(src_dst_new, N, dtype=index_dtype) + src_indices, dst_indices = cp.divmod(src_dst_new, N) + src_indices = src_indices.astype(index_dtype) + dst_indices = dst_indices.astype(index_dtype) return plc.SGGraph( resource_handle=plc.ResourceHandle(), From 3cad19e9f5c6c73f32158ac0c3736ee4ff9fff4e Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Thu, 1 Feb 2024 17:59:58 -0600 Subject: [PATCH 313/384] nx-cugraph: use coverage to ensure all algorithms were run (#4108) Heh, there is probably a "better" way to do this, but this way was fast and easy enough to do, and I hope is "good enough". Authors: - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/4108 --- python/nx-cugraph/lint.yaml | 2 +- .../nx_cugraph/scripts/print_table.py | 2 +- .../nx_cugraph/tests/ensure_algos_covered.py | 84 +++++++++++++++++++ .../nx-cugraph/nx_cugraph/tests/test_bfs.py | 33 ++++++++ python/nx-cugraph/run_nx_tests.sh | 14 +++- 5 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 python/nx-cugraph/nx_cugraph/tests/ensure_algos_covered.py create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_bfs.py diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 5a4773168..8e87fc235 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -26,7 +26,7 @@ repos: - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.15 + rev: v0.16 hooks: - id: validate-pyproject name: Validate pyproject.toml diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_table.py b/python/nx-cugraph/nx_cugraph/scripts/print_table.py index 7e69de63d..117a1444f 100755 --- a/python/nx-cugraph/nx_cugraph/scripts/print_table.py +++ b/python/nx-cugraph/nx_cugraph/scripts/print_table.py @@ -59,7 +59,7 @@ def main(path_to_info=None, *, file=sys.stdout): if path_to_info is None: path_to_info = get_path_to_info(version_added_sep=".") lines = ["networkx_path,dispatch_name,version_added,plc,is_incomplete,is_different"] - lines.extend(",".join(info) for info in path_to_info.values()) + lines.extend(",".join(map(str, info)) for info in path_to_info.values()) text = "\n".join(lines) print(text, file=file) return text diff --git a/python/nx-cugraph/nx_cugraph/tests/ensure_algos_covered.py b/python/nx-cugraph/nx_cugraph/tests/ensure_algos_covered.py new file mode 100644 index 000000000..7047f0eea --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/ensure_algos_covered.py @@ -0,0 +1,84 @@ +# Copyright (c) 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 +# +# 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. +"""Ensure that all functions wrapped by @networkx_algorithm were called. + +This file is run by CI and should not normally be run manually. +""" +import inspect +import json +from pathlib import Path + +from nx_cugraph.interface import BackendInterface +from nx_cugraph.utils import networkx_algorithm + +with Path("coverage.json").open() as f: + coverage = json.load(f) + +filenames_to_executed_lines = { + "nx_cugraph/" + + filename.rsplit("nx_cugraph/", 1)[-1]: set(coverage_info["executed_lines"]) + for filename, coverage_info in coverage["files"].items() +} + + +def unwrap(func): + while hasattr(func, "__wrapped__"): + func = func.__wrapped__ + return func + + +def get_func_filename(func): + return "nx_cugraph" + inspect.getfile(unwrap(func)).rsplit("nx_cugraph", 1)[-1] + + +def get_func_linenos(func): + lines, lineno = inspect.getsourcelines(unwrap(func)) + for i, line in enumerate(lines, lineno): + if ":\n" in line: + return set(range(i + 1, lineno + len(lines))) + raise RuntimeError(f"Could not determine line numbers for function {func}") + + +def has_any_coverage(func): + return bool( + filenames_to_executed_lines[get_func_filename(func)] & get_func_linenos(func) + ) + + +def main(): + no_coverage = set() + for attr, func in vars(BackendInterface).items(): + if not isinstance(func, networkx_algorithm): + continue + if not has_any_coverage(func): + no_coverage.add(attr) + if no_coverage: + msg = "The following algorithms have no coverage: " + ", ".join( + sorted(no_coverage) + ) + # Create a border of "!" + msg = ( + "\n\n" + + "!" * (len(msg) + 6) + + "\n!! " + + msg + + " !!\n" + + "!" * (len(msg) + 6) + + "\n" + ) + raise AssertionError(msg) + print("\nSuccess: coverage determined all algorithms were called!\n") + + +if __name__ == "__main__": + main() diff --git a/python/nx-cugraph/nx_cugraph/tests/test_bfs.py b/python/nx-cugraph/nx_cugraph/tests/test_bfs.py new file mode 100644 index 000000000..c2b22e989 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_bfs.py @@ -0,0 +1,33 @@ +# Copyright (c) 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 +# +# 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. +import networkx as nx +import pytest +from packaging.version import parse + +nxver = parse(nx.__version__) + +if nxver.major == 3 and nxver.minor < 2: + pytest.skip("Need NetworkX >=3.2 to test clustering", allow_module_level=True) + + +def test_generic_bfs_edges(): + # generic_bfs_edges currently isn't exercised by networkx tests + Gnx = nx.karate_club_graph() + Gcg = nx.karate_club_graph(backend="cugraph") + for depth_limit in (0, 1, 2): + for source in Gnx: + # Some ordering is arbitrary, so I think there's a chance + # this test may fail if networkx or nx-cugraph changes. + nx_result = nx.generic_bfs_edges(Gnx, source, depth_limit=depth_limit) + cg_result = nx.generic_bfs_edges(Gcg, source, depth_limit=depth_limit) + assert sorted(nx_result) == sorted(cg_result), (source, depth_limit) diff --git a/python/nx-cugraph/run_nx_tests.sh b/python/nx-cugraph/run_nx_tests.sh index 07c97cdf9..da7a2014c 100755 --- a/python/nx-cugraph/run_nx_tests.sh +++ b/python/nx-cugraph/run_nx_tests.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-2024, NVIDIA CORPORATION. # # NETWORKX_GRAPH_CONVERT=cugraph # Used by networkx versions 3.0 and 3.1 @@ -30,7 +30,13 @@ NETWORKX_TEST_BACKEND=cugraph \ NETWORKX_FALLBACK_TO_NX=True \ pytest \ --pyargs networkx \ - --cov=nx_cugraph.algorithms \ - --cov-report term-missing \ - --no-cov-on-fail \ + --config-file=$(dirname $0)/pyproject.toml \ + --cov-config=$(dirname $0)/pyproject.toml \ + --cov=nx_cugraph \ + --cov-report= \ "$@" +coverage report \ + --include="*/nx_cugraph/algorithms/*" \ + --omit=__init__.py \ + --show-missing \ + --rcfile=$(dirname $0)/pyproject.toml From c06dd95b7881c37fdc5c118ef5275b9ac7cb8831 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:46:22 -0600 Subject: [PATCH 314/384] Removes the `networkx_algorithm` decorator to all SCC functions to disable dispatching to them (#4120) The current cugraph `strongly_connected_components` is a legacy implementation with known issues, and in most cases should not be used until the cugraph team can provide an update. This PR removes the `networkx_algorithm` decorator from all SCC functions to disable dispatching. Users can still run the SCC functions here by accessing them directly from `nx_cugraph`: ```python >>> import nx_cugraph as nxcg >>> nxcg.strongly_connected_components(...) ``` Tested by running the `nx_cugraph` tests (`pytest nx_cugraph/tests`) and the NetworkX tests (`run_nx_tests.sh`) _Note: using the "non-breaking" label since this API was only present in nightlies and never released._ Authors: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) Approvers: - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4120 --- python/nx-cugraph/_nx_cugraph/__init__.py | 9 +++---- .../components/strongly_connected.py | 24 ++++++++++++------- python/nx-cugraph/nx_cugraph/interface.py | 12 ++++++---- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 2f283aa15..8b5c87a63 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -12,7 +12,11 @@ # limitations under the License. """Tell NetworkX about the cugraph backend. This file can update itself: -$ make plugin-info # Recommended method for development +$ make plugin-info + +or + +$ make all # Recommended - runs 'plugin-info' followed by 'lint' or @@ -78,7 +82,6 @@ "is_connected", "is_forest", "is_isolate", - "is_strongly_connected", "is_tree", "is_weakly_connected", "isolates", @@ -96,7 +99,6 @@ "number_connected_components", "number_of_isolates", "number_of_selfloops", - "number_strongly_connected_components", "number_weakly_connected_components", "octahedral_graph", "out_degree_centrality", @@ -111,7 +113,6 @@ "single_source_shortest_path_length", "single_target_shortest_path_length", "star_graph", - "strongly_connected_components", "tadpole_graph", "tetrahedral_graph", "transitivity", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py index d17131297..a63b3237d 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/components/strongly_connected.py @@ -15,12 +15,7 @@ import pylibcugraph as plc from nx_cugraph.convert import _to_directed_graph -from nx_cugraph.utils import ( - _groupby, - index_dtype, - networkx_algorithm, - not_implemented_for, -) +from nx_cugraph.utils import _groupby, index_dtype, not_implemented_for __all__ = [ "number_strongly_connected_components", @@ -50,8 +45,19 @@ def _strongly_connected_components(G): return labels +# The networkx_algorithm decorator is (temporarily) removed to disable +# dispatching for this function. The current cugraph +# strongly_connected_components is a legacy implementation with known issues, +# and in most cases should not be used until the cugraph team can provide an +# update. +# +# Users can still call this via the nx_cugraph module directly: +# >>> import nx_cugraph as nxcg +# >>> nxcg.strongly_connected_components(...) + + @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") +# @networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def strongly_connected_components(G): G = _to_directed_graph(G) if G.src_indices.size == 0: @@ -62,7 +68,7 @@ def strongly_connected_components(G): @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") +# @networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def number_strongly_connected_components(G): G = _to_directed_graph(G) if G.src_indices.size == 0: @@ -72,7 +78,7 @@ def number_strongly_connected_components(G): @not_implemented_for("undirected") -@networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") +# @networkx_algorithm(version_added="24.02", _plc="strongly_connected_components") def is_strongly_connected(G): G = _to_directed_graph(G) if len(G) == 0: diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index a57074aab..46ea5831b 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -69,10 +69,14 @@ def key(testpath): no_string_dtype = "string edge values not currently supported" xfail = { - key( - "test_strongly_connected.py:" - "TestStronglyConnected.test_condensation_mapping_and_members" - ): "Strongly connected groups in different iteration order", + # This is removed while strongly_connected_components() is not + # dispatchable. See algorithms/components/strongly_connected.py for + # details. + # + # key( + # "test_strongly_connected.py:" + # "TestStronglyConnected.test_condensation_mapping_and_members" + # ): "Strongly connected groups in different iteration order", } from packaging.version import parse From 4e05a47b5193dca0ccb7589877e026379ad3d848 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Thu, 1 Feb 2024 19:58:16 -0500 Subject: [PATCH 315/384] corrected links in C API and added groups for support functions (#4131) Fixes broken links in C API docs in Traversal, Sampling and Community algorithm sections resolves issue #4116 Authors: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4131 --- .../cugraph/source/api_docs/cugraph_c/community.rst | 10 ++-------- docs/cugraph/source/api_docs/cugraph_c/labeling.rst | 4 ++-- docs/cugraph/source/api_docs/cugraph_c/sampling.rst | 13 +++++-------- .../source/api_docs/cugraph_c/similarity.rst | 4 ++-- .../cugraph/source/api_docs/cugraph_c/traversal.rst | 4 ++-- 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/docs/cugraph/source/api_docs/cugraph_c/community.rst b/docs/cugraph/source/api_docs/cugraph_c/community.rst index 0bbfe365c..d55325720 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/community.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/community.rst @@ -1,12 +1,6 @@ Community ========= -.. role:: py(code) - :language: c - :class: highlight - -``#include `` - Triangle Counting ----------------- .. doxygenfunction:: cugraph_triangle_count @@ -45,8 +39,8 @@ Spectral Clustering - Modularity Maximization .. doxygenfunction:: cugraph_analyze_clustering_modularity :project: libcugraph -Spectral Clusteriong - Edge Cut -------------------------------- +Spectral Clustering - Edge Cut +------------------------------ .. doxygenfunction:: cugraph_analyze_clustering_edge_cut :project: libcugraph diff --git a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst index af105ee8f..4ca598c0a 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst @@ -12,8 +12,8 @@ Strongly Connected Components .. doxygenfunction:: cugraph_strongly_connected_components :project: libcugraph -Support -------- +Labeling Support Functions +-------------------------- .. doxygengroup:: labeling :project: libcugraph :members: diff --git a/docs/cugraph/source/api_docs/cugraph_c/sampling.rst b/docs/cugraph/source/api_docs/cugraph_c/sampling.rst index 21b837daf..3d5af713c 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/sampling.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/sampling.rst @@ -7,7 +7,7 @@ Uniform Random Walks :project: libcugraph Biased Random Walks --------------------- +------------------- .. doxygenfunction:: cugraph_biased_random_walks :project: libcugraph @@ -21,16 +21,13 @@ Node2Vec .. doxygenfunction:: cugraph_node2vec :project: libcugraph -Uniform Neighborhood Sampling ------------------------------ -.. doxygenfunction:: cugraph_uniform_neighbor_sample_with_edge_properties - :project: libcugraph - +Uniform Neighbor Sampling +------------------------- .. doxygenfunction:: cugraph_uniform_neighbor_sample :project: libcugraph -Support -------- +Sampling Support Functions +-------------------------- .. doxygengroup:: samplingC :project: libcugraph :members: diff --git a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst index fba07ad20..200ba6957 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst @@ -17,8 +17,8 @@ Overlap .. doxygenfunction:: cugraph_overlap_coefficients :project: libcugraph -Support -------- +Similarty Support Functions +--------------------------- .. doxygengroup:: similarity :project: libcugraph :members: diff --git a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst index c90760e9e..1578951e0 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst @@ -22,8 +22,8 @@ Extract Max Path Length .. doxygenfunction:: cugraph_extract_paths_result_get_max_path_length :project: libcugraph -Support -------- +Traversal Support Functions +--------------------------- .. doxygengroup:: traversal :project: libcugraph :members: From 4b3a8bc6334abf3f4299841b29ff99a19d9c3296 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:00:18 -0600 Subject: [PATCH 316/384] Updates nx-cugraph README.md with latest algos (#4135) closes #4079 * Updates nx-cugraph `README.md` with latest algos * Adds script to auto-update `README.md` from `nx_cugraph` metadata directly Authors: - Rick Ratzel (https://github.com/rlratzel) - Erik Welch (https://github.com/eriknw) - Brad Rees (https://github.com/BradReesWork) Approvers: - Don Acosta (https://github.com/acostadon) - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4135 --- python/nx-cugraph/README.md | 182 ++++++++++++++---- .../nx_cugraph/scripts/print_tree.py | 4 +- 2 files changed, 143 insertions(+), 43 deletions(-) diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index f6a9aac10..5d0554734 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -89,48 +89,146 @@ interface to its CUDA-based graph analytics library) and [CuPy](https://cupy.dev/) (a GPU-accelerated array library) to NetworkX's familiar and easy-to-use API. -Below is the list of algorithms (many listed using pylibcugraph names), -available today in pylibcugraph or implemented using CuPy, that are or will be -supported in nx-cugraph. - -| feature/algo | release/target version | -| ----- | ----- | -| analyze_clustering_edge_cut | ? | -| analyze_clustering_modularity | ? | -| analyze_clustering_ratio_cut | ? | -| balanced_cut_clustering | ? | -| betweenness_centrality | 23.10 | -| bfs | ? | -| connected_components | 23.12 | -| core_number | ? | -| degree_centrality | 23.12 | -| ecg | ? | -| edge_betweenness_centrality | 23.10 | -| ego_graph | ? | -| eigenvector_centrality | 23.12 | -| get_two_hop_neighbors | ? | -| hits | 23.12 | -| in_degree_centrality | 23.12 | -| induced_subgraph | ? | -| jaccard_coefficients | ? | -| katz_centrality | 23.12 | -| k_core | ? | -| k_truss_subgraph | 23.12 | -| leiden | ? | -| louvain | 23.10 | -| node2vec | ? | -| out_degree_centrality | 23.12 | -| overlap_coefficients | ? | -| pagerank | 23.12 | -| personalized_pagerank | ? | -| sorensen_coefficients | ? | -| spectral_modularity_maximization | ? | -| sssp | 23.12 | -| strongly_connected_components | ? | -| triangle_count | ? | -| uniform_neighbor_sample | ? | -| uniform_random_walks | ? | -| weakly_connected_components | ? | +Below is the list of algorithms that are currently supported in nx-cugraph. + +### Algorithms + +``` +bipartite + ├─ basic + │ └─ is_bipartite + └─ generators + └─ complete_bipartite_graph +centrality + ├─ betweenness + │ ├─ betweenness_centrality + │ └─ edge_betweenness_centrality + ├─ degree_alg + │ ├─ degree_centrality + │ ├─ in_degree_centrality + │ └─ out_degree_centrality + ├─ eigenvector + │ └─ eigenvector_centrality + └─ katz + └─ katz_centrality +cluster + ├─ average_clustering + ├─ clustering + ├─ transitivity + └─ triangles +community + └─ louvain + └─ louvain_communities +components + ├─ connected + │ ├─ connected_components + │ ├─ is_connected + │ ├─ node_connected_component + │ └─ number_connected_components + └─ weakly_connected + ├─ is_weakly_connected + ├─ number_weakly_connected_components + └─ weakly_connected_components +core + ├─ core_number + └─ k_truss +dag + ├─ ancestors + └─ descendants +isolate + ├─ is_isolate + ├─ isolates + └─ number_of_isolates +link_analysis + ├─ hits_alg + │ └─ hits + └─ pagerank_alg + └─ pagerank +operators + └─ unary + ├─ complement + └─ reverse +reciprocity + ├─ overall_reciprocity + └─ reciprocity +shortest_paths + └─ unweighted + ├─ single_source_shortest_path_length + └─ single_target_shortest_path_length +traversal + └─ breadth_first_search + ├─ bfs_edges + ├─ bfs_layers + ├─ bfs_predecessors + ├─ bfs_successors + ├─ bfs_tree + ├─ descendants_at_distance + └─ generic_bfs_edges +tree + └─ recognition + ├─ is_arborescence + ├─ is_branching + ├─ is_forest + └─ is_tree +``` + +### Generators + +``` +classic + ├─ barbell_graph + ├─ circular_ladder_graph + ├─ complete_graph + ├─ complete_multipartite_graph + ├─ cycle_graph + ├─ empty_graph + ├─ ladder_graph + ├─ lollipop_graph + ├─ null_graph + ├─ path_graph + ├─ star_graph + ├─ tadpole_graph + ├─ trivial_graph + ├─ turan_graph + └─ wheel_graph +community + └─ caveman_graph +small + ├─ bull_graph + ├─ chvatal_graph + ├─ cubical_graph + ├─ desargues_graph + ├─ diamond_graph + ├─ dodecahedral_graph + ├─ frucht_graph + ├─ heawood_graph + ├─ house_graph + ├─ house_x_graph + ├─ icosahedral_graph + ├─ krackhardt_kite_graph + ├─ moebius_kantor_graph + ├─ octahedral_graph + ├─ pappus_graph + ├─ petersen_graph + ├─ sedgewick_maze_graph + ├─ tetrahedral_graph + ├─ truncated_cube_graph + ├─ truncated_tetrahedron_graph + └─ tutte_graph +social + ├─ davis_southern_women_graph + ├─ florentine_families_graph + ├─ karate_club_graph + └─ les_miserables_graph +``` + +### Other + +``` +convert_matrix + ├─ from_pandas_edgelist + └─ from_scipy_sparse_array +``` To request nx-cugraph backend support for a NetworkX API that is not listed above, visit the [cuGraph GitHub repo](https://github.com/rapidsai/cugraph). diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_tree.py b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py index bb75d735c..485873a44 100755 --- a/python/nx-cugraph/nx_cugraph/scripts/print_tree.py +++ b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py @@ -133,7 +133,9 @@ def main( } if by == "networkx_path": G = create_tree(path_to_info, by="networkx_path", **kwargs) - text = re.sub(r"[A-Za-z_\./]+\.", "", ("\n".join(nx.generate_network_text(G)))) + text = re.sub( + r" [A-Za-z_\./]+\.", " ", ("\n".join(nx.generate_network_text(G))) + ) elif by == "plc": G = create_tree( path_to_info, by=["plc", "networkx_path"], prefix="plc-", **kwargs From 0823cf3a4eb2d36a4f687ff9f8c185fc4a34690f Mon Sep 17 00:00:00 2001 From: Vyas Ramasubramani Date: Wed, 7 Feb 2024 05:52:06 -0800 Subject: [PATCH 317/384] Exclude tests from builds (#4147) --- python/nx-cugraph/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 63ac11591..d8adeec0b 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -79,6 +79,7 @@ include = [ "_nx_cugraph*", "_nx_cugraph.*", ] +exclude = ["*tests*"] [tool.black] line-length = 88 From 8c6a19e9174df421851a57563263b81341b1a009 Mon Sep 17 00:00:00 2001 From: Ray Douglass <3107146+raydouglass@users.noreply.github.com> Date: Thu, 8 Feb 2024 17:15:59 -0500 Subject: [PATCH 318/384] Revert "Exclude tests from builds (#4147)" (#4157) This reverts commit 0823cf3a4eb2d36a4f687ff9f8c185fc4a34690f. --- python/nx-cugraph/pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index d8adeec0b..63ac11591 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -79,7 +79,6 @@ include = [ "_nx_cugraph*", "_nx_cugraph.*", ] -exclude = ["*tests*"] [tool.black] line-length = 88 From c000f4bdbdc91d6339d736244bac9ca8657f2fab Mon Sep 17 00:00:00 2001 From: Naim <110031745+naimnv@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:24:54 +0100 Subject: [PATCH 319/384] Add a new notebook for SNMG benchmark runs (#4091) This PR adds new notebook for SNMG benchmark runs. It - [x] simplifies bookkeeping and data presentation. - [x] update each cugraph function wrappers to handle both SG and MG calls depending on a flag. The object is to have a common set of function wrappers for SG, SNMG and MNMG and put them in a common module to avoid duplication. Authors: - Naim (https://github.com/naimnv) - Ralph Liu (https://github.com/nv-rliu) Approvers: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) - Joseph Nke (https://github.com/jnke2016) URL: https://github.com/rapidsai/cugraph/pull/4091 --- .../synth_release_single_node_multi_gpu.ipynb | 950 ++++++++++++++++++ 1 file changed, 950 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb diff --git a/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb b/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb new file mode 100644 index 000000000..c44f475c4 --- /dev/null +++ b/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb @@ -0,0 +1,950 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Skip notebook test\n", + "-----\n", + "\n", + "#### NOTE: This notebook will take hours to run.\n", + "-----\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Comparing NetworkX vs cuGraph using synthetic data on various algorithms on single node multi GPU (SNMG) cluster\n", + "\n", + "\n", + "This notebook compares the execution times of many of the cuGraph and NetworkX algorithms when run against identical synthetic data at multiple scales.\n", + "\n", + "This notebook uses the RMAT data generator which allows the creation of graphs at various scales. The notebook, by default, runs on a set of selected sizes but users are free to change or add to that list." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notebook Credits\n", + "\n", + " \n", + "| Author | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|---------------------|-----------------|------------------------|\n", + "| Don Acosta | 1/12/2023 | Created | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", + "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", + "| Naim, Md | 2/08/2024 | Modified for SNMG | 24.04 nightly | RTX A6000, CUDA 12.0 |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Timing " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When looking at the overall workflow, NetworkX and cuGraph do things differently. For example, NetworkX spends a lot of time creating the graph data structure. cuGraph on the other hand does a lazy creation of the data structure when an algorithm is called. To further complicate the comparison problem, NetworkX does not always return the answer. In some cases, it returns a generator that is then called to produce the data. \n", + "\n", + "This benchmark produces two performance metrics:\n", + " - (1)\tJust the algorithm run time \n", + " - (2)\tThe algorithm plus graph creation time\n", + "\n", + "Since GPU memory is a precious resource, having a lot of temporary data laying around is avoided. So once a graph is created, the raw data is dropped. \n", + " \n", + "__What is not timed__: Generating the data with R-MAT

\n", + "__What is timed__: (1) creating a Graph, (2) running the algorithm (3) run any generators\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Algorithms" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "| Algorithm | Type | Undirected Graph | Directed Graph | Notes\n", + "| ------------------------|---------------|------ | ------- |-------------\n", + "| Katz | Centrality | X | | \n", + "| Betweenness Centrality | Centrality | X | | Estimated, k = 100\n", + "| Louvain | Community | X | | Uses python-louvain for comparison\n", + "| Triangle Counting | Community | X | |\n", + "| Core Number | Core | X | |\n", + "| PageRank | Link Analysis | | X |\n", + "| Jaccard | Similarity | X | |\n", + "| BFS | Traversal | X | | No depth limit\n", + "| SSSP | Traversal | X | | \n", + "\n", + "\n", + "### Test Data\n", + "Data is generated using a Recursive MATrix (R-MAT) graph generation algorithm. \n", + "The generator specifics are documented [here](https://docs.rapids.ai/api/cugraph/stable/api_docs/generator.html)\n", + "\n", + "\n", + "\n", + "### Notes\n", + "* Running Betweenness Centrality on the full graph is prohibitive using NetworkX. Anything over k=100 can explode runtime to days\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Import Modules" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# system and other\n", + "import gc\n", + "import os\n", + "from time import perf_counter\n", + "import pandas as pd\n", + "from collections import defaultdict\n", + "\n", + "# rapids\n", + "import cugraph\n", + "\n", + "# liblibraries to setup dask cluster and client\n", + "from dask.distributed import Client\n", + "from dask_cuda import LocalCUDACluster\n", + "from cugraph.dask.comms import comms as Comms\n", + "\n", + "# NetworkX libraries\n", + "import networkx as nx\n", + "\n", + "# RMAT data generator\n", + "from cugraph.generators import rmat\n", + "from cugraph.structure import NumberMap" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try: \n", + " import community\n", + "except ModuleNotFoundError:\n", + " os.system('pip install python-louvain')\n", + " import community" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Determine the scale of the test data\n", + "RMAT generates graph where the number of vertices is a power of 2 and the number of edges is based on an edge factor times the number vertices.\n", + "\n", + "Since RMAT tends to generate about 50% isolated vertices, those vertices are dropped from the graph data. Hence the number of vertices is closer to (2 ** scale) / 2\n", + "\n", + "\n", + "| Scale | Vertices (est) | Edges |\n", + "| ------|----------------|--------|\n", + "| 10 | 512 | 16,384 | \n", + "| 11 | 1,024 | 32,768| \n", + "| 12 | 2,048 | 65,536| \n", + "| 13 | 4,096 | 131,072| \n", + "| 14 | 8,192 | 262,144| \n", + "| 15 | 16,384 | 524,288 | \n", + "| 16 | 32,768 | 1,048,576 | \n", + "| 17 | 65,536 | 2,097,152 | \n", + "| 18 | 131,072 | 4,194,304 | \n", + "| 19 | 262,144 | 8,388,608 | \n", + "| 20 | 524,288 | 16,777,216 | \n", + "| 21 | 1,048,576 | 33,554,432 | \n", + "| 22 | 2,097,152 | 67,108,864 | \n", + "| 23 | 4,194,304 | 134,217,728 | \n", + "| 24 | 8,388,608 | 268,435,456 | \n", + "| 25 | 16,777,216 | 536,870,912 | \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test Data Sizes\n", + "# Here you can create an array of test data sizes. Then set the \"data\" variable to the array you want\n", + "# the dictionary format is 'name' : scale\n", + "\n", + "\n", + "# These scales are used by R-MAT to determine the number of vertices/edges in the synthetic data graph.\n", + "data_full = {\n", + " 'data_scale_10' : 10,\n", + " 'data_scale_12' : 12,\n", + " 'data_scale_14' : 14,\n", + " 'data_scale_16' : 16,\n", + " 'data_scale_18' : 18,\n", + " 'data_scale_20' : 20,\n", + "}\n", + "\n", + "# for quick testing\n", + "data_quick = {\n", + " 'data_scale_9' : 9,\n", + " 'data_scale_10' : 10,\n", + " 'data_scale_11' : 11,\n", + "}\n", + "\n", + "\n", + "# Which dataset is to be used\n", + "data = data_quick\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate data\n", + "The data is generated once for each size." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Data generator \n", + "# The result is an edgelist of the size determined by the scale and edge factor\n", + "def generate_data(scale, edgefactor=16, mg=False):\n", + " _gdf = rmat(\n", + " scale,\n", + " (2 ** scale) * edgefactor,\n", + " 0.57,\n", + " 0.19,\n", + " 0.19,\n", + " 42,\n", + " clip_and_flip=False,\n", + " scramble_vertex_ids=True,\n", + " create_using=None, # return edgelist instead of Graph instance\n", + " mg=mg # determines whether generated data will be used on one or multiple GPUs\n", + " )\n", + "\n", + " clean_coo = NumberMap.renumber(_gdf, src_col_names=\"src\", dst_col_names=\"dst\")[0]\n", + " if mg:\n", + " clean_coo.rename(columns={\"renumbered_src\": \"src\", \"renumbered_dst\": \"dst\"})\n", + " else:\n", + " clean_coo.rename(columns={\"renumbered_src\": \"src\", \"renumbered_dst\": \"dst\"}, inplace=True)\n", + "\n", + " print(f'Generated a dataframe of type {type(clean_coo)}, with {len(clean_coo)} edges')\n", + " \n", + " return clean_coo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Graph functions\n", + "There are two types of graphs created:\n", + "* Directed Graphs - calls to create_nx_digraph, create_cu_directed_graph.\n", + "* Undirected Graphs - calls to create_xx_ugraph <- fully symmeterized" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# NetworkX\n", + "def create_nx_graph(_df , directed=False):\n", + " t1 = perf_counter()\n", + " if directed:\n", + " g_type = nx.DiGraph\n", + " else:\n", + " g_type = nx.Graph\n", + " \n", + " _gnx = nx.from_pandas_edgelist(_df,\n", + " source='src',\n", + " target='dst',\n", + " edge_attr=None,\n", + " create_using=g_type)\n", + " t2 = perf_counter() - t1\n", + "\n", + " return _gnx, t2\n", + "\n", + "\n", + "\n", + "# cuGraph\n", + "def create_cu_graph(_df, transpose=False, directed=False, mg=False):\n", + " t1 = perf_counter()\n", + " _g = cugraph.Graph(directed=directed)\n", + "\n", + " if mg:\n", + " _g.from_dask_cudf_edgelist(_df, source=\"src\", destination=\"dst\", edge_attr=None)\n", + " else:\n", + " _g.from_cudf_edgelist(_df,\n", + " source='src',\n", + " destination='dst',\n", + " edge_attr=None,\n", + " renumber=False,\n", + " store_transposed=transpose)\n", + " t2 = perf_counter() - t1\n", + "\n", + " return _g, t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm Execution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Katz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_katz(_G, alpha):\n", + " t1 = perf_counter()\n", + " _ = nx.katz_centrality(_G, alpha)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_katz(_G, alpha, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.katz_centrality(_G, alpha)\n", + " else:\n", + "\n", + " _ = cugraph.katz_centrality(_G, alpha)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Betweenness Centrality" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bc(_G, _k):\n", + " t1 = perf_counter()\n", + " _ = nx.betweenness_centrality(_G, k=_k)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_bc(_G, _k, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.betweenness_centrality(_G, k=_k)\n", + " else: \n", + " _ = cugraph.betweenness_centrality(_G, k=_k)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Louvain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_louvain(_G):\n", + " t1 = perf_counter()\n", + " parts = community.best_partition(_G)\n", + " \n", + " # Calculating modularity scores for comparison\n", + " _ = community.modularity(parts, _G)\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_louvain(_G, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _, modularity = cugraph.dask.louvain(_G)\n", + " print (f'modularity: {modularity}')\n", + " else:\n", + " _,_ = cugraph.louvain(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Triangle Counting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_tc(_G):\n", + " t1 = perf_counter()\n", + " nx_count = nx.triangles(_G)\n", + "\n", + " # To get the number of triangles, we would need to loop through the array and add up each count\n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_tc(_G, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.triangle_count(_G)\n", + " else:\n", + " _ = cugraph.triangle_count(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Core Number" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_core_num(_G):\n", + " t1 = perf_counter()\n", + " _G.remove_edges_from(nx.selfloop_edges(_G))\n", + " nx_count = nx.core_number(_G)\n", + " \n", + " count = 0\n", + " for key, value in nx_count.items():\n", + " count = count + value\n", + " \n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_core_num(_G, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.core_number(_G)\n", + " else:\n", + " _ = cugraph.core_number(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PageRank" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_pagerank(_G):\n", + " t1 = perf_counter()\n", + " _ = nx.pagerank(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2 \n", + "\n", + "def cu_pagerank(_G, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.pagerank(_G)\n", + " else:\n", + " _ = cugraph.pagerank(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Jaccard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_jaccard(_G):\n", + " t1 = perf_counter()\n", + " nj = nx.jaccard_coefficient(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_jaccard(_G, mg=False):\n", + " t1 = perf_counter()\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.jaccard(_G)\n", + " else:\n", + " _ = cugraph.jaccard_coefficient(_G)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### BFS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_bfs(_G, seed):\n", + " t1 = perf_counter()\n", + " nb = nx.bfs_edges(_G, seed)\n", + " nb_list = list(nb) # gen -> list\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_bfs(_G, seed=0, mg=False):\n", + " t1 = perf_counter()\n", + " if mg:\n", + " _ = cugraph.dask.bfs(_G, seed)\n", + " else:\n", + " _ = cugraph.bfs(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SSSP" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def nx_sssp(_G, seed):\n", + " t1 = perf_counter()\n", + " _ = nx.shortest_path(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n", + "\n", + "def cu_sssp(_G, seed = 0, mg=False):\n", + " \n", + " t1 = perf_counter()\n", + " # SSSP requires weighted graph\n", + " if mg:\n", + " _ = cugraph.dask.bfs(_G, seed)\n", + " else:\n", + " _ = cugraph.bfs(_G, seed)\n", + " t2 = perf_counter() - t1\n", + " return t2\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## MG Benchmark" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize multi-GPU environment\n", + "Before we get started, we need to set up a dask (local) cluster of workers to execute our work, and a client to coordinate and schedule work for that cluster.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Setup a local dask cluster of workers, and a client\n", + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "Comms.initialize(p2p=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Placeholders to collect execution run statistics " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "nx_algo_run_times = defaultdict(defaultdict)\n", + "cugraph_algo_run_times = defaultdict(defaultdict)\n", + "perf_algos = defaultdict(defaultdict)\n", + "perf = defaultdict(defaultdict)\n", + "cugraph_graph_creation_times = defaultdict()\n", + "nx_graph_creation_times = defaultdict()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run NX and cuGraph algorithms for all datasets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "for dataset, scale in data.items():\n", + " \n", + " # generate data\n", + " print(\"------------------------------\")\n", + " print(f'Creating Graph of Scale = {scale}')\n", + " \n", + " gdf = generate_data(scale, edgefactor=16, mg=True)\n", + " gdf = gdf.repartition(gdf.npartitions * 3)\n", + "\n", + " # Copy data to host to create NX graph\n", + " pdf = pd.DataFrame(columns=['src', 'dst'])\n", + " for part_idx in range(gdf.npartitions):\n", + " computed_df = gdf.partitions[part_idx].compute().to_pandas()\n", + " pdf = pd.concat([pdf, computed_df], ignore_index=True, sort=False)\n", + "\n", + " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", + " \n", + " # create cuGraph and NX graphs\n", + " g_cu, tcu = create_cu_graph(gdf, mg=True)\n", + " g_nx, tnx = create_nx_graph(pdf)\n", + " cugraph_graph_creation_times[dataset] = tcu\n", + " nx_graph_creation_times[dataset] = tnx\n", + " del gdf, pdf\n", + "\n", + " # prep\n", + " deg = g_cu.degree()\n", + " deg_max = deg['degree'].max().compute()\n", + " alpha = 1 / deg_max\n", + " num_nodes = g_cu.number_of_vertices()\n", + " del deg\n", + " gc.collect()\n", + "\n", + " #-- Katz \n", + " algorithm = \"Katz\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_katz(g_nx, alpha)\n", + " print(\"c.\", end='')\n", + " tc = cu_katz(g_cu, alpha, mg=True)\n", + " print(\"\")\n", + " \n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- BC\n", + " algorithm = \"BC\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " k = 100\n", + " if k > num_nodes:\n", + " k = int(num_nodes)\n", + " print(\"n.\", end='')\n", + " tx = nx_bc(g_nx, k)\n", + " print(\"c.\", end='')\n", + " tc = cu_bc(g_cu, k, mg=True)\n", + " print(\" \")\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- Louvain\n", + " algorithm = \"Louvain\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_louvain(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_louvain(g_cu, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- TC\n", + " algorithm = \"TC\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_tc(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_tc(g_cu, mg=True)\n", + " print(\" \")\n", + " \n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- Core Number\n", + " algorithm = \"Core Number\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_core_num(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_core_num(g_cu, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- PageRank\n", + " algorithm = \"PageRank\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_pagerank(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_pagerank(g_cu, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- Jaccard\n", + " algorithm = \"Jaccard\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + "\n", + " print(\"n.\", end='')\n", + " tx = nx_jaccard(g_nx)\n", + " print(\"c.\", end='')\n", + " tc = cu_jaccard(g_cu, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " # Seed for BFS and SSSP\n", + " nx_seed = list(g_nx.nodes)[0]\n", + " cu_seed = g_cu.nodes().compute().to_pandas().iloc[0]\n", + "\n", + " #-- BFS\n", + " algorithm = \"BFS\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_bfs(g_nx, nx_seed)\n", + " print(\"c.\", end='')\n", + " tc = cu_bfs(g_cu, seed = cu_seed, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " #-- SSSP\n", + " algorithm = \"SSSP\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", + " print(\"n.\", end='')\n", + " tx = nx_sssp(g_nx, nx_seed)\n", + "\n", + " print(\"c.\", end='')\n", + " tc = cu_sssp(g_cu, seed = cu_seed, mg=True)\n", + " print(\" \")\n", + "\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", + "\n", + " del g_cu, g_nx\n", + " gc.collect()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### cuGraph speedup of different algorithms w.r.t. NX" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX)------\\n\")\n", + "print(pd.DataFrame(perf))\n", + "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX, excluding graph creation time)------\\n\")\n", + "print(pd.DataFrame(perf_algos))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Nx and cuGraph execution times for different algorithms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "nx_and_cugraph_run_times = pd.DataFrame()\n", + "for dataset in cugraph_algo_run_times.keys():\n", + " temp_df = pd.DataFrame({'NX': nx_algo_run_times[dataset], 'cuGraph': cugraph_algo_run_times[dataset]})\n", + " columns = [(dataset, 'cuGraph'), (dataset, 'NX')]\n", + " temp_df.columns = pd.MultiIndex.from_tuples(columns)\n", + " nx_and_cugraph_run_times = pd.concat([temp_df, nx_and_cugraph_run_times], axis=1)\n", + "\n", + "print(\"\\n\\t------Nx and cuGraph execution times for different algorithms-----\\n\")\n", + "print(nx_and_cugraph_run_times)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clean up multi-GPU environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Comms.destroy()\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "___\n", + "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n", + "\n", + "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\n", + "\n", + "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.\n", + "___" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cudfdev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.1.0" + }, + "vscode": { + "interpreter": { + "hash": "587ff963ecd34554a9da41c94362e2baa062d9a57502e220f049e10816826984" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 108c36ebdc352cdae3ef4d5d8ec547f72a357322 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Thu, 15 Feb 2024 05:30:26 -0600 Subject: [PATCH 320/384] Support CUDA 12.2 (#4088) * switches to CUDA 12.2.2 for building conda packages and wheels * adds new tests running against CUDA 12.2.2 ### Notes for Reviewers This is part of ongoing work to build and test packages against CUDA 12.2.2 across all of RAPIDS. For more details see: * https://github.com/rapidsai/build-planning/issues/7 * https://github.com/rapidsai/shared-workflows/pull/166 Planning a second round of PRs to revert these references back to a proper `branch-24.{nn}` release branch of `shared-workflows` once https://github.com/rapidsai/shared-workflows/pull/166 is merged. *(created with `rapids-reviser`)* Authors: - James Lamb (https://github.com/jameslamb) - Bradley Dice (https://github.com/bdice) - Vyas Ramasubramani (https://github.com/vyasr) - https://github.com/jakirkham Approvers: - Jake Awe (https://github.com/AyodeAwe) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/4088 --- docs/cugraph/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 141e14a04..719f94d48 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018-2023, NVIDIA CORPORATION. +# Copyright (c) 2018-2024, NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by # sphinx-quickstart on Wed May 3 10:59:22 2017. From 62a2e24461b975de9ae55ae247ab232d07bd62a8 Mon Sep 17 00:00:00 2001 From: Naim <110031745+naimnv@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:47:30 +0100 Subject: [PATCH 321/384] Update SG notebook (#4169) Update SG notebook to handle a handle a couple of cases where the current notebook would fail for unweighted graph and if the graph doesn't have node id 0. **Changes for SG notebook:** - For graphs without weights, run bfs instead of sssp. - For the input graph doesn't have node with id 0, peek an existing node id as seed for BFS and SSP - simplify bookkeeping for run statistics **Changes for MG notebook:** - Call SSSP or BFS based on weighted attribute Authors: - Naim (https://github.com/naimnv) Approvers: - Brad Rees (https://github.com/BradReesWork) - Don Acosta (https://github.com/acostadon) URL: https://github.com/rapidsai/cugraph/pull/4169 --- ...e.ipynb => synth_release_single_gpu.ipynb} | 276 ++++++++---------- .../synth_release_single_node_multi_gpu.ipynb | 43 +-- 2 files changed, 154 insertions(+), 165 deletions(-) rename notebooks/cugraph_benchmarks/{synth_release.ipynb => synth_release_single_gpu.ipynb} (77%) diff --git a/notebooks/cugraph_benchmarks/synth_release.ipynb b/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb similarity index 77% rename from notebooks/cugraph_benchmarks/synth_release.ipynb rename to notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb index 18979f3ec..1acef5d55 100644 --- a/notebooks/cugraph_benchmarks/synth_release.ipynb +++ b/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb @@ -40,7 +40,8 @@ "| Author | Date | Update | cuGraph Version | Test Hardware |\n", "| --------------|------------|---------------------|-----------------|------------------------|\n", "| Don Acosta | 1/12/2023 | Created | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", - "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | RTX A6000, CUDA 11.7 |\n" + "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", + "| Naim, Md | 2/12/2024 | Modified | 24.04 nightly | RTX A6000, CUDA 12.0 |\n" ] }, { @@ -124,12 +125,11 @@ "import gc\n", "import os\n", "from time import perf_counter\n", - "import numpy as np\n", - "import math\n", + "import pandas as pd\n", + "from collections import defaultdict\n", "\n", "# rapids\n", "import cugraph\n", - "import cudf\n", "\n", "# NetworkX libraries\n", "import networkx as nx\n", @@ -212,7 +212,7 @@ "\n", "\n", "# Which dataset is to be used\n", - "data = data_full\n" + "data = data_quick\n" ] }, { @@ -518,16 +518,13 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_bfs(_G):\n", - " seed = 0\n", + "def nx_bfs(_G, seed):\n", " t1 = perf_counter()\n", - " nb = nx.bfs_edges(_G, seed)\n", - " nb_list = list(nb) # gen -> list\n", + " _ = nx.bfs_edges(_G, seed)\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", - "def cu_bfs(_G):\n", - " seed = 0\n", + "def cu_bfs(_G, seed):\n", " t1 = perf_counter()\n", " _ = cugraph.bfs(_G, seed)\n", " t2 = perf_counter() - t1\n", @@ -547,17 +544,21 @@ "metadata": {}, "outputs": [], "source": [ - "def nx_sssp(_G):\n", - " seed = 0\n", + "def nx_sssp(_G, seed):\n", " t1 = perf_counter()\n", - " _ = nx.shortest_path(_G, seed)\n", + " if nx.is_weighted(_G):\n", + " _ = nx.shortest_path(_G, seed)\n", + " else:\n", + " _ = nx.bfs_edges(_G, seed)\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", - "def cu_sssp(_G):\n", - " seed = 0\n", + "def cu_sssp(_G, seed):\n", " t1 = perf_counter()\n", - " _ = cugraph.sssp(_G, seed)\n", + " if _G.weighted:\n", + " _ = cugraph.sssp(_G, seed)\n", + " else:\n", + " _ = cugraph.bfs(_G, seed)\n", " t2 = perf_counter() - t1\n", " return t2\n" ] @@ -571,6 +572,27 @@ "# Benchmark" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Placeholders to collect algorithm run statistics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cugraph_algo_run_times = defaultdict(defaultdict)\n", + "nx_algo_run_times = defaultdict(defaultdict)\n", + "cugraph_graph_creation_times = defaultdict()\n", + "nx_graph_creation_times = defaultdict()\n", + "perf_algos = defaultdict(defaultdict)\n", + "perf = defaultdict(defaultdict)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -587,79 +609,50 @@ "metadata": {}, "outputs": [], "source": [ - "# arrays to capture performance gains\n", - "names = []\n", - "algos = []\n", - "graph_create_cu = []\n", - "graph_create_nx = []\n", - "\n", - "# Two dimension data [file, perf]\n", - "time_algo_nx = [] # NetworkX\n", - "time_algo_cu = [] # cuGraph\n", - "perf = []\n", - "perf_algo = []\n", "\n", - "algos.append(\" \")\n", - "\n", - "i = 0\n", - "for k,v in data.items():\n", - " # init all the 2-d arrays\n", - " time_algo_nx.append([])\n", - " time_algo_cu.append([])\n", - " perf.append([])\n", - " perf_algo.append([])\n", - "\n", - " # Saved the file Name\n", - " names.append(k)\n", + "for dataset, scale in data.items():\n", "\n", " # generate data\n", " print(\"------------------------------\")\n", - " print(f'Creating Graph of Scale = {v}')\n", - "\n", - " gdf = generate_data(v)\n", + " print(f'Creating Graph of Scale = {scale}')\n", + " \n", + " gdf = generate_data(scale)\n", " pdf = gdf.to_pandas()\n", - " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", "\n", - " # create the graphs\n", + " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n", + " \n", + " # create cuGraph and NX graphs\n", " g_cu, tcu = create_cu_graph(gdf)\n", " g_nx, tnx = create_nx_graph(pdf)\n", - " graph_create_cu.append(tcu)\n", - " graph_create_nx.append(tnx)\n", + " cugraph_graph_creation_times[dataset] = tcu\n", + " nx_graph_creation_times[dataset] = tnx\n", " del gdf, pdf\n", "\n", " # prep\n", " deg = g_cu.degree()\n", " deg_max = deg['degree'].max()\n", - "\n", " alpha = 1 / deg_max\n", " num_nodes = g_cu.number_of_vertices()\n", - "\n", " del deg\n", " gc.collect()\n", "\n", - " #----- Algorithm order is same as defined at top ----\n", - "\n", " #-- Katz \n", - " print(\"\\tKatz \", end = '')\n", - " if i == 0: \n", - " algos.append(\"Katz\")\n", - "\n", + " algorithm = \"Katz\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", " tx = nx_katz(g_nx, alpha)\n", " print(\"c.\", end='')\n", " tc = cu_katz(g_cu, alpha)\n", " print(\"\")\n", - "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " \n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- BC\n", - " print(\"\\tBC k=100 \", end='')\n", - " if i == 0:\n", - " algos.append(\"BC Estimate fixed\")\n", - "\n", + " algorithm = \"BC\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " k = 100\n", " if k > num_nodes:\n", " k = int(num_nodes)\n", @@ -668,80 +661,70 @@ " print(\"c.\", end='')\n", " tc = cu_bc(g_cu, k)\n", " print(\" \")\n", - "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- Louvain\n", - " print(\"\\tLouvain \", end='')\n", - " if i == 0:\n", - " algos.append(\"Louvain\")\n", - "\n", + " algorithm = \"Louvain\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", " tx = nx_louvain(g_nx)\n", " print(\"c.\", end='')\n", " tc = cu_louvain(g_cu)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- TC\n", - " print(\"\\tTC \", end='')\n", - " if i == 0:\n", - " algos.append(\"TC\")\n", - "\n", + " algorithm = \"TC\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", " tx = nx_tc(g_nx)\n", " print(\"c.\", end='')\n", " tc = cu_tc(g_cu)\n", " print(\" \")\n", - "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " \n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- Core Number\n", - " print(\"\\tCore Number \", end='')\n", - " if i == 0:\n", - " algos.append(\"Core Number\")\n", - "\n", + " algorithm = \"Core Number\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", " tx = nx_core_num(g_nx)\n", " print(\"c.\", end='')\n", " tc = cu_core_num(g_cu)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- PageRank\n", - " print(\"\\tPageRank \", end='')\n", - " if i == 0:\n", - " algos.append(\"PageRank\")\n", - "\n", + " algorithm = \"PageRank\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", " tx = nx_pagerank(g_nx)\n", " print(\"c.\", end='')\n", " tc = cu_pagerank(g_cu)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- Jaccard\n", - " print(\"\\tJaccard \", end='')\n", - " if i == 0:\n", - " algos.append(\"Jaccard\")\n", + " algorithm = \"Jaccard\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", "\n", " print(\"n.\", end='')\n", " tx = nx_jaccard(g_nx)\n", @@ -749,46 +732,44 @@ " tc = cu_jaccard(g_cu)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", - " #-- BFS\n", - " print(\"\\tBFS \", end='')\n", - " if i == 0:\n", - " algos.append(\"BFS\")\n", + " # Seed for BFS and SSSP\n", + " nx_seed = list(g_nx.nodes)[0]\n", + " cu_seed = g_cu.nodes().to_pandas().iloc[0]\n", "\n", + " #-- BFS\n", + " algorithm = \"BFS\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", - " tx = nx_bfs(g_nx)\n", + " tx = nx_bfs(g_nx, seed=nx_seed)\n", " print(\"c.\", end='')\n", - " tc = cu_bfs(g_cu)\n", + " tc = cu_bfs(g_cu, seed=cu_seed)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", " #-- SSSP\n", - " print(\"\\tSSSP \", end='')\n", - " if i == 0:\n", - " algos.append(\"SSP\")\n", - "\n", + " algorithm = \"SSSP\"\n", + " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", - " tx = nx_sssp(g_nx)\n", + " tx = nx_sssp(g_nx, seed=nx_seed)\n", + "\n", " print(\"c.\", end='')\n", - " tc = cu_sssp(g_cu)\n", + " tc = cu_sssp(g_cu, seed=cu_seed)\n", " print(\" \")\n", "\n", - " time_algo_nx[i].append(tx)\n", - " time_algo_cu[i].append(tc)\n", - " perf_algo[i].append ( (tx/tc) )\n", - " perf[i].append( (tx + tnx) / (tc + tcu) )\n", + " nx_algo_run_times[dataset][algorithm] = tx\n", + " cugraph_algo_run_times[dataset][algorithm] = tc\n", + " perf_algos[dataset][algorithm] = tx/tc \n", + " perf[dataset][algorithm] = (tx + tnx) / (tc + tcu)\n", "\n", - " # increament count\n", - " i = i + 1\n", - " \n", " del g_cu, g_nx\n", " gc.collect()\n" ] @@ -799,13 +780,11 @@ "metadata": {}, "outputs": [], "source": [ - "#Print results\n", - "print(algos)\n", - "\n", - "for i in range(num_datasets):\n", - " print(f\"{names[i]}\")\n", - " print(f\"{perf[i]}\")\n", - " print(f\"{perf_algo[i]}\")" + "# Speedup\n", + "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX)------\\n\")\n", + "print(pd.DataFrame(perf))\n", + "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX, excluding graph creation time)------\\n\")\n", + "print(pd.DataFrame(perf_algos))" ] }, { @@ -814,15 +793,16 @@ "metadata": {}, "outputs": [], "source": [ - "#Print results\n", - "print(\"\\n------------------------------\")\n", - "print(\"\\tAlgorithm Run times (NX then cuGraph)\\n\")\n", + "# Nx and cuGraph execution times for different algorithms\n", + "nx_and_cugraph_run_times = pd.DataFrame()\n", + "for dataset in cugraph_algo_run_times.keys():\n", + " temp_df = pd.DataFrame({'NX': nx_algo_run_times[dataset], 'cuGraph': cugraph_algo_run_times[dataset]})\n", + " columns = [(dataset, 'cuGraph'), (dataset, 'NX')]\n", + " temp_df.columns = pd.MultiIndex.from_tuples(columns)\n", + " nx_and_cugraph_run_times = pd.concat([temp_df, nx_and_cugraph_run_times], axis=1)\n", "\n", - "print(algos)\n", - "for i in range(num_datasets):\n", - " print(f\"{names[i]}\")\n", - " print(f\"{time_algo_nx[i]}\")\n", - " print(f\"{time_algo_cu[i]}\")" + "print(\"\\n\\t------cuGraph and NX execution times for different algorithms-----\\n\")\n", + "print(nx_and_cugraph_run_times)" ] }, { @@ -855,7 +835,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15 | packaged by conda-forge | (main, Nov 22 2022, 15:55:03) \n[GCC 10.4.0]" + "version": "3.1.0" }, "vscode": { "interpreter": { diff --git a/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb b/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb index c44f475c4..dd0983016 100644 --- a/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb +++ b/notebooks/cugraph_benchmarks/synth_release_single_node_multi_gpu.ipynb @@ -39,9 +39,9 @@ " \n", "| Author | Date | Update | cuGraph Version | Test Hardware |\n", "| --------------|------------|---------------------|-----------------|------------------------|\n", - "| Don Acosta | 1/12/2023 | Created | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", - "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", - "| Naim, Md | 2/08/2024 | Modified for SNMG | 24.04 nightly | RTX A6000, CUDA 12.0 |\n" + "| Don Acosta | 1/12/2023 | Created | 23.02 nightly | 2xRTX A6000, CUDA 11.7 |\n", + "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | 2xRTX A6000, CUDA 11.7 |\n", + "| Naim, Md | 2/08/2024 | Modified for SNMG | 24.04 nightly | 2xRTX A6000, CUDA 12.0 |\n" ] }, { @@ -590,7 +590,10 @@ "source": [ "def nx_sssp(_G, seed):\n", " t1 = perf_counter()\n", - " _ = nx.shortest_path(_G, seed)\n", + " if nx.is_weighted(_G):\n", + " _ = nx.shortest_path(_G, seed)\n", + " else:\n", + " _ = nx.bfs_edges(_G, seed)\n", " t2 = perf_counter() - t1\n", " return t2\n", "\n", @@ -599,9 +602,17 @@ " t1 = perf_counter()\n", " # SSSP requires weighted graph\n", " if mg:\n", - " _ = cugraph.dask.bfs(_G, seed)\n", + " if _G.weighted: \n", + " _ = cugraph.dask.sssp(_G, seed)\n", + " else:\n", + " _ = cugraph.dask.bfs(_G, seed)\n", + "\n", " else:\n", - " _ = cugraph.bfs(_G, seed)\n", + " if _G.weighted:\n", + " _ = cugraph.ssp(_G, seed)\n", + " else:\n", + " _ = cugraph.bfs(_G, seed)\n", + "\n", " t2 = perf_counter() - t1\n", " return t2\n" ] @@ -646,14 +657,12 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", - "nx_algo_run_times = defaultdict(defaultdict)\n", "cugraph_algo_run_times = defaultdict(defaultdict)\n", - "perf_algos = defaultdict(defaultdict)\n", - "perf = defaultdict(defaultdict)\n", + "nx_algo_run_times = defaultdict(defaultdict)\n", "cugraph_graph_creation_times = defaultdict()\n", - "nx_graph_creation_times = defaultdict()\n" + "nx_graph_creation_times = defaultdict()\n", + "perf_algos = defaultdict(defaultdict)\n", + "perf = defaultdict(defaultdict)" ] }, { @@ -811,9 +820,9 @@ " algorithm = \"BFS\"\n", " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", - " tx = nx_bfs(g_nx, nx_seed)\n", + " tx = nx_bfs(g_nx, seed=nx_seed)\n", " print(\"c.\", end='')\n", - " tc = cu_bfs(g_cu, seed = cu_seed, mg=True)\n", + " tc = cu_bfs(g_cu, seed=cu_seed, mg=True)\n", " print(\" \")\n", "\n", " nx_algo_run_times[dataset][algorithm] = tx\n", @@ -825,10 +834,10 @@ " algorithm = \"SSSP\"\n", " print(f\"\\t{algorithm} \", end = '')\n", " print(\"n.\", end='')\n", - " tx = nx_sssp(g_nx, nx_seed)\n", + " tx = nx_sssp(g_nx, seed=nx_seed)\n", "\n", " print(\"c.\", end='')\n", - " tc = cu_sssp(g_cu, seed = cu_seed, mg=True)\n", + " tc = cu_sssp(g_cu, seed=cu_seed, mg=True)\n", " print(\" \")\n", "\n", " nx_algo_run_times[dataset][algorithm] = tx\n", @@ -856,7 +865,7 @@ "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX)------\\n\")\n", "print(pd.DataFrame(perf))\n", "print(\"\\n\\t------Speedup (cuGraph w.r.t. NX, excluding graph creation time)------\\n\")\n", - "print(pd.DataFrame(perf_algos))\n" + "print(pd.DataFrame(perf_algos))" ] }, { From dfdca8130b4eea35b567f1e5b6f5715926f280ef Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Sun, 25 Feb 2024 18:06:16 -0600 Subject: [PATCH 322/384] Update `louvain_communities` to match NetworkX 3.3 (added max_level) (#4177) We already supported `max_level=`, and this was just upstreamed to networkx here: https://github.com/networkx/networkx/pull/6909 Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4177 --- python/nx-cugraph/_nx_cugraph/__init__.py | 1 - .../algorithms/community/louvain.py | 19 ++++++++++++++----- python/nx-cugraph/nx_cugraph/interface.py | 6 ++++++ .../nx_cugraph/tests/test_match_api.py | 10 +++++++++- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index a57c43944..64614fa39 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -164,7 +164,6 @@ }, "louvain_communities": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", - "max_level : int, optional": "Upper limit of the number of macro-iterations (max: 500).", }, "pagerank": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index f58f1000f..f7638f47a 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -12,6 +12,7 @@ # limitations under the License. import warnings +import networkx as nx import pylibcugraph as plc from nx_cugraph.convert import _to_undirected_graph @@ -25,13 +26,21 @@ __all__ = ["louvain_communities"] +# max_level argument was added to NetworkX 3.3 +if nx.__version__[:3] <= "3.2": + _max_level_param = { + "max_level : int, optional": ( + "Upper limit of the number of macro-iterations (max: 500)." + ) + } +else: + _max_level_param = {} + @not_implemented_for("directed") @networkx_algorithm( extra_params={ - "max_level : int, optional": ( - "Upper limit of the number of macro-iterations (max: 500)." - ), + **_max_level_param, **_dtype_param, }, is_incomplete=True, # seed not supported; self-loops not supported @@ -44,9 +53,9 @@ def louvain_communities( weight="weight", resolution=1, threshold=0.0000001, + max_level=None, seed=None, *, - max_level=None, dtype=None, ): """`seed` parameter is currently ignored, and self-loops are not yet supported.""" @@ -82,9 +91,9 @@ def _( weight="weight", resolution=1, threshold=0.0000001, + max_level=None, seed=None, *, - max_level=None, dtype=None, ): # NetworkX allows both directed and undirected, but cugraph only allows undirected. diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 46ea5831b..3c62fc362 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -257,6 +257,12 @@ def key(testpath): ): different_iteration_order, } ) + elif nxver.minor >= 3: + xfail.update( + { + key("test_louvain.py:test_max_level"): louvain_different, + } + ) too_slow = "Too slow to run" skip = { diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py index a654ff343..595f7819a 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -14,10 +14,13 @@ import inspect import networkx as nx +from packaging.version import parse import nx_cugraph as nxcg from nx_cugraph.utils import networkx_algorithm +nxver = parse(nx.__version__) + def test_match_signature_and_names(): """Simple test to ensure our signatures and basic module layout match networkx.""" @@ -41,6 +44,11 @@ def test_match_signature_and_names(): else: orig_func = dispatchable_func.orig_func + if nxver.major == 3 and nxver.minor <= 2 and name == "louvain_communities": + # The signature of louvain_communities changed in NetworkX 3.3, and + # we updated to match, so we skip this check in older versions. + continue + # Matching signatures? orig_sig = inspect.signature(orig_func) func_sig = inspect.signature(func) From 4f4f761ec4aa0fa48b9b964c25e2f2c8b4914a8a Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Mon, 26 Feb 2024 14:43:25 -0600 Subject: [PATCH 323/384] nx-cugraph: update `get_info` function keys to NetworkX 3.3 (#4192) Updating to match changes from https://github.com/networkx/networkx/pull/7219 Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4192 --- python/nx-cugraph/_nx_cugraph/__init__.py | 32 +++++++++++++---------- python/nx-cugraph/_nx_cugraph/core.py | 24 ++++++++--------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 64614fa39..c6c43110a 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -126,8 +126,8 @@ "wheel_graph", # END: functions }, - "extra_docstrings": { - # BEGIN: extra_docstrings + "additional_docs": { + # BEGIN: additional_docs "average_clustering": "Directed graphs and `weight` parameter are not yet supported.", "betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.", "bfs_edges": "`sort_neighbors` parameter is not yet supported.", @@ -148,10 +148,10 @@ "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.", "pagerank": "`dangling` parameter is not supported, but it is checked for validity.", "transitivity": "Directed graphs are not yet supported.", - # END: extra_docstrings + # END: additional_docs }, - "extra_parameters": { - # BEGIN: extra_parameters + "additional_parameters": { + # BEGIN: additional_parameters "eigenvector_centrality": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", }, @@ -168,7 +168,7 @@ "pagerank": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", }, - # END: extra_parameters + # END: additional_parameters }, } @@ -178,20 +178,24 @@ def get_info(): This tells NetworkX about the cugraph backend without importing nx_cugraph. """ - # Convert to e.g. `{"functions": {"myfunc": {"extra_docstring": ...}}}` + # Convert to e.g. `{"functions": {"myfunc": {"additional_docs": ...}}}` d = _info.copy() - info_keys = { - "extra_docstrings": "extra_docstring", - "extra_parameters": "extra_parameters", - } + info_keys = {"additional_docs", "additional_parameters"} d["functions"] = { func: { - new_key: vals[func] - for old_key, new_key in info_keys.items() - if func in (vals := d[old_key]) + info_key: vals[func] + for info_key in info_keys + if func in (vals := d[info_key]) } for func in d["functions"] } + # Add keys for Networkx <3.3 + for func_info in d["functions"].values(): + if "additional_docs" in func_info: + func_info["extra_docstring"] = func_info["additional_docs"] + if "additional_parameters" in func_info: + func_info["extra_parameters"] = func_info["additional_parameters"] + for key in info_keys: del d[key] return d diff --git a/python/nx-cugraph/_nx_cugraph/core.py b/python/nx-cugraph/_nx_cugraph/core.py index 72f920389..c4de197f3 100644 --- a/python/nx-cugraph/_nx_cugraph/core.py +++ b/python/nx-cugraph/_nx_cugraph/core.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-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 @@ -24,13 +24,13 @@ def get_functions(): } -def get_extra_docstrings(functions=None): +def get_additional_docs(functions=None): if functions is None: functions = get_functions() return {key: val.extra_doc for key, val in functions.items() if val.extra_doc} -def get_extra_parameters(functions=None): +def get_additional_parameters(functions=None): if functions is None: functions = get_functions() return {key: val.extra_params for key, val in functions.items() if val.extra_params} @@ -73,18 +73,18 @@ def main(filepath): to_add = [f'"{name}",' for name in sorted(functions)] text = update_text(text, to_add, "functions") - # Update extra_docstrings - extra_docstrings = get_extra_docstrings(functions) - to_add = list(dict_to_lines(extra_docstrings)) - text = update_text(text, to_add, "extra_docstrings") + # Update additional_docs + additional_docs = get_additional_docs(functions) + to_add = list(dict_to_lines(additional_docs)) + text = update_text(text, to_add, "additional_docs") - # Update extra_parameters - extra_parameters = get_extra_parameters(functions) + # Update additional_parameters + additional_parameters = get_additional_parameters(functions) to_add = [] - for name in sorted(extra_parameters): - params = extra_parameters[name] + for name in sorted(additional_parameters): + params = additional_parameters[name] to_add.append(f"{name!r}: {{") to_add.extend(dict_to_lines(params, indent=" " * 4)) to_add.append("},") - text = update_text(text, to_add, "extra_parameters") + text = update_text(text, to_add, "additional_parameters") return text From ec8ddd09edb1ea15729d74e82e6b5b73429f268d Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Tue, 27 Feb 2024 13:53:26 -0600 Subject: [PATCH 324/384] nx-cugraph: automatically generate trees in README.md (#4156) This updates how we create trees. Also, CI now tests that auto-generated files are up-to-date (not updating these has gotten me a couple of times). Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Jake Awe (https://github.com/AyodeAwe) URL: https://github.com/rapidsai/cugraph/pull/4156 --- .gitignore | 2 + .pre-commit-config.yaml | 3 +- python/nx-cugraph/Makefile | 13 +- python/nx-cugraph/README.md | 270 +++++++++--------- python/nx-cugraph/lint.yaml | 12 +- .../algorithms/link_analysis/hits_alg.py | 6 +- .../algorithms/link_analysis/pagerank_alg.py | 6 +- python/nx-cugraph/nx_cugraph/classes/graph.py | 3 +- .../nx_cugraph/classes/multigraph.py | 4 +- python/nx-cugraph/nx_cugraph/interface.py | 6 +- .../nx_cugraph/scripts/print_table.py | 3 +- .../nx_cugraph/scripts/print_tree.py | 122 +++++--- python/nx-cugraph/pyproject.toml | 13 +- python/nx-cugraph/scripts/update_readme.py | 203 +++++++++++++ 14 files changed, 453 insertions(+), 213 deletions(-) create mode 100644 python/nx-cugraph/scripts/update_readme.py diff --git a/.gitignore b/.gitignore index 358650cfc..2fea10229 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,8 @@ datasets/* !datasets/karate-disjoint.csv !datasets/netscience.csv +# nx-cugraph side effects +python/nx-cugraph/objects.inv .pydevproject diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 188ea1a26..6b7ff1441 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,8 +15,9 @@ repos: hooks: - id: black language_version: python3 - args: [--target-version=py38] + args: [--target-version=py39] files: ^(python/.*|benchmarks/.*)$ + exclude: ^python/nx-cugraph/ - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 hooks: diff --git a/python/nx-cugraph/Makefile b/python/nx-cugraph/Makefile index 6e1b98ee6..6500d834e 100644 --- a/python/nx-cugraph/Makefile +++ b/python/nx-cugraph/Makefile @@ -1,12 +1,12 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. +# Copyright (c) 2023-2024, NVIDIA CORPORATION. SHELL= /bin/bash .PHONY: all -all: plugin-info lint +all: plugin-info lint readme .PHONY: lint lint: - git ls-files | xargs pre-commit run --config lint.yaml --files + git ls-files | xargs pre-commit run --config lint.yaml --files || true .PHONY: lint-update lint-update: @@ -15,3 +15,10 @@ lint-update: .PHONY: plugin-info plugin-info: python _nx_cugraph/__init__.py + +objects.inv: + wget https://networkx.org/documentation/stable/objects.inv + +.PHONY: readme +readme: objects.inv + python scripts/update_readme.py README.md objects.inv diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index 5d0554734..8201dc34e 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -91,144 +91,144 @@ familiar and easy-to-use API. Below is the list of algorithms that are currently supported in nx-cugraph. -### Algorithms - -``` -bipartite - ├─ basic - │ └─ is_bipartite - └─ generators - └─ complete_bipartite_graph -centrality - ├─ betweenness - │ ├─ betweenness_centrality - │ └─ edge_betweenness_centrality - ├─ degree_alg - │ ├─ degree_centrality - │ ├─ in_degree_centrality - │ └─ out_degree_centrality - ├─ eigenvector - │ └─ eigenvector_centrality - └─ katz - └─ katz_centrality -cluster - ├─ average_clustering - ├─ clustering - ├─ transitivity - └─ triangles -community - └─ louvain - └─ louvain_communities -components - ├─ connected - │ ├─ connected_components - │ ├─ is_connected - │ ├─ node_connected_component - │ └─ number_connected_components - └─ weakly_connected - ├─ is_weakly_connected - ├─ number_weakly_connected_components - └─ weakly_connected_components -core - ├─ core_number - └─ k_truss -dag - ├─ ancestors - └─ descendants -isolate - ├─ is_isolate - ├─ isolates - └─ number_of_isolates -link_analysis - ├─ hits_alg - │ └─ hits - └─ pagerank_alg - └─ pagerank -operators - └─ unary - ├─ complement - └─ reverse -reciprocity - ├─ overall_reciprocity - └─ reciprocity -shortest_paths - └─ unweighted - ├─ single_source_shortest_path_length - └─ single_target_shortest_path_length -traversal - └─ breadth_first_search - ├─ bfs_edges - ├─ bfs_layers - ├─ bfs_predecessors - ├─ bfs_successors - ├─ bfs_tree - ├─ descendants_at_distance - └─ generic_bfs_edges -tree - └─ recognition - ├─ is_arborescence - ├─ is_branching - ├─ is_forest - └─ is_tree -``` - -### Generators - -``` -classic - ├─ barbell_graph - ├─ circular_ladder_graph - ├─ complete_graph - ├─ complete_multipartite_graph - ├─ cycle_graph - ├─ empty_graph - ├─ ladder_graph - ├─ lollipop_graph - ├─ null_graph - ├─ path_graph - ├─ star_graph - ├─ tadpole_graph - ├─ trivial_graph - ├─ turan_graph - └─ wheel_graph -community - └─ caveman_graph -small - ├─ bull_graph - ├─ chvatal_graph - ├─ cubical_graph - ├─ desargues_graph - ├─ diamond_graph - ├─ dodecahedral_graph - ├─ frucht_graph - ├─ heawood_graph - ├─ house_graph - ├─ house_x_graph - ├─ icosahedral_graph - ├─ krackhardt_kite_graph - ├─ moebius_kantor_graph - ├─ octahedral_graph - ├─ pappus_graph - ├─ petersen_graph - ├─ sedgewick_maze_graph - ├─ tetrahedral_graph - ├─ truncated_cube_graph - ├─ truncated_tetrahedron_graph - └─ tutte_graph -social - ├─ davis_southern_women_graph - ├─ florentine_families_graph - ├─ karate_club_graph - └─ les_miserables_graph -``` +### [Algorithms](https://networkx.org/documentation/latest/reference/algorithms/index.html) + + + +### [Generators](https://networkx.org/documentation/latest/reference/generators.html) + +
+classic
+ ├─ barbell_graph
+ ├─ circular_ladder_graph
+ ├─ complete_graph
+ ├─ complete_multipartite_graph
+ ├─ cycle_graph
+ ├─ empty_graph
+ ├─ ladder_graph
+ ├─ lollipop_graph
+ ├─ null_graph
+ ├─ path_graph
+ ├─ star_graph
+ ├─ tadpole_graph
+ ├─ trivial_graph
+ ├─ turan_graph
+ └─ wheel_graph
+community
+ └─ caveman_graph
+small
+ ├─ bull_graph
+ ├─ chvatal_graph
+ ├─ cubical_graph
+ ├─ desargues_graph
+ ├─ diamond_graph
+ ├─ dodecahedral_graph
+ ├─ frucht_graph
+ ├─ heawood_graph
+ ├─ house_graph
+ ├─ house_x_graph
+ ├─ icosahedral_graph
+ ├─ krackhardt_kite_graph
+ ├─ moebius_kantor_graph
+ ├─ octahedral_graph
+ ├─ pappus_graph
+ ├─ petersen_graph
+ ├─ sedgewick_maze_graph
+ ├─ tetrahedral_graph
+ ├─ truncated_cube_graph
+ ├─ truncated_tetrahedron_graph
+ └─ tutte_graph
+social
+ ├─ davis_southern_women_graph
+ ├─ florentine_families_graph
+ ├─ karate_club_graph
+ └─ les_miserables_graph
+
### Other -``` -convert_matrix - ├─ from_pandas_edgelist - └─ from_scipy_sparse_array -``` +
+convert_matrix
+ ├─ from_pandas_edgelist
+ └─ from_scipy_sparse_array
+
To request nx-cugraph backend support for a NetworkX API that is not listed above, visit the [cuGraph GitHub repo](https://github.com/rapidsai/cugraph). diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 8e87fc235..fdd24861d 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -31,7 +31,7 @@ repos: - id: validate-pyproject name: Validate pyproject.toml - repo: https://github.com/PyCQA/autoflake - rev: v2.2.1 + rev: v2.3.0 hooks: - id: autoflake args: [--in-place] @@ -40,17 +40,17 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.15.0 + rev: v3.15.1 hooks: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/psf/black - rev: 23.12.1 + rev: 24.2.0 hooks: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.14 + rev: v0.2.2 hooks: - id: ruff args: [--fix-only, --show-fixes] # --unsafe-fixes] @@ -62,7 +62,7 @@ repos: additional_dependencies: &flake8_dependencies # These versions need updated manually - flake8==7.0.0 - - flake8-bugbear==24.1.17 + - flake8-bugbear==24.2.6 - flake8-simplify==0.21.0 - repo: https://github.com/asottile/yesqa rev: v1.5.0 @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.14 + rev: v0.2.2 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py index 9e723624a..e61a931c0 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py @@ -66,9 +66,9 @@ def hits( resource_handle=plc.ResourceHandle(), graph=G._get_plc_graph(weight, 1, dtype, store_transposed=True), tol=tol, - initial_hubs_guess_vertices=None - if nstart is None - else cp.arange(N, dtype=index_dtype), + initial_hubs_guess_vertices=( + None if nstart is None else cp.arange(N, dtype=index_dtype) + ), initial_hubs_guess_values=nstart, max_iter=max_iter, normalized=normalized, diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py index 55fcc3e52..40224e91d 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py @@ -78,9 +78,9 @@ def pagerank( "graph": G._get_plc_graph(weight, 1, dtype, store_transposed=True), "precomputed_vertex_out_weight_vertices": None, "precomputed_vertex_out_weight_sums": None, - "initial_guess_vertices": None - if nstart is None - else cp.arange(N, dtype=index_dtype), + "initial_guess_vertices": ( + None if nstart is None else cp.arange(N, dtype=index_dtype) + ), "initial_guess_values": nstart, "alpha": alpha, "epsilon": N * tol, diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index 0951ee6b1..5132e6a54 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -634,8 +634,7 @@ def _get_plc_graph( "pylibcugraph only supports float16 and float32 dtypes." ) elif ( - edge_array.dtype == np.uint64 - and edge_array.max().tolist() > 2**53 + edge_array.dtype == np.uint64 and edge_array.max().tolist() > 2**53 ): raise ValueError( f"Integer value of value is too large (> 2**53): {val}; " diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py index fb787369e..de58474de 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -360,9 +360,7 @@ def get_edge_data( if k not in self.edge_masks or self.edge_masks[k][index] } return { - edge_keys[index] - if edge_keys is not None - else index: { + edge_keys[index] if edge_keys is not None else index: { k: v[index].tolist() for k, v in self.edge_values.items() if k not in self.edge_masks or self.edge_masks[k][index] diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 3c62fc362..d044ba696 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -220,9 +220,9 @@ def key(testpath): ) if sys.version_info[:2] == (3, 9): # This test is sensitive to RNG, which depends on Python version - xfail[ - key("test_louvain.py:test_threshold") - ] = "Louvain does not support seed parameter" + xfail[key("test_louvain.py:test_threshold")] = ( + "Louvain does not support seed parameter" + ) if nxver.major == 3 and nxver.minor >= 2: xfail.update( { diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_table.py b/python/nx-cugraph/nx_cugraph/scripts/print_table.py index 117a1444f..7c9028124 100755 --- a/python/nx-cugraph/nx_cugraph/scripts/print_table.py +++ b/python/nx-cugraph/nx_cugraph/scripts/print_table.py @@ -61,7 +61,8 @@ def main(path_to_info=None, *, file=sys.stdout): lines = ["networkx_path,dispatch_name,version_added,plc,is_incomplete,is_different"] lines.extend(",".join(map(str, info)) for info in path_to_info.values()) text = "\n".join(lines) - print(text, file=file) + if file is not None: + print(text, file=file) return text diff --git a/python/nx-cugraph/nx_cugraph/scripts/print_tree.py b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py index 485873a44..fbb1c3dd0 100755 --- a/python/nx-cugraph/nx_cugraph/scripts/print_tree.py +++ b/python/nx-cugraph/nx_cugraph/scripts/print_tree.py @@ -12,29 +12,58 @@ # See the License for the specific language governing permissions and # limitations under the License. import argparse -import re import sys -import networkx as nx +from nx_cugraph.scripts.print_table import Info, get_path_to_info -from nx_cugraph.scripts.print_table import get_path_to_info +def assoc_in(d, keys, value): + """Like Clojure's assoc-in, but modifies d in-place.""" + inner = d + keys = iter(keys) + key = next(keys) + for next_key in keys: + if key not in inner: + inner[key] = {} + inner = inner[key] + key = next_key + inner[key] = value + return d -def add_branch(G, path, extra="", *, skip=0): - branch = path.split(".") - prev = ".".join(branch[: skip + 1]) - for i in range(skip + 2, len(branch)): - cur = ".".join(branch[:i]) - G.add_edge(prev, cur) - prev = cur - if extra: - if not isinstance(extra, str): - extra = ", ".join(extra) - path += f" ({extra})" - G.add_edge(prev, path) + +def default_get_payload_internal(keys): + return keys[-1] + + +def tree_lines( + tree, + parents=(), + are_levels_closing=(), + get_payload_internal=default_get_payload_internal, +): + pre = "".join( + " " if is_level_closing else " │ " + for is_level_closing in are_levels_closing + ) + c = "├" + are_levels_closing += (False,) + for i, (key, val) in enumerate(tree.items(), 1): + if i == len(tree): # Last item + c = "└" + are_levels_closing = are_levels_closing[:-1] + (True,) + if isinstance(val, str): + yield pre + f" {c}─ " + val + else: + yield pre + f" {c}─ " + get_payload_internal((*parents, key)) + yield from tree_lines( + val, + (*parents, key), + are_levels_closing, + get_payload_internal=get_payload_internal, + ) -def get_extra( +def get_payload( info, *, networkx_path=False, @@ -64,7 +93,10 @@ def get_extra( extra.append("is-incomplete") if different and info.is_different: extra.append("is-different") - return extra + extra = ", ".join(extra) + if extra: + extra = f" ({extra})" + return info.networkx_path.rsplit(".", 1)[-1] + extra def create_tree( @@ -80,12 +112,20 @@ def create_tree( incomplete=False, different=False, prefix="", + strip_networkx=True, + get_payload=get_payload, ): if path_to_info is None: path_to_info = get_path_to_info() + if strip_networkx: + path_to_info = { + key: Info(info.networkx_path.replace("networkx.", "", 1), *info[1:]) + for key, info in path_to_info.items() + } if isinstance(by, str): by = [by] - G = nx.DiGraph() + # We rely on the fact that dicts maintain order + tree = {} for info in sorted( path_to_info.values(), key=lambda x: (*(getattr(x, b) for b in by), x.networkx_path), @@ -93,7 +133,7 @@ def create_tree( if not all(getattr(info, b) for b in by): continue path = prefix + ".".join(getattr(info, b) for b in by) - extra = get_extra( + payload = get_payload( info, networkx_path=networkx_path, dispatch_name=dispatch_name, @@ -103,8 +143,8 @@ def create_tree( incomplete=incomplete, different=different, ) - add_branch(G, path, extra=extra, skip=skip) - return G + assoc_in(tree, path.split("."), payload) + return tree def main( @@ -132,45 +172,33 @@ def main( "different": different, } if by == "networkx_path": - G = create_tree(path_to_info, by="networkx_path", **kwargs) - text = re.sub( - r" [A-Za-z_\./]+\.", " ", ("\n".join(nx.generate_network_text(G))) - ) + tree = create_tree(path_to_info, by="networkx_path", **kwargs) + text = "\n".join(tree_lines(tree)) elif by == "plc": - G = create_tree( - path_to_info, by=["plc", "networkx_path"], prefix="plc-", **kwargs - ) - text = re.sub( - "plc-", - "plc.", - re.sub( - r" plc-[A-Za-z_\./]*\.", - " ", - "\n".join(nx.generate_network_text(G)), - ), + tree = create_tree( + path_to_info, + by=["plc", "networkx_path"], + prefix="plc-", + **kwargs, ) + text = "\n".join(tree_lines(tree)).replace("plc-", "plc.") elif by == "version_added": - G = create_tree( + tree = create_tree( path_to_info, by=["version_added", "networkx_path"], prefix="version_added-", **kwargs, ) - text = re.sub( - "version_added-", - "version: ", - re.sub( - r" version_added-[-0-9A-Za-z_\./]*\.", - " ", - "\n".join(nx.generate_network_text(G)), - ), - ).replace("-", ".") + text = "\n".join(tree_lines(tree)).replace("version_added-", "version: ") + for digit in "0123456789": + text = text.replace(f"2{digit}-", f"2{digit}.") else: raise ValueError( "`by` argument should be one of {'networkx_path', 'plc', 'version_added' " f"got: {by}" ) - print(text, file=file) + if file is not None: + print(text, file=file) return text diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index a7525530a..60a4b5589 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -149,8 +149,10 @@ exclude_lines = [ # https://github.com/charliermarsh/ruff/ line-length = 88 target-version = "py39" +[tool.ruff.lint] unfixable = [ "F841", # unused-variable (Note: can leave useless expression) + "B905", # zip-without-explicit-strict (Note: prefer `zip(x, y, strict=True)`) ] select = [ "ALL", @@ -172,7 +174,6 @@ ignore = [ # "SIM401", # Use dict.get ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer) # "TRY004", # Prefer `TypeError` exception for invalid type (Note: good advice, but not worth the nuisance) "B904", # Bare `raise` inside exception clause (like TRY200; sometimes okay) - "TRY200", # Use `raise from` to specify exception cause (Note: sometimes okay to raise original exception) # Intentionally ignored "A003", # Class attribute ... is shadowing a python builtin @@ -224,22 +225,22 @@ ignore = [ "PD", # pandas-vet (Intended for scripts that use pandas, not libraries) ] -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] # Allow unused imports (w/o defining `__all__`) # Allow assert, print, RNG, and no docstring "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"] "_nx_cugraph/__init__.py" = ["E501"] "nx_cugraph/algorithms/**/*py" = ["D205", "D401"] # Allow flexible docstrings for algorithms -[tool.ruff.flake8-annotations] +[tool.ruff.lint.flake8-annotations] mypy-init-return = true -[tool.ruff.flake8-builtins] +[tool.ruff.lint.flake8-builtins] builtins-ignorelist = ["copyright"] -[tool.ruff.flake8-pytest-style] +[tool.ruff.lint.flake8-pytest-style] fixture-parentheses = false mark-parentheses = false -[tool.ruff.pydocstyle] +[tool.ruff.lint.pydocstyle] convention = "numpy" diff --git a/python/nx-cugraph/scripts/update_readme.py b/python/nx-cugraph/scripts/update_readme.py new file mode 100644 index 000000000..1ab5a76c4 --- /dev/null +++ b/python/nx-cugraph/scripts/update_readme.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python +# Copyright (c) 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 +# +# 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. +import argparse +import re +import zlib +from collections import namedtuple +from pathlib import Path +from warnings import warn + +from nx_cugraph.scripts.print_tree import create_tree, tree_lines + +# See: https://sphobjinv.readthedocs.io/en/stable/syntax.html +DocObject = namedtuple( + "DocObject", + "name, domain, role, priority, uri, displayname", +) + + +def parse_docobject(line): + left, right = line.split(":") + name, domain = left.rsplit(" ", 1) + role, priority, uri, displayname = right.split(" ", 3) + if displayname == "-": + displayname = name + if uri.endswith("$"): + uri = uri[:-1] + name + return DocObject(name, domain, role, priority, uri, displayname) + + +def replace_body(text, match, new_body): + start, stop = match.span("body") + return text[:start] + new_body + text[stop:] + + +# NetworkX isn't perfectly intersphinx-compatible, so manually specify some urls. +# See: https://github.com/networkx/networkx/issues/7278 +MANUAL_OBJECT_URLS = { + "networkx.algorithms.centrality.betweenness": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/centrality.html#shortest-path-betweenness" + ), + "networkx.algorithms.centrality.degree_alg": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/centrality.html#degree" + ), + "networkx.algorithms.centrality.eigenvector": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/centrality.html#eigenvector" + ), + "networkx.algorithms.centrality.katz": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/centrality.html#eigenvector" + ), + "networkx.algorithms.components.connected": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/component.html#connectivity" + ), + "networkx.algorithms.components.weakly_connected": ( + "https://networkx.org/documentation/stable/reference/" + "algorithms/component.html#weak-connectivity" + ), +} + + +def main(readme_file, objects_filename): + """``readme_file`` must be readable and writable, so use mode ``"a+"``""" + # Use the `objects.inv` file to determine URLs. For details about this file, see: + # https://sphobjinv.readthedocs.io/en/stable/syntax.html + # We might be better off using a library like that, but roll our own for now. + with Path(objects_filename).open("rb") as objects_file: + line = objects_file.readline() + if line != b"# Sphinx inventory version 2\n": + raise RuntimeError(f"Bad line in objects.inv:\n\n{line}") + line = objects_file.readline() + if line != b"# Project: NetworkX\n": + raise RuntimeError(f"Bad line in objects.inv:\n\n{line}") + line = objects_file.readline() + if not line.startswith(b"# Version: "): + raise RuntimeError(f"Bad line in objects.inv:\n\n{line}") + line = objects_file.readline() + if line != b"# The remainder of this file is compressed using zlib.\n": + raise RuntimeError(f"Bad line in objects.inv:\n\n{line}") + zlib_data = objects_file.read() + objects_text = zlib.decompress(zlib_data).decode().strip() + objects_list = [parse_docobject(line) for line in objects_text.split("\n")] + doc_urls = { + obj.name: "https://networkx.org/documentation/stable/" + obj.uri + for obj in objects_list + } + if len(objects_list) != len(doc_urls): + raise RuntimeError("Oops; duplicate names found in objects.inv") + + def get_payload(info, **kwargs): + path = "networkx." + info.networkx_path + subpath, name = path.rsplit(".", 1) + # Many objects are referred to in modules above where they are defined. + while subpath: + path = f"{subpath}.{name}" + if path in doc_urls: + return f'{name}' + subpath = subpath.rsplit(".", 1)[0] + warn(f"Unable to find URL for {name!r}: {path}", stacklevel=0) + return name + + def get_payload_internal(keys): + path = "networkx." + ".".join(keys) + name = keys[-1] + if path in doc_urls: + return f'{name}' + path2 = "reference/" + "/".join(keys) + if path2 in doc_urls: + return f'{name}' + if path in MANUAL_OBJECT_URLS: + return f'{name}' + warn(f"Unable to find URL for {name!r}: {path}", stacklevel=0) + return name + + readme_file.seek(0) + text = readme_file.read() + tree = create_tree(get_payload=get_payload) + # Algorithms + match = re.search( + r"### .Algorithms(?P.*?)
\n(?P.*?)\n
", + text, + re.DOTALL, + ) + if not match: + raise RuntimeError("Algorithms section not found!") + lines = [] + for key, val in tree["algorithms"].items(): + lines.append(get_payload_internal(("algorithms", key))) + lines.extend( + tree_lines( + val, + parents=("algorithms", key), + get_payload_internal=get_payload_internal, + ) + ) + text = replace_body(text, match, "\n".join(lines)) + # Generators + match = re.search( + r"### .Generators(?P.*?)
\n(?P.*?)\n
", + text, + re.DOTALL, + ) + if not match: + raise RuntimeError("Generators section not found!") + lines = [] + for key, val in tree["generators"].items(): + lines.append(get_payload_internal(("generators", key))) + lines.extend( + tree_lines( + val, + parents=("generators", key), + get_payload_internal=get_payload_internal, + ) + ) + text = replace_body(text, match, "\n".join(lines)) + # Other + match = re.search( + r"### Other\n(?P.*?)
\n(?P.*?)\n
", + text, + re.DOTALL, + ) + if not match: + raise RuntimeError("Other section not found!") + lines = [] + for key, val in tree.items(): + if key in {"algorithms", "generators"}: + continue + lines.append(get_payload_internal((key,))) + lines.extend( + tree_lines(val, parents=(key,), get_payload_internal=get_payload_internal) + ) + text = replace_body(text, match, "\n".join(lines)) + # Now overwrite README.md + readme_file.truncate(0) + readme_file.write(text) + return text + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + "Update README.md to show NetworkX functions implemented by nx-cugraph" + ) + parser.add_argument("readme_filename", help="Path to the README.md file") + parser.add_argument( + "networkx_objects", help="Path to the objects.inv file from networkx docs" + ) + args = parser.parse_args() + with Path(args.readme_filename).open("a+") as readme_file: + main(readme_file, args.networkx_objects) From 5d712daed932a0f08b6c66e386c67d03bb778e18 Mon Sep 17 00:00:00 2001 From: James Lamb Date: Thu, 29 Feb 2024 13:10:42 -0600 Subject: [PATCH 325/384] Add support for Python 3.11, require NumPy 1.23+ (#4195) Contributes to https://github.com/rapidsai/build-planning/issues/3 This PR adds support for Python 3.11. It also bumps uses of `NumPy` to `numpy>=1.23`, see https://github.com/rapidsai/build-planning/issues/3#issuecomment-1967952280. ## Notes for Reviewers This is part of ongoing work to add Python 3.11 support across RAPIDS. The Python 3.11 CI workflows introduced in https://github.com/rapidsai/shared-workflows/pull/176 are *optional*... they are not yet required to run successfully for PRs to be merged. This PR can be merged once all jobs are running successfully (including the non-required jobs for Python 3.11). The CI logs should be verified that the jobs are building and testing with Python 3.11. See https://github.com/rapidsai/shared-workflows/pull/176 for more details. Authors: - James Lamb (https://github.com/jameslamb) Approvers: - Jake Awe (https://github.com/AyodeAwe) - Kyle Edwards (https://github.com/KyleFromNVIDIA) - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4195 --- python/nx-cugraph/pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 60a4b5589..07ec0eab2 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -25,6 +25,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3 :: Only", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", @@ -32,7 +33,7 @@ classifiers = [ dependencies = [ "cupy-cuda11x>=12.0.0", "networkx>=3.0", - "numpy>=1.21", + "numpy>=1.23", "pylibcugraph==24.4.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. From 5f467ef7deb52b7b57c750bc36a613c45c5b252a Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Mon, 4 Mar 2024 14:29:15 -0800 Subject: [PATCH 326/384] Update installation docs for CUDA 12. (#4207) Closes #3909. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4207 --- .../source/installation/getting_cugraph.md | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 625f2c64c..d9d3fa55c 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -15,7 +15,7 @@ There are 4 ways to get cuGraph packages:
## Docker -The RAPIDS Docker containers contain all RAPIDS packages, including all from cuGraph, as well as all required supporting packages. To download a container, please see the [Docker Repository](https://hub.docker.com/r/rapidsai/rapidsai/), choosing a tag based on the NVIDIA CUDA version you’re running. This 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. +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.
@@ -31,6 +31,8 @@ cuGraph Conda packages * 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. @@ -38,10 +40,12 @@ 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 cudatoolkit=11.8 +conda install -c rapidsai -c conda-forge -c nvidia cugraph cuda-version=12.0 ``` -Note: This conda installation only applies to Linux and Python versions 3.8/3.10. +Alternatively, use `cuda-version=11.8` for packages supporting CUDA 11. + +Note: This conda installation only applies to Linux and Python versions 3.9/3.10.
@@ -49,10 +53,16 @@ Note: This conda installation only applies to Linux and Python versions 3.8/3.10 cuGraph, and all of RAPIDS, is available via pip. ``` -pip install cugraph-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install cugraph-cu12 --extra-index-url=https://pypi.ngc.nvidia.com ``` -pip packages for other packages are being worked and should be available in early 2023 +Replace `-cu12` with `-cu11` for packages supporting CUDA 11. + +Also available: + * cugraph-dgl-cu12 + * cugraph-pyg-cu12 + * cugraph-equivariant-cu12 + * nx-cugraph-cu12
From be60042519f7e67c1f8bdf28074b135e5117025e Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Wed, 6 Mar 2024 09:08:53 -0500 Subject: [PATCH 327/384] Fix in Docs to address question asked in issue 4182 (#4204) Added compute comment and changed DiGraph to Graph(directed=True) Tested in a notebook. Addresses question in #4182 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4204 --- docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst index 772d3abc4..a2d497890 100644 --- a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst @@ -60,12 +60,15 @@ Example ) # create graph from input data - G = cugraph.DiGraph() + G = cugraph.Graph(directed=True) G.from_dask_cudf_edgelist(e_list, source='src', destination='dst') # run PageRank pr_df = dask_cugraph.pagerank(G, tol=1e-4) + # need to call compute to generate results + pr_df.compute() + # cluster clean up Comms.destroy() client.close() From 00e2d55b7cc1d7b62c036501454bc3c4df2f534c Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 6 Mar 2024 18:33:06 -0600 Subject: [PATCH 328/384] Fix `louvain_communities`, `PropertyGraph`, cudf `column.full`, dgl 2.1.0 CI failures (#4215) * Updates cudf usage in hypergraph to use `cudf.core.column.as_column` instead of the deprecated `cudf.core.column.full` API * Adds code to call louvain using a signature that's compatible with both pre and post NX 3.3 * Adds an upper bound to the DGL version pin to ensure a compatible version is used * Updates a PropertyGraph test to handle minor ordering changes in the result DataFrame * Test matrices starting 24.04 have changed, resulting in an "empty matrix" error when attempting to use the supported combination used for PyG (PyG wheel tests need pytorch with CUDA 12.2 on arm64), so the matrix was simplified to remove the CUDA 11.8 requirement. cc @tingyu66 Authors: - Erik Welch (https://github.com/eriknw) - Naim (https://github.com/naimnv) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Ray Douglass (https://github.com/raydouglass) URL: https://github.com/rapidsai/cugraph/pull/4215 --- python/nx-cugraph/_nx_cugraph/__init__.py | 1 + .../algorithms/community/louvain.py | 93 ++++++++++++++----- .../nx_cugraph/tests/test_match_api.py | 5 - 3 files changed, 69 insertions(+), 30 deletions(-) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index c6c43110a..b2f13d25f 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -164,6 +164,7 @@ }, "louvain_communities": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", + "max_level : int, optional": "Upper limit of the number of macro-iterations (max: 500).", }, "pagerank": { "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.", diff --git a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py index f7638f47a..ea1318060 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/community/louvain.py @@ -37,18 +37,23 @@ _max_level_param = {} -@not_implemented_for("directed") -@networkx_algorithm( - extra_params={ - **_max_level_param, - **_dtype_param, - }, - is_incomplete=True, # seed not supported; self-loops not supported - is_different=True, # RNG different - version_added="23.10", - _plc="louvain", -) -def louvain_communities( +def _louvain_communities_nx32( + G, + weight="weight", + resolution=1, + threshold=0.0000001, + seed=None, + *, + max_level=None, + dtype=None, +): + """`seed` parameter is currently ignored, and self-loops are not yet supported.""" + return _louvain_communities( + G, weight, resolution, threshold, max_level, seed, dtype=dtype + ) + + +def _louvain_communities( G, weight="weight", resolution=1, @@ -85,16 +90,54 @@ def louvain_communities( return [set(G._nodearray_to_list(ids)) for ids in groups.values()] -@louvain_communities._can_run -def _( - G, - weight="weight", - resolution=1, - threshold=0.0000001, - max_level=None, - seed=None, - *, - dtype=None, -): - # NetworkX allows both directed and undirected, but cugraph only allows undirected. - return not G.is_directed() +_louvain_decorator = networkx_algorithm( + extra_params={ + **_max_level_param, + **_dtype_param, + }, + is_incomplete=True, # seed not supported; self-loops not supported + is_different=True, # RNG different + version_added="23.10", + _plc="louvain", + name="louvain_communities", +) + +if _max_level_param: # networkx <= 3.2 + _louvain_communities_nx32.__name__ = "louvain_communities" + louvain_communities = not_implemented_for("directed")( + _louvain_decorator(_louvain_communities_nx32) + ) + + @louvain_communities._can_run + def _( + G, + weight="weight", + resolution=1, + threshold=0.0000001, + seed=None, + *, + max_level=None, + dtype=None, + ): + # NetworkX allows both directed and undirected, but cugraph only undirected. + return not G.is_directed() + +else: # networkx >= 3.3 + _louvain_communities.__name__ = "louvain_communities" + louvain_communities = not_implemented_for("directed")( + _louvain_decorator(_louvain_communities) + ) + + @louvain_communities._can_run + def _( + G, + weight="weight", + resolution=1, + threshold=0.0000001, + max_level=None, + seed=None, + *, + dtype=None, + ): + # NetworkX allows both directed and undirected, but cugraph only undirected. + return not G.is_directed() diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py index 595f7819a..bd6f20e84 100644 --- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py +++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py @@ -44,11 +44,6 @@ def test_match_signature_and_names(): else: orig_func = dispatchable_func.orig_func - if nxver.major == 3 and nxver.minor <= 2 and name == "louvain_communities": - # The signature of louvain_communities changed in NetworkX 3.3, and - # we updated to match, so we skip this check in older versions. - continue - # Matching signatures? orig_sig = inspect.signature(orig_func) func_sig = inspect.signature(func) From f802eb32be6e8daacfd4265b3824455c4a593cf5 Mon Sep 17 00:00:00 2001 From: jakirkham Date: Wed, 6 Mar 2024 21:03:08 -0800 Subject: [PATCH 329/384] Add Python 3.11 to Conda docs (#4213) xref: https://github.com/rapidsai/cugraph/pull/4207#discussion_r1511881073 Authors: - https://github.com/jakirkham Approvers: - Don Acosta (https://github.com/acostadon) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4213 --- docs/cugraph/source/installation/getting_cugraph.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index d9d3fa55c..0695c690a 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -45,7 +45,7 @@ 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.9/3.10. +Note: This conda installation only applies to Linux and Python versions 3.9/3.10/3.11.
From 0f17760e01aac8d5774bb1675def4c9a2d00d4af Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Thu, 7 Mar 2024 21:03:36 -0600 Subject: [PATCH 330/384] Trim trailing whitespace (#4206) This PR trims trailing whitespace and normalizes file endings in all files, and adds pre-commit hooks to enforce this for future contributions. These pre-commit hooks already exist in most other RAPIDS repositories, so it would be good to standardize. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - Brad Rees (https://github.com/BradReesWork) - Jake Awe (https://github.com/AyodeAwe) - Chuck Hastings (https://github.com/ChuckHastings) URL: https://github.com/rapidsai/cugraph/pull/4206 --- .pre-commit-config.yaml | 4 +- docs/cugraph/Makefile | 2 +- docs/cugraph/README.md | 2 +- docs/cugraph/source/_static/references.css | 2 +- .../api_docs/cugraph-ops/c_cpp/index.rst | 1 - .../source/api_docs/cugraph-ops/index.rst | 2 +- .../api_docs/cugraph-ops/python/index.rst | 2 +- .../api_docs/cugraph-pyg/cugraph_pyg.rst | 1 - .../source/api_docs/cugraph/components.rst | 1 - .../source/api_docs/cugraph/dask-cugraph.rst | 4 +- .../source/api_docs/cugraph/generators.rst | 1 - .../api_docs/cugraph/graph_implementation.rst | 2 +- .../api_docs/cugraph/helper_functions.rst | 1 - .../source/api_docs/cugraph/layout.rst | 1 - .../source/api_docs/cugraph/link_analysis.rst | 1 - docs/cugraph/source/api_docs/cugraph/tree.rst | 1 - .../source/api_docs/cugraph_c/centrality.rst | 1 - .../source/api_docs/cugraph_c/community.rst | 1 - .../source/api_docs/cugraph_c/labeling.rst | 2 +- .../source/api_docs/cugraph_c/similarity.rst | 2 +- .../source/api_docs/cugraph_c/traversal.rst | 2 +- docs/cugraph/source/api_docs/index.rst | 2 - .../cugraph/source/api_docs/service/index.rst | 2 +- .../source/basics/cugraph_cascading.md | 8 +- docs/cugraph/source/basics/cugraph_intro.md | 81 +++++++++---------- docs/cugraph/source/basics/nx_transition.rst | 27 +++---- docs/cugraph/source/dev_resources/API.rst | 2 +- docs/cugraph/source/dev_resources/index.rst | 2 +- .../source/graph_support/DGL_support.md | 12 +-- .../source/graph_support/PyG_support.md | 2 +- .../source/graph_support/algorithms.md | 2 +- .../graph_support/algorithms/Similarity.md | 6 +- .../algorithms/betweenness_centrality.md | 2 +- .../algorithms/degree_centrality.md | 4 +- .../algorithms/eigenvector_centrality.md | 5 +- .../algorithms/jaccard_similarity.md | 4 +- .../algorithms/katz_centrality.md | 2 +- .../algorithms/overlap_similarity.md | 4 +- .../algorithms/sorensen_coefficient.md | 4 +- .../source/graph_support/compatibility.rst | 2 +- .../source/graph_support/cugraph_service.rst | 4 +- .../graph_support/cugraphops_support.rst | 2 +- .../source/graph_support/datastores.rst | 1 - .../source/graph_support/feature_stores.md | 2 +- .../source/graph_support/gnn_support.rst | 4 +- .../source/graph_support/graph_algorithms.rst | 4 +- docs/cugraph/source/graph_support/index.rst | 2 +- .../source/graph_support/knowledge_stores.md | 2 +- .../source/graph_support/property_graph.md | 22 ++--- .../graph_support/wholegraph_support.md | 2 +- docs/cugraph/source/index.rst | 4 +- .../source/installation/getting_cugraph.md | 3 +- docs/cugraph/source/installation/index.rst | 2 +- docs/cugraph/source/references/cugraph_ref.md | 1 - docs/cugraph/source/references/datasets.md | 14 ++-- docs/cugraph/source/references/index.rst | 2 +- docs/cugraph/source/references/licenses.md | 2 +- docs/cugraph/source/releases/index.rst | 2 +- .../source/tutorials/community_resources.md | 2 +- .../source/tutorials/cugraph_blogs.rst | 2 +- .../source/tutorials/cugraph_notebooks.md | 4 +- .../cugraph/source/tutorials/how_to_guides.md | 16 ++-- .../wholememory_implementation_details.md | 2 +- docs/cugraph/source/wholegraph/index.rst | 1 - .../installation/getting_wholegraph.md | 2 +- print_env.sh | 15 ++-- 66 files changed, 154 insertions(+), 174 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6b7ff1441..3d893e0e5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,11 +5,13 @@ exclude: '^thirdparty' repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-added-large-files - id: debug-statements + - id: end-of-file-fixer - id: mixed-line-ending + - id: trailing-whitespace - repo: https://github.com/psf/black rev: 22.10.0 hooks: diff --git a/docs/cugraph/Makefile b/docs/cugraph/Makefile index f92d0be69..ac16367ef 100644 --- a/docs/cugraph/Makefile +++ b/docs/cugraph/Makefile @@ -23,4 +23,4 @@ clean: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/cugraph/README.md b/docs/cugraph/README.md index 734867af9..970a03a04 100644 --- a/docs/cugraph/README.md +++ b/docs/cugraph/README.md @@ -5,7 +5,7 @@ All prerequisite for building docs are in the cugraph development conda environm ## Steps to follow: -In order to build the docs, we need the conda dev environment from cugraph and we need to build cugraph from source. +In order to build the docs, we need the conda dev environment from cugraph and we need to build cugraph from source. 1. Create a conda env and build cugraph from source. The dependencies to build rapids from source are installed in that conda environment, and then rapids is built and installed into the same environment. diff --git a/docs/cugraph/source/_static/references.css b/docs/cugraph/source/_static/references.css index 225cf13ba..d1f647233 100644 --- a/docs/cugraph/source/_static/references.css +++ b/docs/cugraph/source/_static/references.css @@ -20,4 +20,4 @@ dl.citation > dt.label > span::before { /* Add closing bracket */ dl.citation > dt.label > span::after { content: "]"; -} \ No newline at end of file +} diff --git a/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst index 5545bebe9..39dae955e 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst @@ -1,3 +1,2 @@ cugraph-ops C++ API Reference ============================= - diff --git a/docs/cugraph/source/api_docs/cugraph-ops/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/index.rst index fdfd5baab..0f6a6c937 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/index.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/index.rst @@ -8,4 +8,4 @@ This page provides a list of all publicly accessible modules, methods and classe :caption: API Documentation python/index - c_cpp/index \ No newline at end of file + c_cpp/index diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst index 082c7741f..fb25f2fa0 100644 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst +++ b/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst @@ -1,5 +1,5 @@ cugraph-ops Python API reference -================================ +================================ This page provides a list of all publicly accessible modules, methods and classes through `pylibcugraphops.*` namespace. diff --git a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst index f7d7f5f22..a150d4db9 100644 --- a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst @@ -11,4 +11,3 @@ cugraph-pyg .. cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore .. cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler - diff --git a/docs/cugraph/source/api_docs/cugraph/components.rst b/docs/cugraph/source/api_docs/cugraph/components.rst index 560aa1f8c..e61291fcc 100644 --- a/docs/cugraph/source/api_docs/cugraph/components.rst +++ b/docs/cugraph/source/api_docs/cugraph/components.rst @@ -20,4 +20,3 @@ Connected Components (MG) :toctree: ../api/cugraph/ cugraph.dask.components.connectivity.weakly_connected_components - diff --git a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst index a2d497890..d9ba3f3a7 100644 --- a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst +++ b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst @@ -48,12 +48,12 @@ Example ) input_data.to_csv(input_data_path, index=False) - # helper function to set the reader chunk size to automatically get one partition per GPU + # helper function to set the reader chunk size to automatically get one partition per GPU chunksize = dask_cugraph.get_chunksize(input_data_path) # multi-GPU CSV reader e_list = dask_cudf.read_csv( - input_data_path, + input_data_path, chunksize=chunksize, names=['src', 'dst'], dtype=['int32', 'int32'], diff --git a/docs/cugraph/source/api_docs/cugraph/generators.rst b/docs/cugraph/source/api_docs/cugraph/generators.rst index 4f93d943e..f5180a172 100644 --- a/docs/cugraph/source/api_docs/cugraph/generators.rst +++ b/docs/cugraph/source/api_docs/cugraph/generators.rst @@ -11,4 +11,3 @@ RMAT :toctree: ../api/cugraph/ cugraph.generators.rmat - diff --git a/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst index 91c16c242..ae14306ce 100644 --- a/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst +++ b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst @@ -31,4 +31,4 @@ Graph Implementation edges nodes neighbors - vertex_column_size \ No newline at end of file + vertex_column_size diff --git a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst index 02cb599ae..e7091c50c 100644 --- a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst +++ b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst @@ -20,4 +20,3 @@ Methods cugraph.dask.comms.comms.get_handle cugraph.dask.comms.comms.get_worker_id cugraph.dask.common.read_utils.get_chunksize - diff --git a/docs/cugraph/source/api_docs/cugraph/layout.rst b/docs/cugraph/source/api_docs/cugraph/layout.rst index ed97caf54..d416676a6 100644 --- a/docs/cugraph/source/api_docs/cugraph/layout.rst +++ b/docs/cugraph/source/api_docs/cugraph/layout.rst @@ -10,4 +10,3 @@ Force Atlas 2 :toctree: ../api/cugraph/ cugraph.force_atlas2 - diff --git a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst index 48b5ec117..698880c1b 100644 --- a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst +++ b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst @@ -32,4 +32,3 @@ Pagerank (MG) :toctree: ../api/cugraph/ cugraph.dask.link_analysis.pagerank.pagerank - diff --git a/docs/cugraph/source/api_docs/cugraph/tree.rst b/docs/cugraph/source/api_docs/cugraph/tree.rst index 5ba2242eb..d8a89046a 100644 --- a/docs/cugraph/source/api_docs/cugraph/tree.rst +++ b/docs/cugraph/source/api_docs/cugraph/tree.rst @@ -18,4 +18,3 @@ Maximum Spanning Tree :toctree: ../api/cugraph/ cugraph.tree.minimum_spanning_tree.maximum_spanning_tree - diff --git a/docs/cugraph/source/api_docs/cugraph_c/centrality.rst b/docs/cugraph/source/api_docs/cugraph_c/centrality.rst index f34e26ad7..3bea608fd 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/centrality.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/centrality.rst @@ -48,4 +48,3 @@ Centrality Support Functions :project: libcugraph :members: :content-only: - diff --git a/docs/cugraph/source/api_docs/cugraph_c/community.rst b/docs/cugraph/source/api_docs/cugraph_c/community.rst index d55325720..6b500a972 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/community.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/community.rst @@ -54,4 +54,3 @@ Community Support Functions :project: libcugraph :members: :content-only: - diff --git a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst index 4ca598c0a..2b709ebd3 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst @@ -17,4 +17,4 @@ Labeling Support Functions .. doxygengroup:: labeling :project: libcugraph :members: - :content-only: \ No newline at end of file + :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst index 200ba6957..75735925e 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst @@ -22,4 +22,4 @@ Similarty Support Functions .. doxygengroup:: similarity :project: libcugraph :members: - :content-only: \ No newline at end of file + :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst index 1578951e0..bde30f4fa 100644 --- a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst +++ b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst @@ -27,4 +27,4 @@ Traversal Support Functions .. doxygengroup:: traversal :project: libcugraph :members: - :content-only: \ No newline at end of file + :content-only: diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 74ca98bb9..1b907165a 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -35,5 +35,3 @@ Additional Graph Packages API Documentation :caption: Additional Graph Packages API Documentation service/index.rst - - diff --git a/docs/cugraph/source/api_docs/service/index.rst b/docs/cugraph/source/api_docs/service/index.rst index a58cf2074..ca251e475 100644 --- a/docs/cugraph/source/api_docs/service/index.rst +++ b/docs/cugraph/source/api_docs/service/index.rst @@ -7,4 +7,4 @@ cugraph-service API Reference :caption: cugraph-service API Documentation cugraph_service_client - cugraph_service_server \ No newline at end of file + cugraph_service_server diff --git a/docs/cugraph/source/basics/cugraph_cascading.md b/docs/cugraph/source/basics/cugraph_cascading.md index 7795e9e00..bad3d7fa6 100644 --- a/docs/cugraph/source/basics/cugraph_cascading.md +++ b/docs/cugraph/source/basics/cugraph_cascading.md @@ -3,7 +3,7 @@ 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. +[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): @@ -11,13 +11,13 @@ An example, from cuDF, is a sequence of method calls for loading data and then 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. +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`. +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. +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: diff --git a/docs/cugraph/source/basics/cugraph_intro.md b/docs/cugraph/source/basics/cugraph_intro.md index 10d14f8a0..7ad282560 100644 --- a/docs/cugraph/source/basics/cugraph_intro.md +++ b/docs/cugraph/source/basics/cugraph_intro.md @@ -1,51 +1,51 @@ # 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 +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 +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. +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 +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 +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. @@ -65,9 +65,4 @@ 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__. - - - - - \ No newline at end of file +the CUDA/C layer, we favor the mathematical terms of __Vertex__ and __Edge__. diff --git a/docs/cugraph/source/basics/nx_transition.rst b/docs/cugraph/source/basics/nx_transition.rst index 3d116162c..984986581 100644 --- a/docs/cugraph/source/basics/nx_transition.rst +++ b/docs/cugraph/source/basics/nx_transition.rst @@ -2,7 +2,7 @@ NetworkX Compatibility and Transition ************************************** -*Note: this is a work in progress and will be updatred and changed as we better flesh out +*Note: this is a work in progress and will be updatred and changed as we better flesh out compatibility issues* One of the goals of RAPIDS cuGraph is to mimic the NetworkX API to simplify @@ -13,7 +13,7 @@ and then the construction of a graph object; that is all before the execution of a graph algorithm. RAPIDS and cuGraph allow a portion or the complete analytic workflow to be accelerated. To achieve the maximum amount of acceleration, we encourage fully replacing existing code with cuGraph. -But sometimes it is easier to replace just a portion. +But sometimes it is easier to replace just a portion. Last Update ########### @@ -23,7 +23,7 @@ Release: 0.16 Information on `NetworkX `_ -This transition guide in an expansion of the Medium Blog on `NetworkX Compatibility +This transition guide in an expansion of the Medium Blog on `NetworkX Compatibility `_ @@ -33,7 +33,7 @@ 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. +improvements. In the following example, the cuGraph module is being imported as “cnx”. While module can be assigned any name can be used, we picked cnx to reduce @@ -44,10 +44,10 @@ changes. :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. +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. +adding support for Bipartite graph and Multigraph over the next few releases. | @@ -58,7 +58,7 @@ 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. +any additional attributes on the nodes or edges. Algorithms that exactly match ***************************** @@ -142,8 +142,8 @@ Algorithms where the results are different ****************************************** -For example, the NetworkX traversal algorithms typically return a generator -rather than a dictionary. +For example, the NetworkX traversal algorithms typically return a generator +rather than a dictionary. +----------------------------+-------------------------------------------------+ @@ -154,7 +154,7 @@ rather than a dictionary. | | (on roadmap to update) | +----------------------------+-------------------------------------------------+ | Jaccard coefficient | Currently we only do a 1-hop computation rather | -| | than an all-pairs. Fix is on roadmap | +| | than an all-pairs. Fix is on roadmap | +----------------------------+-------------------------------------------------+ | Breadth First Search (BFS) | Returns a Pandas DataFrame with: | | | [vertex][distance][predecessor] | @@ -185,14 +185,13 @@ code for building a NetworkX Graph:: ) -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. +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. +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. - +The above cuGraph code will create cuGraph.Graph object and not a NetworkX.Graph object. diff --git a/docs/cugraph/source/dev_resources/API.rst b/docs/cugraph/source/dev_resources/API.rst index 409e307fd..e32315d2f 100644 --- a/docs/cugraph/source/dev_resources/API.rst +++ b/docs/cugraph/source/dev_resources/API.rst @@ -2,4 +2,4 @@ API === -https://docs.rapids.ai/api/cugraph/nightly/api_docs/index.html \ No newline at end of file +https://docs.rapids.ai/api/cugraph/nightly/api_docs/index.html diff --git a/docs/cugraph/source/dev_resources/index.rst b/docs/cugraph/source/dev_resources/index.rst index 8568772b3..fc2c4f478 100644 --- a/docs/cugraph/source/dev_resources/index.rst +++ b/docs/cugraph/source/dev_resources/index.rst @@ -7,4 +7,4 @@ Developer Resources :maxdepth: 3 https://docs.rapids.ai/maintainers - API.rst \ No newline at end of file + API.rst diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md index fc1f1b45b..dc4f66180 100644 --- a/docs/cugraph/source/graph_support/DGL_support.md +++ b/docs/cugraph/source/graph_support/DGL_support.md @@ -2,7 +2,7 @@ ## 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. +[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 @@ -22,7 +22,7 @@ mamba env create -n cugraph_dgl_dev --file conda/cugraph_dgl_dev_11.6.yml ### Install in editable mode ``` -pip install -e . +pip install -e . ``` ### Run tests @@ -43,12 +43,12 @@ sampler = dgl.dataloading.NeighborSampler( train_dataloader = dgl.dataloading.DataLoader( cugraph_g, -train_idx, -sampler, -device=device, +train_idx, +sampler, +device=device, batch_size=1024, shuffle=True, -drop_last=False, +drop_last=False, num_workers=0) ``` diff --git a/docs/cugraph/source/graph_support/PyG_support.md b/docs/cugraph/source/graph_support/PyG_support.md index 42d4d1c55..b57ce7fcc 100644 --- a/docs/cugraph/source/graph_support/PyG_support.md +++ b/docs/cugraph/source/graph_support/PyG_support.md @@ -1,3 +1,3 @@ # 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. \ No newline at end of file +[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/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md index a1b80e927..8a5158f2f 100644 --- a/docs/cugraph/source/graph_support/algorithms.md +++ b/docs/cugraph/source/graph_support/algorithms.md @@ -92,4 +92,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/Similarity.md b/docs/cugraph/source/graph_support/algorithms/Similarity.md index 18c0a94d5..96adc25ea 100644 --- a/docs/cugraph/source/graph_support/algorithms/Similarity.md +++ b/docs/cugraph/source/graph_support/algorithms/Similarity.md @@ -5,8 +5,8 @@ The RAPIDS cuGraph Similarity folder contain a collection of Jupyter Notebooks t 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. +* 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 @@ -35,4 +35,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md b/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md index 7dc692684..89e5e0bdb 100644 --- a/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md @@ -39,4 +39,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/degree_centrality.md b/docs/cugraph/source/graph_support/algorithms/degree_centrality.md index 64fe694e4..9253c665f 100644 --- a/docs/cugraph/source/graph_support/algorithms/degree_centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/degree_centrality.md @@ -11,7 +11,7 @@ Degree centrality of a vertex 𝑣 is the sum of the edges incident on that node * 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 +* In huge graphs, Degree centrality is a the quickest ## When not to use Degree Centrality * When weights, edge direction or edge types matter @@ -29,4 +29,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md b/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md index 5217dc497..8a9c7c7c7 100644 --- a/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md @@ -18,11 +18,11 @@ Where M(v) is the adjacency list for the set of vertices(v) and λ is a constant ## 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. +* 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 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. @@ -39,4 +39,3 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use 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/cugraph/source/graph_support/algorithms/jaccard_similarity.md b/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md index c9ffc76d1..dde98d71e 100644 --- a/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md +++ b/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md @@ -1,6 +1,6 @@ # 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 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 @@ -31,4 +31,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/katz_centrality.md b/docs/cugraph/source/graph_support/algorithms/katz_centrality.md index 3bfe4d40c..69b5d6b27 100644 --- a/docs/cugraph/source/graph_support/algorithms/katz_centrality.md +++ b/docs/cugraph/source/graph_support/algorithms/katz_centrality.md @@ -25,4 +25,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md b/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md index 026d713fb..d9f9f681e 100644 --- a/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md +++ b/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md @@ -15,7 +15,7 @@ $overlap(A,B) = \frac{|A \cap B|}{min(|A|,|B|)}$ ## 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. +* In directed graphs, there are better algorithms to use. ## How computationally expensive is it? @@ -29,4 +29,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md b/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md index 01b6709de..67d981815 100644 --- a/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md +++ b/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md @@ -23,7 +23,7 @@ In graphs, the sets refer to the set of connected nodes or neighborhood of nodes ## 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. +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. @@ -31,4 +31,4 @@ 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. -___ \ No newline at end of file +___ diff --git a/docs/cugraph/source/graph_support/compatibility.rst b/docs/cugraph/source/graph_support/compatibility.rst index be0cc21c2..ddb3f1d5f 100644 --- a/docs/cugraph/source/graph_support/compatibility.rst +++ b/docs/cugraph/source/graph_support/compatibility.rst @@ -5,4 +5,4 @@ Compatibility .. toctree:: :maxdepth: 3 -Compatibility document coming soon \ No newline at end of file +Compatibility document coming soon diff --git a/docs/cugraph/source/graph_support/cugraph_service.rst b/docs/cugraph/source/graph_support/cugraph_service.rst index 620b22d1e..658f9e731 100644 --- a/docs/cugraph/source/graph_support/cugraph_service.rst +++ b/docs/cugraph/source/graph_support/cugraph_service.rst @@ -5,5 +5,5 @@ 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) \ No newline at end of file + +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/cugraph/source/graph_support/cugraphops_support.rst b/docs/cugraph/source/graph_support/cugraphops_support.rst index 08ae3b218..fd79564f8 100644 --- a/docs/cugraph/source/graph_support/cugraphops_support.rst +++ b/docs/cugraph/source/graph_support/cugraphops_support.rst @@ -7,4 +7,4 @@ cugraph-ops aims to be a low-level, framework agnostic library providing commonl .. toctree:: :maxdepth: 3 - https://github.com/rapidsai/cugraph-ops/blob/branch-23.04/README.md \ No newline at end of file + https://github.com/rapidsai/cugraph-ops/blob/branch-23.04/README.md diff --git a/docs/cugraph/source/graph_support/datastores.rst b/docs/cugraph/source/graph_support/datastores.rst index f92110077..50d8461e7 100644 --- a/docs/cugraph/source/graph_support/datastores.rst +++ b/docs/cugraph/source/graph_support/datastores.rst @@ -6,4 +6,3 @@ Data Stores property_graph.md knowledge_stores.md feature_stores.md - diff --git a/docs/cugraph/source/graph_support/feature_stores.md b/docs/cugraph/source/graph_support/feature_stores.md index f40cab72e..ef9358c4c 100644 --- a/docs/cugraph/source/graph_support/feature_stores.md +++ b/docs/cugraph/source/graph_support/feature_stores.md @@ -1,3 +1,3 @@ # Feature Store -Coming Soon \ No newline at end of file +Coming Soon diff --git a/docs/cugraph/source/graph_support/gnn_support.rst b/docs/cugraph/source/graph_support/gnn_support.rst index 3c92dc360..639b657c6 100644 --- a/docs/cugraph/source/graph_support/gnn_support.rst +++ b/docs/cugraph/source/graph_support/gnn_support.rst @@ -5,8 +5,8 @@ Graph Neural Network Support .. toctree:: :maxdepth: 2 - + PyG_support.md DGL_support.md cugraphops_support.rst - wholegraph_support.md \ No newline at end of file + wholegraph_support.md diff --git a/docs/cugraph/source/graph_support/graph_algorithms.rst b/docs/cugraph/source/graph_support/graph_algorithms.rst index a8ba01aa9..38dd8ccc2 100644 --- a/docs/cugraph/source/graph_support/graph_algorithms.rst +++ b/docs/cugraph/source/graph_support/graph_algorithms.rst @@ -4,5 +4,5 @@ Algorithms .. toctree:: :maxdepth: 3 - - algorithms.md \ No newline at end of file + + algorithms.md diff --git a/docs/cugraph/source/graph_support/index.rst b/docs/cugraph/source/graph_support/index.rst index 9526fae7e..67aba7428 100644 --- a/docs/cugraph/source/graph_support/index.rst +++ b/docs/cugraph/source/graph_support/index.rst @@ -10,4 +10,4 @@ Graph Support compatibility.rst gnn_support.rst datastores.rst - cugraph_service.rst \ No newline at end of file + cugraph_service.rst diff --git a/docs/cugraph/source/graph_support/knowledge_stores.md b/docs/cugraph/source/graph_support/knowledge_stores.md index 4d6028a59..1749eb2b4 100644 --- a/docs/cugraph/source/graph_support/knowledge_stores.md +++ b/docs/cugraph/source/graph_support/knowledge_stores.md @@ -1,3 +1,3 @@ # Knowledge Store -Coming Soon \ No newline at end of file +Coming Soon diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/cugraph/source/graph_support/property_graph.md index 614910b79..ef07be79b 100644 --- a/docs/cugraph/source/graph_support/property_graph.md +++ b/docs/cugraph/source/graph_support/property_graph.md @@ -16,8 +16,8 @@ Property Graph enables: This is an example of using the cuGraph Property Graph in a two stage analysis. ``` -import cudf -import cugraph +import cudf +import cugraph from cugraph.experimental import PropertyGraph # Import a built-in dataset @@ -29,22 +29,22 @@ graph = cugraph.Graph(directed=False) G = karate.get_graph(create_using=graph,fetch=True) df = G.edgelist.edgelist_df -pG = PropertyGraph() +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. +# 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 +# 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. +# 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) +# 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)) -``` \ No newline at end of file +``` diff --git a/docs/cugraph/source/graph_support/wholegraph_support.md b/docs/cugraph/source/graph_support/wholegraph_support.md index fa26700a6..d1c5eaf72 100644 --- a/docs/cugraph/source/graph_support/wholegraph_support.md +++ b/docs/cugraph/source/graph_support/wholegraph_support.md @@ -1,4 +1,4 @@ # 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 \ No newline at end of file +Please see [WholeGraph Introduction](https://github.com/rapidsai/wholegraph/blob/main/README.md) for more details diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 955eb6d54..b18a79d33 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -18,7 +18,7 @@ RAPIDS Graph documentation - :abbr:`cugraph-service (Graph-as-a-service provides both Client and Server packages)` * - :abbr:`pylibcugraph (light-weight Python wrapper with no guard rails)` - :abbr:`cugraph-dgl (Accelerated extensions for use with the DGL framework)` - - + - * - :abbr:`libcugraph (C++ API)` - :abbr:`cugraph-pyg (Accelerated extensions for use with the PyG framework)` - @@ -33,7 +33,7 @@ Introduction ~~~~~~~~~~~~ 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 GPU DataFrames, NetworkX Graphs, or +graph algorithms using data stored in GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. Note: We are redoing all of our documents, please be patient as we update diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md index 0695c690a..4d601bf32 100644 --- a/docs/cugraph/source/installation/getting_cugraph.md +++ b/docs/cugraph/source/installation/getting_cugraph.md @@ -1,7 +1,7 @@ # Getting cuGraph Packages -Start by reading the [RAPIDS Instalation guide](https://docs.rapids.ai/install) +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. @@ -65,4 +65,3 @@ Also available: * nx-cugraph-cu12
- diff --git a/docs/cugraph/source/installation/index.rst b/docs/cugraph/source/installation/index.rst index 27858b770..8ad12c589 100644 --- a/docs/cugraph/source/installation/index.rst +++ b/docs/cugraph/source/installation/index.rst @@ -5,6 +5,6 @@ Installation .. toctree:: :maxdepth: 3 - + getting_cugraph source_build diff --git a/docs/cugraph/source/references/cugraph_ref.md b/docs/cugraph/source/references/cugraph_ref.md index a646d6da2..845436a60 100644 --- a/docs/cugraph/source/references/cugraph_ref.md +++ b/docs/cugraph/source/references/cugraph_ref.md @@ -43,4 +43,3 @@

- diff --git a/docs/cugraph/source/references/datasets.md b/docs/cugraph/source/references/datasets.md index 3d45dec18..35234de87 100644 --- a/docs/cugraph/source/references/datasets.md +++ b/docs/cugraph/source/references/datasets.md @@ -4,18 +4,18 @@ 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*, + *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*, + *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.* + *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 + - 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/. \ No newline at end of file + - V. Krebs, unpublished, http://www.orgnet.com/. diff --git a/docs/cugraph/source/references/index.rst b/docs/cugraph/source/references/index.rst index d7a173a83..9ea51a083 100644 --- a/docs/cugraph/source/references/index.rst +++ b/docs/cugraph/source/references/index.rst @@ -5,7 +5,7 @@ References .. toctree:: :maxdepth: 3 - + cugraph_ref.md datasets.md licenses.md diff --git a/docs/cugraph/source/references/licenses.md b/docs/cugraph/source/references/licenses.md index dfc950023..b95905d9f 100644 --- a/docs/cugraph/source/references/licenses.md +++ b/docs/cugraph/source/references/licenses.md @@ -1,7 +1,7 @@ # License Most of the Graph code is open-sourced and developed under the Apache 2.0 licnese. -The cugraph-ops code is closed sourced and developed under a NVIDIA copyright +The cugraph-ops code is closed sourced and developed under a NVIDIA copyright diff --git a/docs/cugraph/source/releases/index.rst b/docs/cugraph/source/releases/index.rst index 7bd4f6dfa..cbd22324b 100644 --- a/docs/cugraph/source/releases/index.rst +++ b/docs/cugraph/source/releases/index.rst @@ -2,4 +2,4 @@ Releases ======== -https://github.com/rapidsai/cugraph/blob/main/CHANGELOG.md \ No newline at end of file +https://github.com/rapidsai/cugraph/blob/main/CHANGELOG.md diff --git a/docs/cugraph/source/tutorials/community_resources.md b/docs/cugraph/source/tutorials/community_resources.md index 572f85a01..1c4362393 100644 --- a/docs/cugraph/source/tutorials/community_resources.md +++ b/docs/cugraph/source/tutorials/community_resources.md @@ -1,2 +1,2 @@ # Commmunity Resources -[Rapids Community Repository](https://github.com/rapidsai-community/notebooks-contrib) \ No newline at end of file +[Rapids Community Repository](https://github.com/rapidsai-community/notebooks-contrib) diff --git a/docs/cugraph/source/tutorials/cugraph_blogs.rst b/docs/cugraph/source/tutorials/cugraph_blogs.rst index 368dbcce4..373e846f6 100644 --- a/docs/cugraph/source/tutorials/cugraph_blogs.rst +++ b/docs/cugraph/source/tutorials/cugraph_blogs.rst @@ -3,7 +3,7 @@ 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. +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: diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/cugraph/source/tutorials/cugraph_notebooks.md index d4251d4c9..559ba36e9 100644 --- a/docs/cugraph/source/tutorials/cugraph_notebooks.md +++ b/docs/cugraph/source/tutorials/cugraph_notebooks.md @@ -53,7 +53,7 @@ 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.8+ * A system with an NVIDIA GPU: Pascal architecture or better @@ -66,7 +66,7 @@ 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 +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/cugraph/source/tutorials/how_to_guides.md b/docs/cugraph/source/tutorials/how_to_guides.md index 42da6ed21..80be5b4ab 100644 --- a/docs/cugraph/source/tutorials/how_to_guides.md +++ b/docs/cugraph/source/tutorials/how_to_guides.md @@ -1,9 +1,9 @@ # How To Guides -- Basic use of cuGraph, on the page -- 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 \ No newline at end of file +- Basic use of cuGraph, on the page +- 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/cugraph/source/wholegraph/basics/wholememory_implementation_details.md b/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md index a5541109c..634539cd2 100644 --- a/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md +++ b/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md @@ -18,7 +18,7 @@ partition data into these GPU devices. The partition method guarantees that each GPU can access one continuous part of the entire memory. Here "can access" means can directly access from CUDA kernels, but the memory doesn't have to be physically on that GPU. For example,it can be on host memory or other GPU's device memory that can be access using P2P. -In that case the stored data has its own granularity that shouldn't be split. Data granularity can be specified while +In that case the stored data has its own granularity that shouldn't be split. Data granularity can be specified while creating WholeMemory. Then each data granularity can be considered as a block of data. The follow figure shows the layout of 15 data block over 4 GPUs. diff --git a/docs/cugraph/source/wholegraph/index.rst b/docs/cugraph/source/wholegraph/index.rst index 2a69544b4..bb2281b13 100644 --- a/docs/cugraph/source/wholegraph/index.rst +++ b/docs/cugraph/source/wholegraph/index.rst @@ -11,4 +11,3 @@ RAPIDS WholeGraph has following package: basics/index installation/index - diff --git a/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md b/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md index 5b2072b05..57314dcd4 100644 --- a/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md +++ b/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md @@ -1,7 +1,7 @@ # Getting the WholeGraph Packages -Start by reading the [RAPIDS Instalation guide](https://docs.rapids.ai/install) +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. diff --git a/print_env.sh b/print_env.sh index 6f2d33b0e..43abd1c7e 100644 --- a/print_env.sh +++ b/print_env.sh @@ -1,7 +1,8 @@ #!/usr/bin/env bash +# Copyright (c) 2019-2024, NVIDIA CORPORATION. # Reports relevant environment information useful for diagnosing and # debugging cuGraph issues. -# Usage: +# Usage: # "./print_env.sh" - prints to stdout # "./print_env.sh > env.txt" - prints to file "env.txt" @@ -14,16 +15,16 @@ git submodule status --recursive else echo "Not inside a git repository" fi -echo +echo echo "***OS Information***" cat /etc/*-release uname -a -echo +echo echo "***GPU Information***" nvidia-smi -echo +echo echo "***CPU***" lscpu @@ -31,15 +32,15 @@ echo echo "***CMake***" which cmake && cmake --version -echo +echo echo "***g++***" which g++ && g++ --version -echo +echo echo "***nvcc***" which nvcc && nvcc --version -echo +echo echo "***Python***" which python && python -c "import sys; print('Python {0}.{1}.{2}'.format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))" From b22f56296c15ffa87dea68d1290c875e3e4e6445 Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Mon, 11 Mar 2024 17:00:45 -0400 Subject: [PATCH 331/384] Replace local copyright check with pre-commit-hooks verify-copyright (#4130) The local `copyright.py` script is bug-prone. Replace it with a more robust centralized script from `pre-commit-hooks`. Authors: - Kyle Edwards (https://github.com/KyleFromNVIDIA) - Brad Rees (https://github.com/BradReesWork) Approvers: - Rick Ratzel (https://github.com/rlratzel) - Brad Rees (https://github.com/BradReesWork) - Jake Awe (https://github.com/AyodeAwe) URL: https://github.com/rapidsai/cugraph/pull/4130 --- .pre-commit-config.yaml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3d893e0e5..ddb84d8a0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,16 +46,20 @@ repos: ) types_or: [c, c++, cuda] args: ["-fallback-style=none", "-style=file", "-i"] - - repo: local - hooks: - - id: copyright-check - name: copyright-check - entry: python ./ci/checks/copyright.py --git-modified-only --update-current-year - language: python - pass_filenames: false - additional_dependencies: [gitpython] - repo: https://github.com/rapidsai/dependency-file-generator rev: v1.8.0 hooks: - id: rapids-dependency-file-generator args: ["--clean"] + - repo: https://github.com/rapidsai/pre-commit-hooks + rev: v0.0.1 + hooks: + - id: verify-copyright + files: | + (?x) + [.](cmake|cpp|cu|cuh|h|hpp|sh|pxd|py|pyx)$| + CMakeLists[.]txt$| + CMakeLists_standalone[.]txt$| + [.]flake8[.]cython$| + meta[.]yaml$| + setup[.]cfg$ From 0cab94580cb5099674ae103e73e5604eab21c7a3 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:18:49 -0400 Subject: [PATCH 332/384] Starting work on blog links and nx_cugraph docs (#4160) This PR starts to address updating cuGraph docs to reflect recent blogs and work on nx_cugraph as a backend for NetworkX Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/4160 --- docs/cugraph/source/api_docs/index.rst | 2 +- docs/cugraph/source/basics/nx_transition.rst | 42 ++--- .../source/graph_support/property_graph.md | 2 +- docs/cugraph/source/images/ancestors.png | Bin 0 -> 14156 bytes docs/cugraph/source/images/bfs_tree.png | Bin 0 -> 13763 bytes docs/cugraph/source/images/conn_component.png | Bin 0 -> 13053 bytes docs/cugraph/source/images/descendents.png | Bin 0 -> 13639 bytes docs/cugraph/source/images/k_truss.png | Bin 0 -> 13389 bytes docs/cugraph/source/images/katz.png | Bin 0 -> 13558 bytes docs/cugraph/source/images/pagerank.png | Bin 0 -> 13243 bytes docs/cugraph/source/images/sssp.png | Bin 0 -> 14542 bytes docs/cugraph/source/images/wcc.png | Bin 0 -> 14519 bytes docs/cugraph/source/index.rst | 1 + docs/cugraph/source/nx_cugraph/index.rst | 9 + docs/cugraph/source/nx_cugraph/nx_cugraph.md | 165 ++++++++++++++++++ .../source/tutorials/community_resources.md | 2 + .../source/tutorials/cugraph_blogs.rst | 15 ++ 17 files changed, 208 insertions(+), 30 deletions(-) create mode 100644 docs/cugraph/source/images/ancestors.png create mode 100644 docs/cugraph/source/images/bfs_tree.png create mode 100644 docs/cugraph/source/images/conn_component.png create mode 100644 docs/cugraph/source/images/descendents.png create mode 100644 docs/cugraph/source/images/k_truss.png create mode 100644 docs/cugraph/source/images/katz.png create mode 100644 docs/cugraph/source/images/pagerank.png create mode 100644 docs/cugraph/source/images/sssp.png create mode 100644 docs/cugraph/source/images/wcc.png create mode 100644 docs/cugraph/source/nx_cugraph/index.rst create mode 100644 docs/cugraph/source/nx_cugraph/nx_cugraph.md diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst index 1b907165a..d76902772 100644 --- a/docs/cugraph/source/api_docs/index.rst +++ b/docs/cugraph/source/api_docs/index.rst @@ -15,7 +15,7 @@ Core Graph API Documentation cugraph_c/index.rst cugraph_cpp/index.rst -Graph Nerual Networks API Documentation +Graph Neural Networks API Documentation --------------------------------------- .. toctree:: diff --git a/docs/cugraph/source/basics/nx_transition.rst b/docs/cugraph/source/basics/nx_transition.rst index 984986581..07c2ad26f 100644 --- a/docs/cugraph/source/basics/nx_transition.rst +++ b/docs/cugraph/source/basics/nx_transition.rst @@ -1,30 +1,20 @@ ************************************** -NetworkX Compatibility and Transition +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* -One of the goals of RAPIDS cuGraph is to mimic the NetworkX API to simplify -the transition to accelerated GPU data science. However, graph analysis, -also called network science, like most other data science workflow, is more -than just running an algorithm. Graph data requires cleaning and prep (ETL) -and then the construction of a graph object; that is all before the execution -of a graph algorithm. RAPIDS and cuGraph allow a portion or the complete -analytic workflow to be accelerated. To achieve the maximum amount of -acceleration, we encourage fully replacing existing code with cuGraph. -But sometimes it is easier to replace just a portion. - -Last Update -########### +Latest Update +############# -Last Update: Oct 14th, 2020 -Release: 0.16 +Last Update: March 7th, 2024 +Release: 24.04 -Information on `NetworkX `_ - -This transition guide in an expansion of the Medium Blog on `NetworkX Compatibility -`_ +**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 @@ -33,12 +23,11 @@ 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. + improvements. -In the following example, the cuGraph module is being imported as “cnx”. -While module can be assigned any name can be used, we picked cnx to reduce -the amount of text to be changed. The text highlighted in yellow indicates -changes. .. image:: ../images/Nx_Cg_1.png :width: 600 @@ -49,9 +38,6 @@ 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 ########################## @@ -169,8 +155,8 @@ 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 +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 diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/cugraph/source/graph_support/property_graph.md index ef07be79b..94d170c18 100644 --- a/docs/cugraph/source/graph_support/property_graph.md +++ b/docs/cugraph/source/graph_support/property_graph.md @@ -21,7 +21,7 @@ import cugraph from cugraph.experimental import PropertyGraph # Import a built-in dataset -from cugraph.experimental.datasets import karate +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 diff --git a/docs/cugraph/source/images/ancestors.png b/docs/cugraph/source/images/ancestors.png new file mode 100644 index 0000000000000000000000000000000000000000..37b8e7933a8832f4adfd51314611b5149a139b3a GIT binary patch literal 14156 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/conn_component.png b/docs/cugraph/source/images/conn_component.png new file mode 100644 index 0000000000000000000000000000000000000000..b7db09657c8dbe3f0ab8daa9e46b16ba1d52d836 GIT binary patch literal 13053 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 HoyY$N)qS`{l2sDjEI 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 bs<-3DBZhhW7Z=}E86E7Lk5n8w_49uKV)9rc literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/k_truss.png b/docs/cugraph/source/images/k_truss.png new file mode 100644 index 0000000000000000000000000000000000000000..78a1978d103909ee9b4467729d75ba55f6c35f88 GIT binary patch literal 13389 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 HEBF5wI1Br@ literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/katz.png b/docs/cugraph/source/images/katz.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2303a21e3a38cfe573aad4952e18dfcbd0fa9a GIT binary patch literal 13558 zcmdse2UL^k)-DcnWIQU2l@6mQ%@L#*AsIzMQ0a&Th!Bt#YA8~Y=%AuPKm`O05Fsc% znSiLY1PAE^q=p_fl0X7P2q7jR$qh4eW={Ff`TzUhbMIaEvKDK9CF?Ewec!#G{p|hS zb9S`b`Ddj+OG!!Xv_EsoRZ8kBQz@w}THkDyJZT)+_E;jeKwa%lN@4p|79=-c2c9^8 zLP`psxqZX;Pm=p>k!LPJrKDurHvhMDMwI(YNg1cvpE}`w-Dj!LI#b2&Neve_jfh12 zSk3J5R?-0Pu)GXDpj7*{Qtf&7oPMqcdzGD*INd2Vv?-77wrhNUkIlnX(8PY`@@6}#; zyQy}^$8tsE%}MR!lIzy)oA@nKQa4C9{&NxO4rZ^;^|I|U)e4CTY?`-h^_#lDfqt}A zLbPaoX{uKssBRjYNs*E32el+}^yqO5tO32f?6y?70T2-`)T6%`OkVSuw{DQV+;+K_ z9EP}JzT8y1b<47m0&36KU^XDWdt4>N{pI@XQJ6j?J!8eEzePS(VF2a=Vz5VcD7Nlz zfOd2!-!etJ*(q0=j)5UV-2i2_5{esE_qeF@XJ9=m>GjN~%bw@TKKsurB;8fy)IX

2FcNET8=>#w-9q9xnJYYv6B2096SBSEFO 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 NpLRTjJ$d!V{{a@l%UJ*b literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/pagerank.png b/docs/cugraph/source/images/pagerank.png new file mode 100644 index 0000000000000000000000000000000000000000..193c0a8bbd1519beecd28c9d61fa41ce8855c86e GIT binary patch literal 13243 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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/sssp.png b/docs/cugraph/source/images/sssp.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9dfc3685293d638b46a2058dd3b4a1adaa926e GIT binary patch literal 14542 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 CoHy?P literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/images/wcc.png b/docs/cugraph/source/images/wcc.png new file mode 100644 index 0000000000000000000000000000000000000000..2d27a3f675c32158a6f3f398274003e0835866f8 GIT binary patch literal 14519 zcmeHu30RW(+ILNjwwcp7Q>G?mQ%*UiWVoeLSvi$P6N=?VNohf9YG#VaG)_7*E@@8g zYnBQKWQseG<0S4{3gljippcRx5Fq$H)|_+Zyze>JyM5nxUGMvS&jl9`&-35^_y1mg z_kI6-=Cq5>I)im9R;u$-b}nSc)yh3 zLUidfh®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 literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index b18a79d33..9ea9e4d65 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -46,6 +46,7 @@ the docs and links :caption: Contents: basics/index + nx_cugraph/index installation/index tutorials/index graph_support/index diff --git a/docs/cugraph/source/nx_cugraph/index.rst b/docs/cugraph/source/nx_cugraph/index.rst new file mode 100644 index 000000000..ef6f51601 --- /dev/null +++ b/docs/cugraph/source/nx_cugraph/index.rst @@ -0,0 +1,9 @@ +=============================== +nxCugraph as a NetworkX Backend +=============================== + + +.. toctree:: + :maxdepth: 2 + + nx_cugraph.md diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/cugraph/source/nx_cugraph/nx_cugraph.md new file mode 100644 index 000000000..8d497e3a1 --- /dev/null +++ b/docs/cugraph/source/nx_cugraph/nx_cugraph.md @@ -0,0 +1,165 @@ +### nx_cugraph + + +Whereas previous versions of cuGraph have included mechanisms to make it +trivial to plug in cuGraph algorithm calls. Beginning with version 24.02, nx-cuGraph +is now a [networkX backend](). +The user now need only [install nx-cugraph]() +to experience GPU speedups. + +Lets look at some examples of algorithm speedups comparing CPU based NetworkX to dispatched versions run on GPU with nx_cugraph. + +Each chart has three measurements. +* NX - running the algorithm natively with networkX on CPU. +* nx-cugraph - running with GPU accelerated networkX achieved by simply calling the cugraph backend. This pays the overhead of building the GPU resident object for each algorithm called. This achieves significant improvement but stil isn't compleltely optimum. +* nx-cugraph (preconvert) - This is a bit more complicated since it involves building (precomputing) the GPU resident graph ahead and reusing it for each algorithm. + + +![Ancestors](../images/ancestors.png) +![BFS Tree](../images/bfs_tree.png) +![Connected Components](../images/conn_component.png) +![Descendents](../images/descendents.png) +![Katz](../images/katz.png) +![Pagerank](../images/pagerank.png) +![Single Source Shortest Path](../images/sssp.png) +![Weakly Connected Components](../images/wcc.png) + + +The following algorithms are supported and automatically dispatched to nx-cuGraph for acceleration. + +#### Algorithms +``` +bipartite + ├─ basic + │ └─ is_bipartite + └─ generators + └─ complete_bipartite_graph +centrality + ├─ betweenness + │ ├─ betweenness_centrality + │ └─ edge_betweenness_centrality + ├─ degree_alg + │ ├─ degree_centrality + │ ├─ in_degree_centrality + │ └─ out_degree_centrality + ├─ eigenvector + │ └─ eigenvector_centrality + └─ katz + └─ katz_centrality +cluster + ├─ average_clustering + ├─ clustering + ├─ transitivity + └─ triangles +community + └─ louvain + └─ louvain_communities +components + ├─ connected + │ ├─ connected_components + │ ├─ is_connected + │ ├─ node_connected_component + │ └─ number_connected_components + └─ weakly_connected + ├─ is_weakly_connected + ├─ number_weakly_connected_components + └─ weakly_connected_components +core + ├─ core_number + └─ k_truss +dag + ├─ ancestors + └─ descendants +isolate + ├─ is_isolate + ├─ isolates + └─ number_of_isolates +link_analysis + ├─ hits_alg + │ └─ hits + └─ pagerank_alg + └─ pagerank +operators + └─ unary + ├─ complement + └─ reverse +reciprocity + ├─ overall_reciprocity + └─ reciprocity +shortest_paths + └─ unweighted + ├─ single_source_shortest_path_length + └─ single_target_shortest_path_length +traversal + └─ breadth_first_search + ├─ bfs_edges + ├─ bfs_layers + ├─ bfs_predecessors + ├─ bfs_successors + ├─ bfs_tree + ├─ descendants_at_distance + └─ generic_bfs_edges +tree + └─ recognition + ├─ is_arborescence + ├─ is_branching + ├─ is_forest + └─ is_tree +``` + +#### Generators +``` +classic + ├─ barbell_graph + ├─ circular_ladder_graph + ├─ complete_graph + ├─ complete_multipartite_graph + ├─ cycle_graph + ├─ empty_graph + ├─ ladder_graph + ├─ lollipop_graph + ├─ null_graph + ├─ path_graph + ├─ star_graph + ├─ tadpole_graph + ├─ trivial_graph + ├─ turan_graph + └─ wheel_graph +community + └─ caveman_graph +small + ├─ bull_graph + ├─ chvatal_graph + ├─ cubical_graph + ├─ desargues_graph + ├─ diamond_graph + ├─ dodecahedral_graph + ├─ frucht_graph + ├─ heawood_graph + ├─ house_graph + ├─ house_x_graph + ├─ icosahedral_graph + ├─ krackhardt_kite_graph + ├─ moebius_kantor_graph + ├─ octahedral_graph + ├─ pappus_graph + ├─ petersen_graph + ├─ sedgewick_maze_graph + ├─ tetrahedral_graph + ├─ truncated_cube_graph + ├─ truncated_tetrahedron_graph + └─ tutte_graph +social + ├─ davis_southern_women_graph + ├─ florentine_families_graph + ├─ karate_club_graph + └─ les_miserables_graph +``` + +#### Other + +``` +convert_matrix + ├─ from_pandas_edgelist + └─ from_scipy_sparse_array +``` diff --git a/docs/cugraph/source/tutorials/community_resources.md b/docs/cugraph/source/tutorials/community_resources.md index 1c4362393..975f11965 100644 --- a/docs/cugraph/source/tutorials/community_resources.md +++ b/docs/cugraph/source/tutorials/community_resources.md @@ -1,2 +1,4 @@ # 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/cugraph/source/tutorials/cugraph_blogs.rst b/docs/cugraph/source/tutorials/cugraph_blogs.rst index 373e846f6..3665f425e 100644 --- a/docs/cugraph/source/tutorials/cugraph_blogs.rst +++ b/docs/cugraph/source/tutorials/cugraph_blogs.rst @@ -9,6 +9,17 @@ 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) `_ @@ -50,6 +61,8 @@ Media 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 @@ -58,6 +71,8 @@ Academic Papers * 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 ======================== From cd7a4bd3a4c546f888cf2c1e0f14101a63d1f8cb Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:16:46 -0500 Subject: [PATCH 333/384] Adds nx-cugraph benchmarks for APIs added to prior releases that were never benchmarked (#4228) * Adds benchmark for nx-cugraph `pagerank` with a personalization dict (see results below) * Adds several placeholder benchmarks for other nx-cugraph APIs added to prior releases that were never benchmarked. ![image](https://github.com/rapidsai/cugraph/assets/3039903/4692e2a2-e14a-489d-84f7-772eda6fc316) Authors: - Rick Ratzel (https://github.com/rlratzel) - Ralph Liu (https://github.com/nv-rliu) Approvers: - Erik Welch (https://github.com/eriknw) URL: https://github.com/rapidsai/cugraph/pull/4228 --- .../nx-cugraph/pytest-based/bench_algos.py | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py index 97eb32e2a..3b085a9bf 100644 --- a/benchmarks/nx-cugraph/pytest-based/bench_algos.py +++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py @@ -242,6 +242,28 @@ def get_highest_degree_node(graph_obj): return max(degrees, key=lambda t: t[1])[0] +def build_personalization_dict(pagerank_dict): + """ + Returns a dictionary that can be used as the personalization value for a + call to nx.pagerank(). The pagerank_dict passed in is used as the initial + source of values for each node, and this function simply treats the list of + dict values as two halves (halves A and B) and swaps them so (most if not + all) nodes/keys are assigned a different value from the dictionary. + """ + num_half = len(pagerank_dict) // 2 + A_half_items = list(pagerank_dict.items())[:num_half] + B_half_items = list(pagerank_dict.items())[num_half:] + + # Support an odd number of items by initializing with B_half_items, which + # will always be one bigger if the number of items is odd. This will leave + # the one remainder (in the case of an odd number) unchanged. + pers_dict = dict(B_half_items) + pers_dict.update({A_half_items[i][0]: B_half_items[i][1] for i in range(num_half)}) + pers_dict.update({B_half_items[i][0]: A_half_items[i][1] for i in range(num_half)}) + + return pers_dict + + ################################################################################ # Benchmarks def bench_from_networkx(benchmark, graph_obj): @@ -431,6 +453,26 @@ def bench_pagerank(benchmark, graph_obj, backend_wrapper): assert type(result) is dict +def bench_pagerank_personalized(benchmark, graph_obj, backend_wrapper): + G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) + + # FIXME: This will run for every combination of inputs, even if the + # graph/dataset does not change. Ideally this is run once per + # graph/dataset. + pagerank_dict = nx.pagerank(G) + personalization_dict = build_personalization_dict(pagerank_dict) + + result = benchmark.pedantic( + target=backend_wrapper(nx.pagerank), + args=(G,), + kwargs={"personalization": personalization_dict}, + rounds=rounds, + iterations=iterations, + warmup_rounds=warmup_rounds, + ) + assert type(result) is dict + + def bench_single_source_shortest_path_length(benchmark, graph_obj, backend_wrapper): G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper) node = get_highest_degree_node(graph_obj) @@ -804,3 +846,73 @@ def bench_weakly_connected_components(benchmark, graph_obj, backend_wrapper): warmup_rounds=warmup_rounds, ) assert type(result) is list + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_complete_bipartite_graph(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_connected_components(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_connected(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_node_connected_component(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_number_connected_components(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_isolate(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_isolates(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_number_of_isolates(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_complement(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_reverse(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_arborescence(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_branching(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_forest(benchmark, graph_obj, backend_wrapper): + pass + + +@pytest.mark.skip(reason="benchmark not implemented") +def bench_is_tree(benchmark, graph_obj, backend_wrapper): + pass From cc8e2ebc89fd392378fd240c466902274f57d101 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 13 Mar 2024 09:18:37 -0500 Subject: [PATCH 334/384] nx-cugraph: add more shortest path algorithms (#4199) This begins by adding more unweighted shortest path algorithms. Next we'll do weighted via `sssp`, then generic. Note that there are some performance improvements that can be made: - add bidirectional search between source and target - for `bidirectional_shortest_path` and `has_path` - alternatively, perform `bfs` from `source` until `target` is reached - run `all_pairs*` in batched groups Authors: - Erik Welch (https://github.com/eriknw) - Ralph Liu (https://github.com/nv-rliu) Approvers: - Brad Rees (https://github.com/BradReesWork) - Rick Ratzel (https://github.com/rlratzel) - Don Acosta (https://github.com/acostadon) URL: https://github.com/rapidsai/cugraph/pull/4199 --- python/nx-cugraph/README.md | 25 +- python/nx-cugraph/_nx_cugraph/__init__.py | 52 +++- python/nx-cugraph/lint.yaml | 4 +- .../nx_cugraph/algorithms/__init__.py | 2 +- .../algorithms/bipartite/__init__.py | 1 - .../nx_cugraph/algorithms/bipartite/basic.py | 31 -- .../algorithms/centrality/eigenvector.py | 9 +- .../nx_cugraph/algorithms/centrality/katz.py | 9 +- .../algorithms/link_analysis/hits_alg.py | 9 +- .../algorithms/link_analysis/pagerank_alg.py | 7 +- .../algorithms/shortest_paths/__init__.py | 4 +- .../algorithms/shortest_paths/generic.py | 165 ++++++++++ .../algorithms/shortest_paths/unweighted.py | 174 ++++++++++- .../algorithms/shortest_paths/weighted.py | 286 ++++++++++++++++++ python/nx-cugraph/nx_cugraph/interface.py | 14 + python/nx-cugraph/nx_cugraph/utils/misc.py | 14 +- python/nx-cugraph/scripts/update_readme.py | 0 17 files changed, 723 insertions(+), 83 deletions(-) delete mode 100644 python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py create mode 100644 python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py mode change 100644 => 100755 python/nx-cugraph/scripts/update_readme.py diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md index 8201dc34e..1bf310c8c 100644 --- a/python/nx-cugraph/README.md +++ b/python/nx-cugraph/README.md @@ -95,8 +95,6 @@ Below is the list of algorithms that are currently supported in nx-cugraph.

 bipartite
- ├─ basic
- │   └─ is_bipartite
  └─ generators
      └─ complete_bipartite_graph
 centrality
@@ -152,9 +150,26 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
  ├─ overall_reciprocity
  └─ reciprocity
 shortest_paths
- └─ unweighted
-     ├─ single_source_shortest_path_length
-     └─ single_target_shortest_path_length
+ ├─ generic
+ │   ├─ has_path
+ │   ├─ shortest_path
+ │   └─ shortest_path_length
+ ├─ unweighted
+ │   ├─ all_pairs_shortest_path
+ │   ├─ all_pairs_shortest_path_length
+ │   ├─ bidirectional_shortest_path
+ │   ├─ single_source_shortest_path
+ │   ├─ single_source_shortest_path_length
+ │   ├─ single_target_shortest_path
+ │   └─ single_target_shortest_path_length
+ └─ weighted
+     ├─ all_pairs_bellman_ford_path
+     ├─ all_pairs_bellman_ford_path_length
+     ├─ bellman_ford_path
+     ├─ bellman_ford_path_length
+     ├─ single_source_bellman_ford
+     ├─ single_source_bellman_ford_path
+     └─ single_source_bellman_ford_path_length
 traversal
  └─ breadth_first_search
      ├─ bfs_edges
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index b2f13d25f..bc7f63fcd 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -33,15 +33,22 @@
     # "description": "TODO",
     "functions": {
         # BEGIN: functions
+        "all_pairs_bellman_ford_path",
+        "all_pairs_bellman_ford_path_length",
+        "all_pairs_shortest_path",
+        "all_pairs_shortest_path_length",
         "ancestors",
         "average_clustering",
         "barbell_graph",
+        "bellman_ford_path",
+        "bellman_ford_path_length",
         "betweenness_centrality",
         "bfs_edges",
         "bfs_layers",
         "bfs_predecessors",
         "bfs_successors",
         "bfs_tree",
+        "bidirectional_shortest_path",
         "bull_graph",
         "caveman_graph",
         "chvatal_graph",
@@ -70,6 +77,7 @@
         "from_scipy_sparse_array",
         "frucht_graph",
         "generic_bfs_edges",
+        "has_path",
         "heawood_graph",
         "hits",
         "house_graph",
@@ -77,7 +85,6 @@
         "icosahedral_graph",
         "in_degree_centrality",
         "is_arborescence",
-        "is_bipartite",
         "is_branching",
         "is_connected",
         "is_forest",
@@ -110,7 +117,14 @@
         "reciprocity",
         "reverse",
         "sedgewick_maze_graph",
+        "shortest_path",
+        "shortest_path_length",
+        "single_source_bellman_ford",
+        "single_source_bellman_ford_path",
+        "single_source_bellman_ford_path_length",
+        "single_source_shortest_path",
         "single_source_shortest_path_length",
+        "single_target_shortest_path",
         "single_target_shortest_path_length",
         "star_graph",
         "tadpole_graph",
@@ -128,7 +142,11 @@
     },
     "additional_docs": {
         # BEGIN: additional_docs
+        "all_pairs_bellman_ford_path": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
+        "all_pairs_bellman_ford_path_length": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
         "average_clustering": "Directed graphs and `weight` parameter are not yet supported.",
+        "bellman_ford_path": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
+        "bellman_ford_path_length": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
         "betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.",
         "bfs_edges": "`sort_neighbors` parameter is not yet supported.",
         "bfs_predecessors": "`sort_neighbors` parameter is not yet supported.",
@@ -147,11 +165,28 @@
         "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.",
         "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.",
         "pagerank": "`dangling` parameter is not supported, but it is checked for validity.",
+        "shortest_path": "Negative weights are not yet supported, and method is ununsed.",
+        "shortest_path_length": "Negative weights are not yet supported, and method is ununsed.",
+        "single_source_bellman_ford": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
+        "single_source_bellman_ford_path": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
+        "single_source_bellman_ford_path_length": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
         "transitivity": "Directed graphs are not yet supported.",
         # END: additional_docs
     },
     "additional_parameters": {
         # BEGIN: additional_parameters
+        "all_pairs_bellman_ford_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "all_pairs_bellman_ford_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "bellman_ford_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "bellman_ford_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         "eigenvector_centrality": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
@@ -169,6 +204,21 @@
         "pagerank": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
+        "shortest_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "shortest_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "single_source_bellman_ford": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "single_source_bellman_ford_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "single_source_bellman_ford_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         # END: additional_parameters
     },
 }
diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml
index fdd24861d..3239fa151 100644
--- a/python/nx-cugraph/lint.yaml
+++ b/python/nx-cugraph/lint.yaml
@@ -50,7 +50,7 @@ repos:
       - id: black
       # - id: black-jupyter
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.2.2
+    rev: v0.3.2
     hooks:
       - id: ruff
         args: [--fix-only, --show-fixes]  # --unsafe-fixes]
@@ -77,7 +77,7 @@ repos:
         additional_dependencies: [tomli]
         files: ^(nx_cugraph|docs)/
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.2.2
+    rev: v0.3.2
     hooks:
       - id: ruff
   - repo: https://github.com/pre-commit/pre-commit-hooks
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py
index 7aafa85f5..b4a10bcf0 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/__init__.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/__init__.py
@@ -22,7 +22,7 @@
     traversal,
     tree,
 )
-from .bipartite import complete_bipartite_graph, is_bipartite
+from .bipartite import complete_bipartite_graph
 from .centrality import *
 from .cluster import *
 from .components import *
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py
index e028299c6..bfc7f1d4d 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/__init__.py
@@ -10,5 +10,4 @@
 # 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.
-from .basic import *
 from .generators import *
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py
deleted file mode 100644
index 46c6b5407..000000000
--- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/basic.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (c) 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
-#
-#     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.
-import cupy as cp
-
-from nx_cugraph.algorithms.cluster import _triangles
-from nx_cugraph.convert import _to_graph
-from nx_cugraph.utils import networkx_algorithm
-
-__all__ = [
-    "is_bipartite",
-]
-
-
-@networkx_algorithm(version_added="24.02", _plc="triangle_count")
-def is_bipartite(G):
-    G = _to_graph(G)
-    # Counting triangles may not be the fastest way to do this, but it is simple.
-    node_ids, triangles, is_single_node = _triangles(
-        G, None, symmetrize="union" if G.is_directed() else None
-    )
-    return int(cp.count_nonzero(triangles)) == 0
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py
index 65a863366..c32b6fbb7 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/eigenvector.py
@@ -36,17 +36,12 @@ def eigenvector_centrality(
     G, max_iter=100, tol=1.0e-6, nstart=None, weight=None, *, dtype=None
 ):
     """`nstart` parameter is not used, but it is checked for validity."""
-    G = _to_graph(G, weight, np.float32)
+    G = _to_graph(G, weight, 1, np.float32)
     if len(G) == 0:
         raise nx.NetworkXPointlessConcept(
             "cannot compute centrality for the null graph"
         )
-    if dtype is not None:
-        dtype = _get_float_dtype(dtype)
-    elif weight in G.edge_values:
-        dtype = _get_float_dtype(G.edge_values[weight].dtype)
-    else:
-        dtype = np.float32
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     if nstart is not None:
         # Check if given nstart is valid even though we don't use it
         nstart = G._dict_to_nodearray(nstart, dtype=dtype)
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py
index 4a0684f72..1c6ed6170 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/katz.py
@@ -49,15 +49,10 @@ def katz_centrality(
         # Redundant with the `_can_run` check below when being dispatched by NetworkX,
         # but we raise here in case this funcion is called directly.
         raise NotImplementedError("normalized=False is not supported.")
-    G = _to_graph(G, weight, np.float32)
+    G = _to_graph(G, weight, 1, np.float32)
     if (N := len(G)) == 0:
         return {}
-    if dtype is not None:
-        dtype = _get_float_dtype(dtype)
-    elif weight in G.edge_values:
-        dtype = _get_float_dtype(G.edge_values[weight].dtype)
-    else:
-        dtype = np.float32
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     if nstart is not None:
         # Check if given nstart is valid even though we don't use it
         nstart = G._dict_to_nodearray(nstart, 0, dtype)
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py
index e61a931c0..e529b83ab 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/hits_alg.py
@@ -46,15 +46,10 @@ def hits(
     weight="weight",
     dtype=None,
 ):
-    G = _to_graph(G, weight, np.float32)
+    G = _to_graph(G, weight, 1, np.float32)
     if (N := len(G)) == 0:
         return {}, {}
-    if dtype is not None:
-        dtype = _get_float_dtype(dtype)
-    elif weight in G.edge_values:
-        dtype = _get_float_dtype(G.edge_values[weight].dtype)
-    else:
-        dtype = np.float32
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     if nstart is not None:
         nstart = G._dict_to_nodearray(nstart, 0, dtype)
     if max_iter <= 0:
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py
index 40224e91d..41203a2bc 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/link_analysis/pagerank_alg.py
@@ -48,12 +48,7 @@ def pagerank(
     G = _to_graph(G, weight, 1, np.float32)
     if (N := len(G)) == 0:
         return {}
-    if dtype is not None:
-        dtype = _get_float_dtype(dtype)
-    elif weight in G.edge_values:
-        dtype = _get_float_dtype(G.edge_values[weight].dtype)
-    else:
-        dtype = np.float32
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     if nstart is not None:
         nstart = G._dict_to_nodearray(nstart, 0, dtype=dtype)
         if (total := nstart.sum()) == 0:
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py
index b7d6b7421..9d87389a9 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -10,4 +10,6 @@
 # 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.
+from .generic import *
 from .unweighted import *
+from .weighted import *
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py
new file mode 100644
index 000000000..68dbbace9
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py
@@ -0,0 +1,165 @@
+# Copyright (c) 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
+#
+#     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.
+import networkx as nx
+import numpy as np
+
+import nx_cugraph as nxcg
+from nx_cugraph.convert import _to_graph
+from nx_cugraph.utils import _dtype_param, _get_float_dtype, networkx_algorithm
+
+from .unweighted import _bfs
+from .weighted import _sssp
+
+__all__ = [
+    "shortest_path",
+    "shortest_path_length",
+    "has_path",
+]
+
+
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def has_path(G, source, target):
+    # TODO PERF: make faster in core
+    try:
+        nxcg.bidirectional_shortest_path(G, source, target)
+    except nx.NetworkXNoPath:
+        return False
+    return True
+
+
+@networkx_algorithm(
+    extra_params=_dtype_param, version_added="24.04", _plc={"bfs", "sssp"}
+)
+def shortest_path(
+    G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None
+):
+    """Negative weights are not yet supported, and method is ununsed."""
+    if method not in {"dijkstra", "bellman-ford"}:
+        raise ValueError(f"method not supported: {method}")
+    if weight is None:
+        method = "unweighted"
+    if source is None:
+        if target is None:
+            # All pairs
+            if method == "unweighted":
+                paths = nxcg.all_pairs_shortest_path(G)
+            else:
+                # method == "dijkstra":
+                # method == 'bellman-ford':
+                paths = nxcg.all_pairs_bellman_ford_path(G, weight=weight, dtype=dtype)
+            if nx.__version__[:3] <= "3.4":
+                paths = dict(paths)
+        # To target
+        elif method == "unweighted":
+            paths = nxcg.single_target_shortest_path(G, target)
+        else:
+            # method == "dijkstra":
+            # method == 'bellman-ford':
+            # XXX: it seems weird that `reverse_path=True` is necessary here
+            G = _to_graph(G, weight, 1, np.float32)
+            dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+            paths = _sssp(
+                G, target, weight, return_type="path", dtype=dtype, reverse_path=True
+            )
+    elif target is None:
+        # From source
+        if method == "unweighted":
+            paths = nxcg.single_source_shortest_path(G, source)
+        else:
+            # method == "dijkstra":
+            # method == 'bellman-ford':
+            paths = nxcg.single_source_bellman_ford_path(
+                G, source, weight=weight, dtype=dtype
+            )
+    # From source to target
+    elif method == "unweighted":
+        paths = nxcg.bidirectional_shortest_path(G, source, target)
+    else:
+        # method == "dijkstra":
+        # method == 'bellman-ford':
+        paths = nxcg.bellman_ford_path(G, source, target, weight, dtype=dtype)
+    return paths
+
+
+@shortest_path._can_run
+def _(G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(
+    extra_params=_dtype_param, version_added="24.04", _plc={"bfs", "sssp"}
+)
+def shortest_path_length(
+    G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None
+):
+    """Negative weights are not yet supported, and method is ununsed."""
+    if method not in {"dijkstra", "bellman-ford"}:
+        raise ValueError(f"method not supported: {method}")
+    if weight is None:
+        method = "unweighted"
+    if source is None:
+        if target is None:
+            # All pairs
+            if method == "unweighted":
+                lengths = nxcg.all_pairs_shortest_path_length(G)
+            else:
+                # method == "dijkstra":
+                # method == 'bellman-ford':
+                lengths = nxcg.all_pairs_bellman_ford_path_length(
+                    G, weight=weight, dtype=dtype
+                )
+        # To target
+        elif method == "unweighted":
+            lengths = nxcg.single_target_shortest_path_length(G, target)
+            if nx.__version__[:3] <= "3.4":
+                lengths = dict(lengths)
+        else:
+            # method == "dijkstra":
+            # method == 'bellman-ford':
+            lengths = nxcg.single_source_bellman_ford_path_length(
+                G, target, weight=weight, dtype=dtype
+            )
+    elif target is None:
+        # From source
+        if method == "unweighted":
+            lengths = nxcg.single_source_shortest_path_length(G, source)
+        else:
+            # method == "dijkstra":
+            # method == 'bellman-ford':
+            lengths = dict(
+                nxcg.single_source_bellman_ford_path_length(
+                    G, source, weight=weight, dtype=dtype
+                )
+            )
+    # From source to target
+    elif method == "unweighted":
+        G = _to_graph(G)
+        lengths = _bfs(G, source, None, "Source", return_type="length", target=target)
+    else:
+        # method == "dijkstra":
+        # method == 'bellman-ford':
+        lengths = nxcg.bellman_ford_path_length(G, source, target, weight, dtype=dtype)
+    return lengths
+
+
+@shortest_path_length._can_run
+def _(G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
index 201249595..714289c5b 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
@@ -10,33 +10,127 @@
 # 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.
+import itertools
+
 import cupy as cp
 import networkx as nx
 import numpy as np
 import pylibcugraph as plc
 
 from nx_cugraph.convert import _to_graph
-from nx_cugraph.utils import index_dtype, networkx_algorithm
+from nx_cugraph.utils import _groupby, index_dtype, networkx_algorithm
+
+__all__ = [
+    "bidirectional_shortest_path",
+    "single_source_shortest_path",
+    "single_source_shortest_path_length",
+    "single_target_shortest_path",
+    "single_target_shortest_path_length",
+    "all_pairs_shortest_path",
+    "all_pairs_shortest_path_length",
+]
 
-__all__ = ["single_source_shortest_path_length", "single_target_shortest_path_length"]
+concat = itertools.chain.from_iterable
 
 
 @networkx_algorithm(version_added="23.12", _plc="bfs")
 def single_source_shortest_path_length(G, source, cutoff=None):
-    return _single_shortest_path_length(G, source, cutoff, "Source")
+    G = _to_graph(G)
+    return _bfs(G, source, cutoff, "Source", return_type="length")
 
 
 @networkx_algorithm(version_added="23.12", _plc="bfs")
 def single_target_shortest_path_length(G, target, cutoff=None):
-    return _single_shortest_path_length(G, target, cutoff, "Target")
+    G = _to_graph(G)
+    rv = _bfs(G, target, cutoff, "Target", return_type="length")
+    if nx.__version__[:3] <= "3.4":
+        return iter(rv.items())
+    return rv
+
+
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def all_pairs_shortest_path_length(G, cutoff=None):
+    # TODO PERF: batched bfs to compute many at once
+    G = _to_graph(G)
+    for n in G:
+        yield (n, _bfs(G, n, cutoff, "Source", return_type="length"))
 
 
-def _single_shortest_path_length(G, source, cutoff, kind):
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def bidirectional_shortest_path(G, source, target):
+    # TODO PERF: do bidirectional traversal in core
     G = _to_graph(G)
+    if source not in G or target not in G:
+        raise nx.NodeNotFound(f"Either source {source} or target {target} is not in G")
+    return _bfs(G, source, None, "Source", return_type="path", target=target)
+
+
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def single_source_shortest_path(G, source, cutoff=None):
+    G = _to_graph(G)
+    return _bfs(G, source, cutoff, "Source", return_type="path")
+
+
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def single_target_shortest_path(G, target, cutoff=None):
+    G = _to_graph(G)
+    return _bfs(G, target, cutoff, "Target", return_type="path", reverse_path=True)
+
+
+@networkx_algorithm(version_added="24.04", _plc="bfs")
+def all_pairs_shortest_path(G, cutoff=None):
+    # TODO PERF: batched bfs to compute many at once
+    G = _to_graph(G)
+    for n in G:
+        yield (n, _bfs(G, n, cutoff, "Source", return_type="path"))
+
+
+def _bfs(
+    G, source, cutoff, kind, *, return_type, reverse_path=False, target=None, scale=None
+):
+    """BFS for unweighted shortest path algorithms.
+
+    Parameters
+    ----------
+    source: node label
+
+    cutoff: int, optional
+
+    kind: {"Source", "Target"}
+
+    return_type: {"length", "path", "length-path"}
+
+    reverse_path: bool
+
+    target: node label
+
+    scale: int or float, optional
+        The amount to scale the lengths
+    """
+    # DRY: _sssp in weighted.py has similar code
     if source not in G:
-        raise nx.NodeNotFound(f"{kind} {source} is not in G")
-    if G.src_indices.size == 0:
-        return {source: 0}
+        # Different message to pass networkx tests
+        if return_type == "length":
+            raise nx.NodeNotFound(f"{kind} {source} is not in G")
+        raise nx.NodeNotFound(f"{kind} {source} not in G")
+    if target is not None:
+        if source == target or cutoff is not None and cutoff <= 0:
+            if return_type == "path":
+                return [source]
+            if return_type == "length":
+                return 0
+            # return_type == "length-path"
+            return 0, [source]
+        if target not in G or G.src_indices.size == 0:
+            raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+    elif G.src_indices.size == 0 or cutoff is not None and cutoff <= 0:
+        if return_type == "path":
+            return {source: [source]}
+        if return_type == "length":
+            return {source: 0}
+        # return_type == "length-path"
+        return {source: 0}, {source: [source]}
+
     if cutoff is None:
         cutoff = -1
     src_index = source if G.key_to_id is None else G.key_to_id[source]
@@ -46,8 +140,68 @@ def _single_shortest_path_length(G, source, cutoff, kind):
         sources=cp.array([src_index], index_dtype),
         direction_optimizing=False,  # True for undirected only; what's recommended?
         depth_limit=cutoff,
-        compute_predecessors=False,
+        compute_predecessors=return_type != "length",
         do_expensive_check=False,
     )
     mask = distances != np.iinfo(distances.dtype).max
-    return G._nodearrays_to_dict(node_ids[mask], distances[mask])
+    node_ids = node_ids[mask]
+    if return_type != "path":
+        lengths = distances = distances[mask]
+        if scale is not None:
+            lengths = scale * lengths
+        lengths = G._nodearrays_to_dict(node_ids, lengths)
+        if target is not None:
+            if target not in lengths:
+                raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+            lengths = lengths[target]
+    if return_type != "length":
+        if target is not None:
+            d = dict(zip(node_ids.tolist(), predecessors[mask].tolist()))
+            dst_index = target if G.key_to_id is None else G.key_to_id[target]
+            if dst_index not in d:
+                raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+            cur = dst_index
+            paths = [dst_index]
+            while cur != src_index:
+                cur = d[cur]
+                paths.append(cur)
+            if (id_to_key := G.id_to_key) is not None:
+                if reverse_path:
+                    paths = [id_to_key[cur] for cur in paths]
+                else:
+                    paths = [id_to_key[cur] for cur in reversed(paths)]
+            elif not reverse_path:
+                paths.reverse()
+        else:
+            if return_type == "path":
+                distances = distances[mask]
+            groups = _groupby(distances, [predecessors[mask], node_ids])
+
+            # `pred_node_iter` does the equivalent as these nested for loops:
+            # for length in range(1, len(groups)):
+            #     preds, nodes = groups[length]
+            #     for pred, node in zip(preds.tolist(), nodes.tolist()):
+            if G.key_to_id is None:
+                pred_node_iter = concat(
+                    zip(*(x.tolist() for x in groups[length]))
+                    for length in range(1, len(groups))
+                )
+            else:
+                pred_node_iter = concat(
+                    zip(*(G._nodeiter_to_iter(x.tolist()) for x in groups[length]))
+                    for length in range(1, len(groups))
+                )
+            # Consider making utility functions for creating paths
+            paths = {source: [source]}
+            if reverse_path:
+                for pred, node in pred_node_iter:
+                    paths[node] = [node, *paths[pred]]
+            else:
+                for pred, node in pred_node_iter:
+                    paths[node] = [*paths[pred], node]
+    if return_type == "path":
+        return paths
+    if return_type == "length":
+        return lengths
+    # return_type == "length-path"
+    return lengths, paths
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py
new file mode 100644
index 000000000..32323dd45
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py
@@ -0,0 +1,286 @@
+# Copyright (c) 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
+#
+#     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.
+import networkx as nx
+import numpy as np
+import pylibcugraph as plc
+
+from nx_cugraph.convert import _to_graph
+from nx_cugraph.utils import (
+    _dtype_param,
+    _get_float_dtype,
+    _groupby,
+    networkx_algorithm,
+)
+
+from .unweighted import _bfs
+
+__all__ = [
+    "bellman_ford_path",
+    "bellman_ford_path_length",
+    "single_source_bellman_ford",
+    "single_source_bellman_ford_path",
+    "single_source_bellman_ford_path_length",
+    "all_pairs_bellman_ford_path",
+    "all_pairs_bellman_ford_path_length",
+]
+
+
+def _add_doc(func):
+    func.__doc__ = (
+        "Negative cycles are not yet supported. ``NotImplementedError`` will be raised "
+        "if there are negative edge weights. We plan to support negative edge weights "
+        "soon. Also, callable ``weight`` argument is not supported."
+    )
+    return func
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def bellman_ford_path(G, source, target, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, target, return_type="path", dtype=dtype)
+
+
+@bellman_ford_path._can_run
+def _(G, source, target, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def bellman_ford_path_length(G, source, target, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, target, return_type="length", dtype=dtype)
+
+
+@bellman_ford_path_length._can_run
+def _(G, source, target, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def single_source_bellman_ford_path(G, source, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, return_type="path", dtype=dtype)
+
+
+@single_source_bellman_ford_path._can_run
+def _(G, source, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def single_source_bellman_ford_path_length(G, source, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, return_type="length", dtype=dtype)
+
+
+@single_source_bellman_ford_path_length._can_run
+def _(G, source, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def single_source_bellman_ford(G, source, target=None, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, target, return_type="length-path", dtype=dtype)
+
+
+@single_source_bellman_ford._can_run
+def _(G, source, target=None, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def all_pairs_bellman_ford_path_length(G, weight="weight", *, dtype=None):
+    # TODO PERF: batched bfs to compute many at once
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    for n in G:
+        yield (n, _sssp(G, n, weight, return_type="length", dtype=dtype))
+
+
+@all_pairs_bellman_ford_path_length._can_run
+def _(G, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def all_pairs_bellman_ford_path(G, weight="weight", *, dtype=None):
+    # TODO PERF: batched bfs to compute many at once
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    for n in G:
+        yield (n, _sssp(G, n, weight, return_type="path", dtype=dtype))
+
+
+@all_pairs_bellman_ford_path._can_run
+def _(G, weight="weight", *, dtype=None):
+    return (
+        weight is None
+        or not callable(weight)
+        and not nx.is_negatively_weighted(G, weight=weight)
+    )
+
+
+def _sssp(G, source, weight, target=None, *, return_type, dtype, reverse_path=False):
+    """SSSP for weighted shortest paths.
+
+    Parameters
+    ----------
+    return_type : {"length", "path", "length-path"}
+
+    """
+    # DRY: _bfs in unweighted.py has similar code
+    if source not in G:
+        raise nx.NodeNotFound(f"Node {source} not found in graph")
+    if target is not None:
+        if source == target:
+            if return_type == "path":
+                return [source]
+            if return_type == "length":
+                return 0
+            # return_type == "length-path"
+            return 0, [source]
+        if target not in G or G.src_indices.size == 0:
+            raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+    elif G.src_indices.size == 0:
+        if return_type == "path":
+            return {source: [source]}
+        if return_type == "length":
+            return {source: 0}
+        # return_type == "length-path"
+        return {source: 0}, {source: [source]}
+
+    if callable(weight):
+        raise NotImplementedError("callable `weight` argument is not supported")
+
+    if weight not in G.edge_values:
+        # No edge values, so use BFS instead
+        return _bfs(G, source, None, "Source", return_type=return_type, target=target)
+
+    # Check for negative values since we don't support negative cycles
+    edge_vals = G.edge_values[weight]
+    if weight in G.edge_masks:
+        edge_vals = edge_vals[G.edge_masks[weight]]
+    if (edge_vals < 0).any():
+        raise NotImplementedError("Negative edge weights not yet supported")
+    edge_val = edge_vals[0]
+    if (edge_vals == edge_val).all() and (
+        edge_vals.size == G.src_indices.size or edge_val == 1
+    ):
+        # Edge values are all the same, so use scaled BFS instead
+        return _bfs(
+            G,
+            source,
+            None,
+            "Source",
+            return_type=return_type,
+            target=target,
+            scale=edge_val,
+            reverse_path=reverse_path,
+        )
+
+    src_index = source if G.key_to_id is None else G.key_to_id[source]
+    node_ids, distances, predecessors = plc.sssp(
+        resource_handle=plc.ResourceHandle(),
+        graph=G._get_plc_graph(weight, 1, dtype),
+        source=src_index,
+        cutoff=np.inf,
+        compute_predecessors=True,  # TODO: False is not yet supported
+        # compute_predecessors=return_type != "length",
+        do_expensive_check=False,
+    )
+    mask = distances != np.finfo(distances.dtype).max
+    node_ids = node_ids[mask]
+    if return_type != "path":
+        lengths = G._nodearrays_to_dict(node_ids, distances[mask])
+        if target is not None:
+            if target not in lengths:
+                raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+            lengths = lengths[target]
+    if return_type != "length":
+        if target is not None:
+            d = dict(zip(node_ids.tolist(), predecessors[mask].tolist()))
+            dst_index = target if G.key_to_id is None else G.key_to_id[target]
+            if dst_index not in d:
+                raise nx.NetworkXNoPath(f"Node {target} not reachable from {source}")
+            cur = dst_index
+            paths = [dst_index]
+            while cur != src_index:
+                cur = d[cur]
+                paths.append(cur)
+            if (id_to_key := G.id_to_key) is not None:
+                if reverse_path:
+                    paths = [id_to_key[cur] for cur in paths]
+                else:
+                    paths = [id_to_key[cur] for cur in reversed(paths)]
+            elif not reverse_path:
+                paths.reverse()
+        else:
+            groups = _groupby(predecessors[mask], node_ids)
+            if (id_to_key := G.id_to_key) is not None:
+                groups = {id_to_key[k]: v for k, v in groups.items() if k >= 0}
+            paths = {source: [source]}
+            preds = [source]
+            while preds:
+                pred = preds.pop()
+                pred_path = paths[pred]
+                nodes = G._nodearray_to_list(groups[pred])
+                if reverse_path:
+                    for node in nodes:
+                        paths[node] = [node, *pred_path]
+                else:
+                    for node in nodes:
+                        paths[node] = [*pred_path, node]
+                preds.extend(nodes & groups.keys())
+    if return_type == "path":
+        return paths
+    if return_type == "length":
+        return lengths
+    # return_type == "length-path"
+    return lengths, paths
diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py
index d044ba696..0d893ac28 100644
--- a/python/nx-cugraph/nx_cugraph/interface.py
+++ b/python/nx-cugraph/nx_cugraph/interface.py
@@ -67,6 +67,7 @@ def key(testpath):
         no_multigraph = "multigraphs not currently supported"
         louvain_different = "Louvain may be different due to RNG"
         no_string_dtype = "string edge values not currently supported"
+        sssp_path_different = "sssp may choose a different valid path"
 
         xfail = {
             # This is removed while strongly_connected_components() is not
@@ -77,6 +78,19 @@ def key(testpath):
             #     "test_strongly_connected.py:"
             #     "TestStronglyConnected.test_condensation_mapping_and_members"
             # ): "Strongly connected groups in different iteration order",
+            key(
+                "test_cycles.py:TestMinimumCycleBasis.test_unweighted_diamond"
+            ): sssp_path_different,
+            key(
+                "test_cycles.py:TestMinimumCycleBasis.test_weighted_diamond"
+            ): sssp_path_different,
+            key(
+                "test_cycles.py:TestMinimumCycleBasis.test_petersen_graph"
+            ): sssp_path_different,
+            key(
+                "test_cycles.py:TestMinimumCycleBasis."
+                "test_gh6787_and_edge_attribute_names"
+            ): sssp_path_different,
         }
 
         from packaging.version import parse
diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py
index aa06d7fd2..eab4b42c2 100644
--- a/python/nx-cugraph/nx_cugraph/utils/misc.py
+++ b/python/nx-cugraph/nx_cugraph/utils/misc.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -22,7 +22,9 @@
 import numpy as np
 
 if TYPE_CHECKING:
-    from ..typing import Dtype
+    import nx_cugraph as nxcg
+
+    from ..typing import Dtype, EdgeKey
 
 try:
     from itertools import pairwise  # Python >=3.10
@@ -190,10 +192,14 @@ def _get_int_dtype(
         raise ValueError("Value is too large to store as integer: {val}") from exc
 
 
-def _get_float_dtype(dtype: Dtype):
+def _get_float_dtype(
+    dtype: Dtype, *, graph: nxcg.Graph | None = None, weight: EdgeKey | None = None
+):
     """Promote dtype to float32 or float64 as appropriate."""
     if dtype is None:
-        return np.dtype(np.float32)
+        if graph is None or weight not in graph.edge_values:
+            return np.dtype(np.float32)
+        dtype = graph.edge_values[weight].dtype
     rv = np.promote_types(dtype, np.float32)
     if np.float32 != rv != np.float64:
         raise TypeError(
diff --git a/python/nx-cugraph/scripts/update_readme.py b/python/nx-cugraph/scripts/update_readme.py
old mode 100644
new mode 100755

From a6b900bea92503c8a175fc7b9c187f1cc9d52f5e Mon Sep 17 00:00:00 2001
From: Bradley Dice 
Date: Wed, 13 Mar 2024 10:22:13 -0500
Subject: [PATCH 335/384] Add upper bound to prevent usage of NumPy 2 (#4233)

NumPy 2 is expected to be released in the near future. For the RAPIDS 24.04 release, we will pin to `numpy>=1.23,<2.0a0`. This PR adds an upper bound to affected RAPIDS repositories.

xref: https://github.com/rapidsai/build-planning/issues/29

Authors:
  - Bradley Dice (https://github.com/bdice)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)
  - Ray Douglass (https://github.com/raydouglass)

URL: https://github.com/rapidsai/cugraph/pull/4233
---
 python/nx-cugraph/pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index 07ec0eab2..dbdc8dd19 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -33,7 +33,7 @@ classifiers = [
 dependencies = [
     "cupy-cuda11x>=12.0.0",
     "networkx>=3.0",
-    "numpy>=1.23",
+    "numpy>=1.23,<2.0a0",
     "pylibcugraph==24.4.*",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 

From ae1190e0d0033dd79309694dec8324b37df3bd48 Mon Sep 17 00:00:00 2001
From: Kyle Edwards 
Date: Wed, 13 Mar 2024 15:20:37 -0400
Subject: [PATCH 336/384] Remove hard-coding of RAPIDS version where possible
 (#4217)

* Read `VERSION` file in CMake
* Read `cugraph.__version__` in docs build
* Read `VERSION` file in shell scripts
* Use environment variables in Doxyfile
* Remove updates from `ci/update-version.sh`

Issue: https://github.com/rapidsai/build-planning/issues/15

Authors:
  - Kyle Edwards (https://github.com/KyleFromNVIDIA)

Approvers:
  - Don Acosta (https://github.com/acostadon)
  - Chuck Hastings (https://github.com/ChuckHastings)
  - Brad Rees (https://github.com/BradReesWork)
  - Jake Awe (https://github.com/AyodeAwe)
  - https://github.com/jakirkham

URL: https://github.com/rapidsai/cugraph/pull/4217
---
 docs/cugraph/source/conf.py                           |  9 +++++++--
 python/nx-cugraph/{nx_cugraph => _nx_cugraph}/VERSION |  0
 python/nx-cugraph/_nx_cugraph/__init__.py             | 11 +++++++----
 .../{nx_cugraph => _nx_cugraph}/_version.py           |  2 +-
 python/nx-cugraph/nx_cugraph/__init__.py              |  4 ++--
 python/nx-cugraph/pyproject.toml                      |  2 +-
 6 files changed, 18 insertions(+), 10 deletions(-)
 rename python/nx-cugraph/{nx_cugraph => _nx_cugraph}/VERSION (100%)
 rename python/nx-cugraph/{nx_cugraph => _nx_cugraph}/_version.py (91%)

diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py
index 719f94d48..952b962ac 100644
--- a/docs/cugraph/source/conf.py
+++ b/docs/cugraph/source/conf.py
@@ -19,6 +19,10 @@
 import os
 import sys
 
+from packaging.version import Version
+
+import 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
@@ -76,10 +80,11 @@
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
+CUGRAPH_VERSION = Version(cugraph.__version__)
 # The short X.Y version.
-version = '24.04'
+version = f"{CUGRAPH_VERSION.major:02}.{CUGRAPH_VERSION.minor:02}"
 # The full version, including alpha/beta/rc tags.
-release = '24.04.00'
+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.
diff --git a/python/nx-cugraph/nx_cugraph/VERSION b/python/nx-cugraph/_nx_cugraph/VERSION
similarity index 100%
rename from python/nx-cugraph/nx_cugraph/VERSION
rename to python/nx-cugraph/_nx_cugraph/VERSION
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index bc7f63fcd..8c6a65046 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -23,12 +23,18 @@
 $ python _nx_cugraph/__init__.py
 """
 
+from packaging.version import Version
+
+from _nx_cugraph._version import __version__
+
+_nx_cugraph_version = Version(__version__)
+
 # Entries between BEGIN and END are automatically generated
 _info = {
     "backend_name": "cugraph",
     "project": "nx-cugraph",
     "package": "nx_cugraph",
-    "url": "https://github.com/rapidsai/cugraph/tree/branch-24.04/python/nx-cugraph",
+    "url": f"https://github.com/rapidsai/cugraph/tree/branch-{_nx_cugraph_version.major:02}.{_nx_cugraph_version.minor:02}/python/nx-cugraph",
     "short_summary": "GPU-accelerated backend.",
     # "description": "TODO",
     "functions": {
@@ -252,9 +258,6 @@ def get_info():
     return d
 
 
-# FIXME: can this use the standard VERSION file and update mechanism?
-__version__ = "24.04.00"
-
 if __name__ == "__main__":
     from pathlib import Path
 
diff --git a/python/nx-cugraph/nx_cugraph/_version.py b/python/nx-cugraph/_nx_cugraph/_version.py
similarity index 91%
rename from python/nx-cugraph/nx_cugraph/_version.py
rename to python/nx-cugraph/_nx_cugraph/_version.py
index a528a3bfe..dc2d2a3a3 100644
--- a/python/nx-cugraph/nx_cugraph/_version.py
+++ b/python/nx-cugraph/_nx_cugraph/_version.py
@@ -19,6 +19,6 @@
 # to update version info (including commit hashes) without modifying
 # source files.
 __version__ = (
-    importlib.resources.files("nx_cugraph").joinpath("VERSION").read_text().strip()
+    importlib.resources.files("_nx_cugraph").joinpath("VERSION").read_text().strip()
 )
 __git_commit__ = ""
diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py
index 3a8f0996e..2c54da878 100644
--- a/python/nx-cugraph/nx_cugraph/__init__.py
+++ b/python/nx-cugraph/nx_cugraph/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -29,4 +29,4 @@
 from . import algorithms
 from .algorithms import *
 
-from nx_cugraph._version import __git_commit__, __version__
+from _nx_cugraph._version import __git_commit__, __version__
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index dbdc8dd19..2ff53c1a3 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -71,7 +71,7 @@ cugraph = "_nx_cugraph:get_info"
 license-files = ["LICENSE"]
 
 [tool.setuptools.dynamic]
-version = {file = "nx_cugraph/VERSION"}
+version = {file = "_nx_cugraph/VERSION"}
 
 [tool.setuptools.packages.find]
 include = [

From 8ccdcaf9e2dfe48235484fc9a5e0120b736d2f2f Mon Sep 17 00:00:00 2001
From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com>
Date: Wed, 13 Mar 2024 17:22:23 -0500
Subject: [PATCH 337/384] Updates nx-cugraph `README` for latest h/w, CUDA,
 python, NX requirements, moves updater to pre-commit (#4225)

* Updates nx-cugraph `README` for latest h/w, CUDA, python, NX requirements
* Moves the call to the nx-cugraph `README` check and auto-updater script from the python CI test script to a pre-commit hook alongside the other codegen calls/checks.  The pre-commit checks are run by the dev at commit-time and by CI as part of the style check job.  This check will only run for changes to files under the `nx-cugraph` subdir.
* Updates the `update_readme.py` script to optionally download the NX `objects.inv` file itself so calling `make` is not required as part of the pre-commit hook.
  * _NOTE: This is less important though, since the pre-commit hook still calls `bash` in order to set the `PYTHONPATH` env var to use the local version of the `update_readme.py` script, which is what I was trying to avoid in the first place. This still has some advantages in making the `update_readme.py` script more usable if the user isn't aware of how to obtain a `objects.inv` file, but feedback is welcome. The hook could also be changed to just call `make` if that ends up being preferred, in which case we'd have to consider if we still want the updates to `update_readme.py` to download the `objects.inv` file itself or not._

Here's the check running as part of the style-check job for this PR:
![image](https://github.com/rapidsai/cugraph/assets/3039903/6a313308-0901-4614-862e-d2596a7754f4)

Authors:
  - Rick Ratzel (https://github.com/rlratzel)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Jake Awe (https://github.com/AyodeAwe)
  - Don Acosta (https://github.com/acostadon)
  - Erik Welch (https://github.com/eriknw)

URL: https://github.com/rapidsai/cugraph/pull/4225
---
 .pre-commit-config.yaml                    | 20 ++++++++
 python/nx-cugraph/README.md                | 20 +++++---
 python/nx-cugraph/_nx_cugraph/__init__.py  | 16 ++++++
 python/nx-cugraph/_nx_cugraph/core.py      | 19 ++++++--
 python/nx-cugraph/scripts/update_readme.py | 57 ++++++++++++++++++++--
 5 files changed, 116 insertions(+), 16 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ddb84d8a0..542e9cacb 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -63,3 +63,23 @@ repos:
               [.]flake8[.]cython$|
               meta[.]yaml$|
               setup[.]cfg$
+  - repo: local
+    hooks:
+      - id: nx-cugraph-meta-data-update
+        name: nx-cugraph meta-data updater
+        entry: bash -c "PYTHONPATH=./python/nx-cugraph python ./python/nx-cugraph/_nx_cugraph/__init__.py"
+        files: ^python/nx-cugraph/
+        types: [python]
+        language: python
+        pass_filenames: false
+        additional_dependencies: ["networkx>=3.2"]
+  - repo: local
+    hooks:
+      - id: nx-cugraph-readme-update
+        name: nx-cugraph README updater
+        entry: bash -c "PYTHONPATH=./python/nx-cugraph python ./python/nx-cugraph/scripts/update_readme.py ./python/nx-cugraph/README.md"
+        files: ^python/nx-cugraph/
+        types_or: [python, markdown]
+        language: python
+        pass_filenames: false
+        additional_dependencies: ["networkx>=3.2"]
diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 1bf310c8c..77066356a 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -7,11 +7,10 @@ to run supported algorithms with GPU acceleration.
 ## System Requirements
 
 nx-cugraph requires the following:
-
- * NVIDIA GPU, Pascal architecture or later
+ * 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, or 12.0
- * Python versions 3.9, 3.10, or 3.11
- * NetworkX >= version 3.2
+ * Python version 3.9, 3.10, or 3.11
+ * NetworkX >= version 3.0 (version 3.2 or higher recommended)
 
 More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req).
 
@@ -20,16 +19,25 @@ More details about system requirements can be found in the [RAPIDS System Requir
 nx-cugraph can be installed using either conda or pip.
 
 ### conda
+#### latest nightly version
 ```
 conda install -c rapidsai-nightly -c conda-forge -c nvidia nx-cugraph
 ```
+#### latest stable version
+```
+conda install -c rapidsai -c conda-forge -c nvidia nx-cugraph
+```
 ### pip
+#### latest nightly version
+```
+python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.anaconda.org/rapidsai-wheels-nightly/simple
+```
+#### latest stable version
 ```
 python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.nvidia.com
 ```
 Notes:
-
- * Nightly wheel builds will not be available until the 23.12 release, therefore the index URL for the stable release version is being used in the pip install command above.
+ * The pip example above installs for CUDA 11. To install for CUDA 12, replace `-cu11` with `-cu12`
  * Additional information relevant to installing any RAPIDS package can be found [here](https://rapids.ai/#quick-start).
 
 ## Enabling nx-cugraph
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index 8c6a65046..f6e5e3aa5 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -261,6 +261,22 @@ def get_info():
 if __name__ == "__main__":
     from pathlib import Path
 
+    # This script imports nx_cugraph modules, which imports nx_cugraph runtime
+    # dependencies. The modules do not need the runtime deps, so stub them out
+    # to avoid installing them.
+    class Stub:
+        def __getattr__(self, *args, **kwargs):
+            return Stub()
+
+        def __call__(self, *args, **kwargs):
+            return Stub()
+
+    import sys
+
+    sys.modules["cupy"] = Stub()
+    sys.modules["numpy"] = Stub()
+    sys.modules["pylibcugraph"] = Stub()
+
     from _nx_cugraph.core import main
 
     filepath = Path(__file__)
diff --git a/python/nx-cugraph/_nx_cugraph/core.py b/python/nx-cugraph/_nx_cugraph/core.py
index c4de197f3..82ce7bc43 100644
--- a/python/nx-cugraph/_nx_cugraph/core.py
+++ b/python/nx-cugraph/_nx_cugraph/core.py
@@ -45,18 +45,27 @@ def update_text(text, lines_to_add, target, indent=" " * 8):
     return f"{text[:start]}{begin}{to_add}\n{indent}{text[stop:]}"
 
 
+def dq_repr(s):
+    """Return repr(s) quoted with the double quote preference used by black."""
+    rs = repr(s)
+    if rs.startswith("'") and '"' not in rs:
+        rs = rs.strip("'")
+        return f'"{rs}"'
+    return rs
+
+
 def dict_to_lines(d, *, indent=""):
     for key in sorted(d):
         val = d[key]
         if "\n" not in val:
-            yield f"{indent}{key!r}: {val!r},"
+            yield f"{indent}{dq_repr(key)}: {dq_repr(val)},"
         else:
-            yield f"{indent}{key!r}: ("
+            yield f"{indent}{dq_repr(key)}: ("
             *lines, last_line = val.split("\n")
             for line in lines:
                 line += "\n"
-                yield f"    {indent}{line!r}"
-            yield f"    {indent}{last_line!r}"
+                yield f"    {indent}{dq_repr(line)}"
+            yield f"    {indent}{dq_repr(last_line)}"
             yield f"{indent}),"
 
 
@@ -83,7 +92,7 @@ def main(filepath):
     to_add = []
     for name in sorted(additional_parameters):
         params = additional_parameters[name]
-        to_add.append(f"{name!r}: {{")
+        to_add.append(f"{dq_repr(name)}: {{")
         to_add.extend(dict_to_lines(params, indent=" " * 4))
         to_add.append("},")
     text = update_text(text, to_add, "additional_parameters")
diff --git a/python/nx-cugraph/scripts/update_readme.py b/python/nx-cugraph/scripts/update_readme.py
index 1ab5a76c4..fcaa1769d 100755
--- a/python/nx-cugraph/scripts/update_readme.py
+++ b/python/nx-cugraph/scripts/update_readme.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 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.
@@ -13,12 +12,13 @@
 # limitations under the License.
 import argparse
 import re
+import urllib.request
 import zlib
 from collections import namedtuple
 from pathlib import Path
 from warnings import warn
 
-from nx_cugraph.scripts.print_tree import create_tree, tree_lines
+_objs_file_url = "https://networkx.org/documentation/stable/objects.inv"
 
 # See: https://sphobjinv.readthedocs.io/en/stable/syntax.html
 DocObject = namedtuple(
@@ -75,6 +75,8 @@ def replace_body(text, match, new_body):
 
 def main(readme_file, objects_filename):
     """``readme_file`` must be readable and writable, so use mode ``"a+"``"""
+    from nx_cugraph.scripts.print_tree import create_tree, tree_lines
+
     # Use the `objects.inv` file to determine URLs. For details about this file, see:
     # https://sphobjinv.readthedocs.io/en/stable/syntax.html
     # We might be better off using a library like that, but roll our own for now.
@@ -190,14 +192,59 @@ def get_payload_internal(keys):
     return text
 
 
+def find_or_download_objs_file(objs_file_dir):
+    """
+    Returns the path to /objects.inv, downloading it from
+    _objs_file_url if it does not already exist.
+    """
+    objs_file_path = objs_file_dir / "objects.inv"
+    if not objs_file_path.exists():
+        request = urllib.request.Request(_objs_file_url)
+        with (
+            urllib.request.urlopen(request) as response,
+            Path(objs_file_path).open("wb") as out,
+        ):
+            out.write(response.read())
+    return objs_file_path
+
+
 if __name__ == "__main__":
+    # This script imports a nx_cugraph script module, which imports nx_cugraph
+    # runtime dependencies. The script module does not need the runtime deps,
+    # so stub them out to avoid installing them.
+    class Stub:
+        def __getattr__(self, *args, **kwargs):
+            return Stub()
+
+        def __call__(self, *args, **kwargs):
+            return Stub()
+
+    import sys
+
+    sys.modules["cupy"] = Stub()
+    sys.modules["numpy"] = Stub()
+    sys.modules["pylibcugraph"] = Stub()
+
     parser = argparse.ArgumentParser(
         "Update README.md to show NetworkX functions implemented by nx-cugraph"
     )
     parser.add_argument("readme_filename", help="Path to the README.md file")
     parser.add_argument(
-        "networkx_objects", help="Path to the objects.inv file from networkx docs"
+        "networkx_objects",
+        nargs="?",
+        default=None,
+        help="Optional path to the objects.inv file from the NetworkX docs. Default is "
+        "the objects.inv file in the directory containing the specified README.md. If "
+        "an objects.inv file does not exist in that location, one will be downloaded "
+        "and saved to that location.",
     )
     args = parser.parse_args()
-    with Path(args.readme_filename).open("a+") as readme_file:
-        main(readme_file, args.networkx_objects)
+
+    readme_filename = args.readme_filename
+    readme_path = Path(readme_filename)
+    objects_filename = args.networkx_objects
+    if objects_filename is None:
+        objects_filename = find_or_download_objs_file(readme_path.parent)
+
+    with readme_path.open("a+") as readme_file:
+        main(readme_file, objects_filename)

From 64af488f957f09d92c6bfaac7f9b6cc8a0368b79 Mon Sep 17 00:00:00 2001
From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com>
Date: Fri, 15 Mar 2024 03:26:26 -0500
Subject: [PATCH 338/384] Removes (unintentional?) runtime dependency on
 `packaging` from nx-cugraph (#4240)

A [recent PR](https://github.com/rapidsai/cugraph/pull/4217) was merged that added `packaging` as a runtime dependency to nx-cugraph.  This PR removes that dependency and manually extracts the `major` and `minor` version numbers instead.

Authors:
  - Rick Ratzel (https://github.com/rlratzel)
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Brad Rees (https://github.com/BradReesWork)
  - Erik Welch (https://github.com/eriknw)

URL: https://github.com/rapidsai/cugraph/pull/4240
---
 python/nx-cugraph/_nx_cugraph/__init__.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index f6e5e3aa5..098de46af 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -23,18 +23,19 @@
 $ python _nx_cugraph/__init__.py
 """
 
-from packaging.version import Version
-
 from _nx_cugraph._version import __version__
 
-_nx_cugraph_version = Version(__version__)
+# This is normally handled by packaging.version.Version, but instead of adding
+# an additional runtime dependency on "packaging", assume __version__ will
+# always be in .. format.
+(_version_major, _version_minor) = __version__.split(".")[:2]
 
 # Entries between BEGIN and END are automatically generated
 _info = {
     "backend_name": "cugraph",
     "project": "nx-cugraph",
     "package": "nx_cugraph",
-    "url": f"https://github.com/rapidsai/cugraph/tree/branch-{_nx_cugraph_version.major:02}.{_nx_cugraph_version.minor:02}/python/nx-cugraph",
+    "url": f"https://github.com/rapidsai/cugraph/tree/branch-{_version_major:0>2}.{_version_minor:0>2}/python/nx-cugraph",
     "short_summary": "GPU-accelerated backend.",
     # "description": "TODO",
     "functions": {

From 1ee83fbabbb6d2bc2fe50b4ff85e8bbc88de2629 Mon Sep 17 00:00:00 2001
From: Ray Douglass 
Date: Fri, 15 Mar 2024 11:49:52 -0400
Subject: [PATCH 339/384] DOC v24.06 Updates [skip ci]

---
 VERSION                                      | 2 +-
 docs/cugraph/source/nx_cugraph/nx_cugraph.md | 2 +-
 python/nx-cugraph/pyproject.toml             | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/VERSION b/VERSION
index 4a2fe8aa5..0bff6981a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-24.04.00
+24.06.00
diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
index 8d497e3a1..92fbf90a4 100644
--- a/docs/cugraph/source/nx_cugraph/nx_cugraph.md
+++ b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
@@ -4,7 +4,7 @@
 Whereas previous versions of cuGraph have included mechanisms to make it
 trivial to plug in cuGraph algorithm calls. Beginning with version 24.02, nx-cuGraph
 is now a [networkX backend]().
-The user now need only [install nx-cugraph]()
+The user now need only [install nx-cugraph]()
 to experience GPU speedups.
 
 Lets look at some examples of algorithm speedups comparing CPU based NetworkX to dispatched versions run on GPU with nx_cugraph.
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index 2ff53c1a3..1a4a98e5f 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -34,7 +34,7 @@ dependencies = [
     "cupy-cuda11x>=12.0.0",
     "networkx>=3.0",
     "numpy>=1.23,<2.0a0",
-    "pylibcugraph==24.4.*",
+    "pylibcugraph==24.6.*",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 
 [project.optional-dependencies]

From 8d14daf2f9e5561d1e9f37afff4149e381b8ad7e Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Fri, 15 Mar 2024 13:37:38 -0500
Subject: [PATCH 340/384] nx-cugraph: add `is_negatively_weighted` (#4242)

Authors:
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4242
---
 python/nx-cugraph/_nx_cugraph/__init__.py     |  1 +
 .../nx-cugraph/nx_cugraph/classes/function.py | 22 +++++++++++-
 .../nx_cugraph/tests/test_classes_function.py | 35 +++++++++++++++++++
 python/nx-cugraph/pyproject.toml              |  2 ++
 python/nx-cugraph/scripts/update_readme.py    |  9 +++--
 5 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_classes_function.py

diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index 098de46af..013f12367 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -96,6 +96,7 @@
         "is_connected",
         "is_forest",
         "is_isolate",
+        "is_negatively_weighted",
         "is_tree",
         "is_weakly_connected",
         "isolates",
diff --git a/python/nx-cugraph/nx_cugraph/classes/function.py b/python/nx-cugraph/nx_cugraph/classes/function.py
index 7212a4d2d..3dac6c2fd 100644
--- a/python/nx-cugraph/nx_cugraph/classes/function.py
+++ b/python/nx-cugraph/nx_cugraph/classes/function.py
@@ -11,11 +11,31 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import cupy as cp
+import networkx as nx
 
 from nx_cugraph.convert import _to_graph
 from nx_cugraph.utils import networkx_algorithm
 
-__all__ = ["number_of_selfloops"]
+__all__ = [
+    "is_negatively_weighted",
+    "number_of_selfloops",
+]
+
+
+@networkx_algorithm(version_added="24.04")
+def is_negatively_weighted(G, edge=None, weight="weight"):
+    G = _to_graph(G, weight)
+    if edge is not None:
+        data = G.get_edge_data(*edge)
+        if data is None:
+            raise nx.NetworkXError(f"Edge {edge!r} does not exist.")
+        return weight in data and data[weight] < 0
+    if weight not in G.edge_values:
+        return False
+    edge_vals = G.edge_values[weight]
+    if weight in G.edge_masks:
+        edge_vals = edge_vals[G.edge_masks[weight]]
+    return bool((edge_vals < 0).any())
 
 
 @networkx_algorithm(version_added="23.12")
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_classes_function.py b/python/nx-cugraph/nx_cugraph/tests/test_classes_function.py
new file mode 100644
index 000000000..d6152f650
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/tests/test_classes_function.py
@@ -0,0 +1,35 @@
+# Copyright (c) 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
+#
+#     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.
+"""Test functions from nx_cugraph/classes/function.py"""
+import networkx as nx
+
+import nx_cugraph as nxcg
+
+
+def test_is_negatively_weighted():
+    Gnx = nx.MultiGraph()
+    Gnx.add_edge(0, 1, 2, weight=-3)
+    Gnx.add_edge(2, 3, foo=3)
+    Gcg = nxcg.from_networkx(Gnx, preserve_edge_attrs=True)
+    assert nx.is_negatively_weighted(Gnx)
+    assert nxcg.is_negatively_weighted(Gnx)
+    assert nxcg.is_negatively_weighted(Gcg)
+    assert not nx.is_negatively_weighted(Gnx, weight="foo")
+    assert not nxcg.is_negatively_weighted(Gcg, weight="foo")
+    assert not nx.is_negatively_weighted(Gnx, weight="bar")
+    assert not nxcg.is_negatively_weighted(Gcg, weight="bar")
+    assert nx.is_negatively_weighted(Gnx, (0, 1, 2))
+    assert nxcg.is_negatively_weighted(Gcg, (0, 1, 2))
+    assert nx.is_negatively_weighted(Gnx, (0, 1)) == nxcg.is_negatively_weighted(
+        Gcg, (0, 1)
+    )
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index 2ff53c1a3..c662e710f 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -175,6 +175,7 @@ ignore = [
     # "SIM401",  # Use dict.get ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer)
     # "TRY004",  # Prefer `TypeError` exception for invalid type (Note: good advice, but not worth the nuisance)
     "B904",  # Bare `raise` inside exception clause (like TRY200; sometimes okay)
+    "S310",  # Audit URL open for permitted schemes (Note: we don't download URLs in normal usage)
 
     # Intentionally ignored
     "A003",  # Class attribute ... is shadowing a python builtin
@@ -232,6 +233,7 @@ ignore = [
 "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"]
 "_nx_cugraph/__init__.py" = ["E501"]
 "nx_cugraph/algorithms/**/*py" = ["D205", "D401"]  # Allow flexible docstrings for algorithms
+"scripts/update_readme.py" = ["INP001"]  # Not part of a package
 
 [tool.ruff.lint.flake8-annotations]
 mypy-init-return = true
diff --git a/python/nx-cugraph/scripts/update_readme.py b/python/nx-cugraph/scripts/update_readme.py
index fcaa1769d..5ee49e63a 100755
--- a/python/nx-cugraph/scripts/update_readme.py
+++ b/python/nx-cugraph/scripts/update_readme.py
@@ -70,6 +70,9 @@ def replace_body(text, match, new_body):
         "https://networkx.org/documentation/stable/reference/"
         "algorithms/component.html#weak-connectivity"
     ),
+    "networkx.classes": (
+        "https://networkx.org/documentation/stable/reference/classes/index.html"
+    ),
 }
 
 
@@ -193,9 +196,9 @@ def get_payload_internal(keys):
 
 
 def find_or_download_objs_file(objs_file_dir):
-    """
-    Returns the path to /objects.inv, downloading it from
-    _objs_file_url if it does not already exist.
+    """Return the path to /objects.inv and download it if necessary.
+
+    Download objects.inv from _objs_file_url if it does not already exist.
     """
     objs_file_path = objs_file_dir / "objects.inv"
     if not objs_file_path.exists():

From 890c56193967f803d1d087a718c3e4a5128f7600 Mon Sep 17 00:00:00 2001
From: Kyle Edwards 
Date: Thu, 21 Mar 2024 09:12:22 -0400
Subject: [PATCH 341/384] Update pre-commit-hooks to v0.0.3 (#4264)

This fixes an issue with how the `verify-copyright` hook handles multiple merge bases.

Authors:
  - Kyle Edwards (https://github.com/KyleFromNVIDIA)

Approvers:
  - Don Acosta (https://github.com/acostadon)

URL: https://github.com/rapidsai/cugraph/pull/4264
---
 .pre-commit-config.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 542e9cacb..a314b8c71 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -52,7 +52,7 @@ repos:
         - id: rapids-dependency-file-generator
           args: ["--clean"]
   - repo: https://github.com/rapidsai/pre-commit-hooks
-    rev: v0.0.1
+    rev: v0.0.3
     hooks:
       - id: verify-copyright
         files: |

From 7ef61c4c3a70ece0dc61f337ac0609e939af803f Mon Sep 17 00:00:00 2001
From: James Lamb 
Date: Fri, 5 Apr 2024 12:38:36 -0500
Subject: [PATCH 342/384] fix PyPI URL in docs (#4282)

`https://pypi.ngc.nvidia.com` was retired a while ago, and RAPIDS wheels are now available from `https://pypi.nvidia.com` (see https://docs.rapids.ai/install).

This proposes removing one lingering reference to `pypi.ngc.nvidia.com` left over in this project's docs.

### How I tested this

```shell
docker run \
   --rm \
   python:3.10 \
   pip install --dry-run cugraph-cu12 --extra-index-url=https://pypi.nvidia.com
```

saw the expected output

```text
Collecting cugraph-cu12
  Downloading https://pypi.nvidia.com/cugraph-cu12/cugraph_cu12-24.2.0-cp310-cp310-manylinux_2_28_aarch64.whl (1318.6 MB)
```

This is the only use of that `ngc.nvidia.com` URL in this project.

```shell
git grep -E 'ngc\.'
```

Authors:
  - James Lamb (https://github.com/jameslamb)

Approvers:
  - Don Acosta (https://github.com/acostadon)

URL: https://github.com/rapidsai/cugraph/pull/4282
---
 docs/cugraph/source/installation/getting_cugraph.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/cugraph/source/installation/getting_cugraph.md
index 4d601bf32..126325c09 100644
--- a/docs/cugraph/source/installation/getting_cugraph.md
+++ b/docs/cugraph/source/installation/getting_cugraph.md
@@ -53,7 +53,7 @@ Note: This conda installation only applies to Linux and Python versions 3.9/3.10
 cuGraph, and all of RAPIDS, is available via pip.
 
 ```
-pip install cugraph-cu12 --extra-index-url=https://pypi.ngc.nvidia.com
+pip install cugraph-cu12 --extra-index-url=https://pypi.nvidia.com
 ```
 
 Replace `-cu12` with `-cu11` for packages supporting CUDA 11.

From 8244b85e98a607e7ca211dace95d1e3d36296932 Mon Sep 17 00:00:00 2001
From: Ralph Liu <137829296+nv-rliu@users.noreply.github.com>
Date: Tue, 9 Apr 2024 14:06:03 -0400
Subject: [PATCH 343/384] Fix Table for Synthetic Data notebook (#4311)

This PR fixes the algorithms table in
`notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb` to render
properly on GH.
---
 .../synth_release_single_gpu.ipynb            | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb b/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb
index 1acef5d55..99ab9a0e0 100644
--- a/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb
+++ b/notebooks/cugraph_benchmarks/synth_release_single_gpu.ipynb
@@ -83,17 +83,17 @@
     "tags": []
    },
    "source": [
-    "|        Algorithm        |  Type         | Undirected Graph | Directed Graph |   Notes\n",
-    "| ------------------------|---------------|------ | ------- |-------------\n",
-    "| Katz                    | Centrality    |   X   |         | \n",
-    "| Betweenness Centrality  | Centrality    |   X   |         | Estimated, k = 100\n",
-    "| Louvain                 | Community     |   X   |         | Uses python-louvain for comparison\n",
-    "| Triangle Counting       | Community     |   X   |         |\n",
-    "| Core Number             | Core          |   X   |         |\n",
-    "| PageRank                | Link Analysis |       |    X    |\n",
-    "| Jaccard                 | Similarity    |   X   |         |\n",
-    "| BFS                     | Traversal     |   X   |         | No depth limit\n",
-    "| SSSP                    | Traversal     |   X   |         | \n",
+    "|        Algorithm        |  Type         | Undirected Graph | Directed Graph |   Notes           |\n",
+    "| ------------------------|---------------|------ | ------- |-------------------------------------|\n",
+    "| Katz                    | Centrality    |   X   |         |                                     |\n",
+    "| Betweenness Centrality  | Centrality    |   X   |         | Estimated, k = 100                  |\n",
+    "| Louvain                 | Community     |   X   |         | Uses python-louvain for comparison  |\n",
+    "| Triangle Counting       | Community     |   X   |         |                                     |\n",
+    "| Core Number             | Core          |   X   |         |                                     |\n",
+    "| PageRank                | Link Analysis |       |    X    |                                     |\n",
+    "| Jaccard                 | Similarity    |   X   |         |                                     |\n",
+    "| BFS                     | Traversal     |   X   |         | No depth limit                      |\n",
+    "| SSSP                    | Traversal     |   X   |         |                                     |\n",
     "\n",
     "\n",
     "### Test Data\n",
@@ -810,7 +810,7 @@
    "metadata": {},
    "source": [
     "___\n",
-    "Copyright (c) 2020-2023, NVIDIA CORPORATION.\n",
+    "Copyright (c) 2020-2024, NVIDIA CORPORATION.\n",
     "\n",
     "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\n",
     "\n",

From 538fcf352d5fe39dd31d91a04eca5e68eecd6901 Mon Sep 17 00:00:00 2001
From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com>
Date: Tue, 9 Apr 2024 13:10:05 -0500
Subject: [PATCH 344/384] Updates the nx-cugraph README.md with the latest
 upstream URLs (#4321)

This PR updates the nx-cugraph README.md with the latest upstream URLs
by running the `update_readme.py` script on a current `objects.inv` file
downloaded from NetworkX. The latest `objects.inv` file has updated
URLs, which results in links in the README being updated too.

This should resolve style check errors recently seen in [other
PRs](https://github.com/rapidsai/cugraph/pull/4320) due to the upstream
change in `objects.inv` in NetworkX. Since CI runs pre-commit on all
files, this caused the nx-cugraph checks to run on PRs that didn't
change nx-cugraph files.
---
 .pre-commit-config.yaml                   |  4 ++--
 python/nx-cugraph/README.md               | 15 +++++++++------
 python/nx-cugraph/_nx_cugraph/__init__.py |  1 -
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a314b8c71..f0aa51f7e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -72,7 +72,7 @@ repos:
         types: [python]
         language: python
         pass_filenames: false
-        additional_dependencies: ["networkx>=3.2"]
+        additional_dependencies: ["networkx>=3.3"]
   - repo: local
     hooks:
       - id: nx-cugraph-readme-update
@@ -82,4 +82,4 @@ repos:
         types_or: [python, markdown]
         language: python
         pass_filenames: false
-        additional_dependencies: ["networkx>=3.2"]
+        additional_dependencies: ["networkx>=3.3"]
diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 77066356a..75b5c1c5a 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -106,16 +106,16 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
  └─ generators
      └─ complete_bipartite_graph
 centrality
- ├─ betweenness
+ ├─ betweenness
  │   ├─ betweenness_centrality
  │   └─ edge_betweenness_centrality
- ├─ degree_alg
+ ├─ degree_alg
  │   ├─ degree_centrality
  │   ├─ in_degree_centrality
  │   └─ out_degree_centrality
- ├─ eigenvector
+ ├─ eigenvector
  │   └─ eigenvector_centrality
- └─ katz
+ └─ katz
      └─ katz_centrality
 cluster
  ├─ average_clustering
@@ -126,12 +126,12 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
  └─ louvain
      └─ louvain_communities
 components
- ├─ connected
+ ├─ connected
  │   ├─ connected_components
  │   ├─ is_connected
  │   ├─ node_connected_component
  │   └─ number_connected_components
- └─ weakly_connected
+ └─ weakly_connected
      ├─ is_weakly_connected
      ├─ number_weakly_connected_components
      └─ weakly_connected_components
@@ -248,6 +248,9 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
 ### Other
 
 
+classes
+ └─ function
+     └─ is_negatively_weighted
 convert_matrix
  ├─ from_pandas_edgelist
  └─ from_scipy_sparse_array
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index 013f12367..7a073ffb2 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -207,7 +207,6 @@
         },
         "louvain_communities": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
-            "max_level : int, optional": "Upper limit of the number of macro-iterations (max: 500).",
         },
         "pagerank": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",

From 3e47b1cb163c773aaaedc52f28a873af5044bf30 Mon Sep 17 00:00:00 2001
From: Don Acosta <97529984+acostadon@users.noreply.github.com>
Date: Fri, 12 Apr 2024 17:25:04 -0400
Subject: [PATCH 345/384] Notebook fixes to formulas and outputs (#4272)

Authors:
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Brad Rees (https://github.com/BradReesWork)

URL: https://github.com/rapidsai/cugraph/pull/4272
---
 .../cugraph/source/installation/source_build.md | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md
index 1a129d452..49af13757 100644
--- a/docs/cugraph/source/installation/source_build.md
+++ b/docs/cugraph/source/installation/source_build.md
@@ -13,8 +13,8 @@ __Compilers:__
 
 __CUDA:__
 * CUDA 11.2+
-* NVIDIA driver 450.80.02+
-* Pascal architecture or better
+* NVIDIA driver 470.42.01 or newer
+* 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).
@@ -42,6 +42,10 @@ files](https://github.com/rapidsai/cugraph/blob/main/conda/environments).
 # 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-12.2_arch-x86_64.yaml
+
+
 # activate the environment
 conda activate cugraph_dev
 
@@ -55,6 +59,13 @@ The environment can be updated as cugraph adds/removes/updates its dependencies.
 # 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-122_arch-x86_64.yaml
+conda activate cugraph_dev
+
+
+
 ```
 
 ### Build and Install
@@ -167,7 +178,7 @@ Run either the C++ or the Python tests with datasets
    make test
    ```
 
-Note: This conda installation only applies to Linux and Python versions 3.8/3.10.
+Note: This conda installation only applies to Linux and Python versions 3.8/3.11.
 
 ### (OPTIONAL) Set environment variable on activation
 

From 5e6463617e263039688974d22618f416b4b99667 Mon Sep 17 00:00:00 2001
From: Chuck Hastings <45364586+ChuckHastings@users.noreply.github.com>
Date: Mon, 15 Apr 2024 15:46:07 -0400
Subject: [PATCH 346/384] Update pre-commit hooks to include all C and C++
 files (#4332)

#3062 added pre-commit hooks for formatting C and C++ code.  However, libcugraph_etl and the C API unit tests are currently excluded from that check.  The intention was to get back around to them and include them in the testing.  However, that slipped through the cracks.

This PR adds the pre-commit hooks for those files as well.

Authors:
  - Chuck Hastings (https://github.com/ChuckHastings)

Approvers:
  - Bradley Dice (https://github.com/bdice)
  - Seunghwa Kang (https://github.com/seunghwak)
  - Mark Harris (https://github.com/harrism)

URL: https://github.com/rapidsai/cugraph/pull/4332
---
 .pre-commit-config.yaml | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f0aa51f7e..07bf1667c 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -39,11 +39,6 @@ repos:
     rev: v16.0.6
     hooks:
       - id: clang-format
-        exclude: |
-          (?x)^(
-            cpp/libcugraph_etl|
-            cpp/tests/c_api
-          )
         types_or: [c, c++, cuda]
         args: ["-fallback-style=none", "-style=file", "-i"]
   - repo: https://github.com/rapidsai/dependency-file-generator

From 8dd0b7cf4266c913ba5fd15cc4f1da5ae3689e4a Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Mon, 29 Apr 2024 11:10:15 -0500
Subject: [PATCH 347/384] `nx-cugraph`: support `should_run` that was added in
 NetworkX 3.3 (#4348)

Also, update `complete_bipartite_graph` for nx dev

**edit**: ~This does not yet add per-algorithm `should_run`, but it makes doing so possible.~

Add `should_run` for `triangles`, `clustering`, `is_isolate`

Authors:
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4348
---
 python/nx-cugraph/lint.yaml                      | 16 ++++++++--------
 .../algorithms/bipartite/generators.py           |  6 +++++-
 .../algorithms/centrality/degree_alg.py          | 15 +++++++++++++++
 .../nx-cugraph/nx_cugraph/algorithms/cluster.py  | 14 ++++++++++++++
 .../nx-cugraph/nx_cugraph/algorithms/isolate.py  |  5 +++++
 python/nx-cugraph/nx_cugraph/classes/function.py |  5 +++++
 python/nx-cugraph/nx_cugraph/interface.py        | 12 ++++++++----
 .../nx_cugraph/tests/test_match_api.py           |  2 ++
 python/nx-cugraph/nx_cugraph/utils/decorators.py | 15 +++++++++++++++
 python/nx-cugraph/pyproject.toml                 |  1 +
 python/nx-cugraph/run_nx_tests.sh                |  2 +-
 python/nx-cugraph/scripts/update_readme.py       |  1 +
 12 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml
index 3239fa151..d220cb18d 100644
--- a/python/nx-cugraph/lint.yaml
+++ b/python/nx-cugraph/lint.yaml
@@ -11,7 +11,7 @@ default_language_version:
     python: python3
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.5.0
+    rev: v4.6.0
     hooks:
       - id: check-added-large-files
       - id: check-case-conflict
@@ -31,7 +31,7 @@ repos:
       - id: validate-pyproject
         name: Validate pyproject.toml
   - repo: https://github.com/PyCQA/autoflake
-    rev: v2.3.0
+    rev: v2.3.1
     hooks:
       - id: autoflake
         args: [--in-place]
@@ -40,17 +40,17 @@ repos:
     hooks:
       - id: isort
   - repo: https://github.com/asottile/pyupgrade
-    rev: v3.15.1
+    rev: v3.15.2
     hooks:
       - id: pyupgrade
         args: [--py39-plus]
   - repo: https://github.com/psf/black
-    rev: 24.2.0
+    rev: 24.4.2
     hooks:
       - id: black
       # - id: black-jupyter
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.3.2
+    rev: v0.4.2
     hooks:
       - id: ruff
         args: [--fix-only, --show-fixes]  # --unsafe-fixes]
@@ -62,7 +62,7 @@ repos:
         additional_dependencies: &flake8_dependencies
           # These versions need updated manually
           - flake8==7.0.0
-          - flake8-bugbear==24.2.6
+          - flake8-bugbear==24.4.21
           - flake8-simplify==0.21.0
   - repo: https://github.com/asottile/yesqa
     rev: v1.5.0
@@ -77,11 +77,11 @@ repos:
         additional_dependencies: [tomli]
         files: ^(nx_cugraph|docs)/
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.3.2
+    rev: v0.4.2
     hooks:
       - id: ruff
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.5.0
+    rev: v4.6.0
     hooks:
       - id: no-commit-to-branch
         args: [-p, "^branch-2....$"]
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py
index 5a0c970c9..60276b7d4 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/bipartite/generators.py
@@ -48,13 +48,17 @@ def complete_bipartite_graph(n1, n2, create_using=None):
         nodes.extend(range(n2) if nodes2 is None else nodes2)
         if len(set(nodes)) != len(nodes):
             raise nx.NetworkXError("Inputs n1 and n2 must contain distinct nodes")
+    if nx.__version__[:3] <= "3.3":
+        name = f"complete_bipartite_graph({orig_n1}, {orig_n2})"
+    else:
+        name = f"complete_bipartite_graph({n1}, {n2})"
     G = graph_class.from_coo(
         n1 + n2,
         src_indices,
         dst_indices,
         node_values={"bipartite": bipartite},
         id_to_key=nodes,
-        name=f"complete_bipartite_graph({orig_n1}, {orig_n2})",
+        name=name,
     )
     if inplace:
         return create_using._become(G)
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py
index a319eb3a1..1cc051c69 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/centrality/degree_alg.py
@@ -26,6 +26,11 @@ def degree_centrality(G):
     return G._nodearray_to_dict(centrality)
 
 
+@degree_centrality._should_run
+def _(G):
+    return "Fast algorithm; not worth converting."
+
+
 @not_implemented_for("undirected")
 @networkx_algorithm(version_added="23.12")
 def in_degree_centrality(G):
@@ -37,6 +42,11 @@ def in_degree_centrality(G):
     return G._nodearray_to_dict(centrality)
 
 
+@in_degree_centrality._should_run
+def _(G):
+    return "Fast algorithm; not worth converting."
+
+
 @not_implemented_for("undirected")
 @networkx_algorithm(version_added="23.12")
 def out_degree_centrality(G):
@@ -46,3 +56,8 @@ def out_degree_centrality(G):
     deg = G._out_degrees_array()
     centrality = deg * (1 / (len(G) - 1))
     return G._nodearray_to_dict(centrality)
+
+
+@out_degree_centrality._should_run
+def _(G):
+    return "Fast algorithm; not worth converting."
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/cluster.py b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py
index a458e6c04..c355a1bb7 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/cluster.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/cluster.py
@@ -56,6 +56,13 @@ def triangles(G, nodes=None):
     return G._nodearrays_to_dict(node_ids, triangles)
 
 
+@triangles._should_run
+def _(G, nodes=None):
+    if nodes is None or nodes not in G:
+        return True
+    return "Fast algorithm when computing for a single node; not worth converting."
+
+
 @not_implemented_for("directed")
 @networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="triangle_count")
 def clustering(G, nodes=None, weight=None):
@@ -86,6 +93,13 @@ def _(G, nodes=None, weight=None):
     return weight is None and not G.is_directed()
 
 
+@clustering._should_run
+def _(G, nodes=None, weight=None):
+    if nodes is None or nodes not in G:
+        return True
+    return "Fast algorithm when computing for a single node; not worth converting."
+
+
 @not_implemented_for("directed")
 @networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="triangle_count")
 def average_clustering(G, nodes=None, weight=None, count_zeros=True):
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py
index 9621fbeaa..47a349bcf 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/isolate.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/isolate.py
@@ -37,6 +37,11 @@ def is_isolate(G, n):
     )
 
 
+@is_isolate._should_run
+def _(G, n):
+    return "Fast algorithm; not worth converting."
+
+
 def _mark_isolates(G, symmetrize=None) -> cp.ndarray[bool]:
     """Return a boolean mask array indicating indices of isolated nodes."""
     mark_isolates = cp.ones(len(G), bool)
diff --git a/python/nx-cugraph/nx_cugraph/classes/function.py b/python/nx-cugraph/nx_cugraph/classes/function.py
index 3dac6c2fd..55cbf19aa 100644
--- a/python/nx-cugraph/nx_cugraph/classes/function.py
+++ b/python/nx-cugraph/nx_cugraph/classes/function.py
@@ -43,3 +43,8 @@ def number_of_selfloops(G):
     G = _to_graph(G)
     is_selfloop = G.src_indices == G.dst_indices
     return int(cp.count_nonzero(is_selfloop))
+
+
+@number_of_selfloops._should_run
+def _(G):
+    return "Fast algorithm; not worth converting."
diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py
index 0d893ac28..8569bbf40 100644
--- a/python/nx-cugraph/nx_cugraph/interface.py
+++ b/python/nx-cugraph/nx_cugraph/interface.py
@@ -330,8 +330,12 @@ def key(testpath):
 
     @classmethod
     def can_run(cls, name, args, kwargs):
-        """Can this backend run the specified algorithms with the given arguments?
-
-        This is a proposed API to add to networkx dispatching machinery and may change.
-        """
+        """Can this backend run the specified algorithms with the given arguments?"""
+        # TODO: drop hasattr when networkx 3.0 support is dropped
         return hasattr(cls, name) and getattr(cls, name).can_run(*args, **kwargs)
+
+    @classmethod
+    def should_run(cls, name, args, kwargs):
+        """Should this backend run the specified algorithms with the given arguments?"""
+        # TODO: drop hasattr when networkx 3.0 support is dropped
+        return hasattr(cls, name) and getattr(cls, name).should_run(*args, **kwargs)
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
index bd6f20e84..d784d8c13 100644
--- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
+++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
@@ -63,6 +63,8 @@ def test_match_signature_and_names():
             )
         if func.can_run is not nxcg.utils.decorators._default_can_run:
             assert func_sig == inspect.signature(func.can_run)
+        if func.should_run is not nxcg.utils.decorators._default_should_run:
+            assert func_sig == inspect.signature(func.should_run)
 
         # Matching function names?
         assert func.__name__ == dispatchable_func.__name__ == orig_func.__name__
diff --git a/python/nx-cugraph/nx_cugraph/utils/decorators.py b/python/nx-cugraph/nx_cugraph/utils/decorators.py
index 011ebfd6e..3c5de4f29 100644
--- a/python/nx-cugraph/nx_cugraph/utils/decorators.py
+++ b/python/nx-cugraph/nx_cugraph/utils/decorators.py
@@ -108,9 +108,11 @@ def __new__(
         if instance.name in _registered_algorithms:
             instance.__doc__ = _registered_algorithms[instance.name].__doc__
         instance.can_run = _default_can_run
+        instance.should_run = _default_should_run
         setattr(BackendInterface, instance.name, instance)
         # Set methods so they are in __dict__
         instance._can_run = instance._can_run
+        instance._should_run = instance._should_run
         if nodes_or_number is not None and nx.__version__[:3] <= "3.2":
             instance = nx.utils.decorators.nodes_or_number(nodes_or_number)(instance)
         return instance
@@ -124,6 +126,15 @@ def _can_run(self, func):
             )
         self.can_run = func
 
+    def _should_run(self, func):
+        """Set the `should_run` attribute to the decorated function."""
+        if not func.__name__.startswith("_"):
+            raise ValueError(
+                "The name of the function used by `_should_run` must begin with '_'; "
+                f"got: {func.__name__!r}"
+            )
+        self.should_run = func
+
     def __call__(self, /, *args, **kwargs):
         return self.__wrapped__(*args, **kwargs)
 
@@ -135,5 +146,9 @@ def _default_can_run(*args, **kwargs):
     return True
 
 
+def _default_should_run(*args, **kwargs):
+    return True
+
+
 def _restore_networkx_dispatched(name):
     return getattr(BackendInterface, name)
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index f3114ca98..a7daf0177 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -233,6 +233,7 @@ ignore = [
 "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"]
 "_nx_cugraph/__init__.py" = ["E501"]
 "nx_cugraph/algorithms/**/*py" = ["D205", "D401"]  # Allow flexible docstrings for algorithms
+"nx_cugraph/interface.py" = ["D401"]  # Flexible docstrings
 "scripts/update_readme.py" = ["INP001"]  # Not part of a package
 
 [tool.ruff.lint.flake8-annotations]
diff --git a/python/nx-cugraph/run_nx_tests.sh b/python/nx-cugraph/run_nx_tests.sh
index da7a2014c..bceec53b7 100755
--- a/python/nx-cugraph/run_nx_tests.sh
+++ b/python/nx-cugraph/run_nx_tests.sh
@@ -24,7 +24,7 @@
 # Warning: cugraph has a .coveragerc file in the /python directory,
 # so be mindful of its contents and the CWD when running.
 # FIXME: should something be added to detect/prevent the above?
-
+set -e
 NETWORKX_GRAPH_CONVERT=cugraph \
 NETWORKX_TEST_BACKEND=cugraph \
 NETWORKX_FALLBACK_TO_NX=True \
diff --git a/python/nx-cugraph/scripts/update_readme.py b/python/nx-cugraph/scripts/update_readme.py
index 5ee49e63a..0dad5d675 100755
--- a/python/nx-cugraph/scripts/update_readme.py
+++ b/python/nx-cugraph/scripts/update_readme.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 # Copyright (c) 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.

From b2bcbd5b0d38974b7ceab22cc5ea391d5a9d722d Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Thu, 2 May 2024 10:02:01 -0500
Subject: [PATCH 348/384] Update `k_truss` to work with many connected
 components (#4383)

This case is tested by the networkx tests.

Authors:
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4383
---
 python/nx-cugraph/_nx_cugraph/__init__.py       | 4 ----
 python/nx-cugraph/nx_cugraph/algorithms/core.py | 9 ---------
 2 files changed, 13 deletions(-)

diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index 7a073ffb2..edc96983b 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -166,10 +166,6 @@
         "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.",
         "from_pandas_edgelist": "cudf.DataFrame inputs also supported; value columns with str is unsuppported.",
         "generic_bfs_edges": "`neighbors` and `sort_neighbors` parameters are not yet supported.",
-        "k_truss": (
-            "Currently raises `NotImplementedError` for graphs with more than one connected\n"
-            "component when k >= 3. We expect to fix this soon."
-        ),
         "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.",
         "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.",
         "pagerank": "`dangling` parameter is not supported, but it is checked for validity.",
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/core.py b/python/nx-cugraph/nx_cugraph/algorithms/core.py
index 71f61abf4..8eb9a9946 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/core.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/core.py
@@ -57,10 +57,6 @@ def _(G):
 @not_implemented_for("multigraph")
 @networkx_algorithm(is_incomplete=True, version_added="23.12", _plc="k_truss_subgraph")
 def k_truss(G, k):
-    """
-    Currently raises `NotImplementedError` for graphs with more than one connected
-    component when k >= 3. We expect to fix this soon.
-    """
     if is_nx := isinstance(G, nx.Graph):
         G = nxcg.from_networkx(G, preserve_all_attrs=True)
     if nxcg.number_of_selfloops(G) > 0:
@@ -91,11 +87,6 @@ def k_truss(G, k):
         # Renumber step 1: edge values (no changes needed)
         edge_values = {key: val.copy() for key, val in G.edge_values.items()}
         edge_masks = {key: val.copy() for key, val in G.edge_masks.items()}
-    elif (ncc := nxcg.number_connected_components(G)) > 1:
-        raise NotImplementedError(
-            "nx_cugraph.k_truss does not yet work on graphs with more than one "
-            f"connected component (this graph has {ncc}). We expect to fix this soon."
-        )
     else:
         edge_dtype = _get_int_dtype(G.src_indices.size - 1)
         edge_indices = cp.arange(G.src_indices.size, dtype=edge_dtype)

From ab381e3873571207bd1bccfe349cc71ea7a34822 Mon Sep 17 00:00:00 2001
From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com>
Date: Wed, 8 May 2024 06:10:38 -1000
Subject: [PATCH 349/384] Address dask_cudf.read_csv chunksize deprecation
 (#4379)

xref https://github.com/rapidsai/cugraph/pull/4271

`chunksize` was deprecated in favor of `blocksize`

Also removed an unsupported `chunksize` in a `cudf.read_csv` call

Authors:
  - Matthew Roeschke (https://github.com/mroeschke)

Approvers:
  - Don Acosta (https://github.com/acostadon)
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4379
---
 docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst
index d9ba3f3a7..f5132dd65 100644
--- a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst
+++ b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst
@@ -54,7 +54,7 @@ Example
     # multi-GPU CSV reader
     e_list = dask_cudf.read_csv(
         input_data_path,
-        chunksize=chunksize,
+        blocksize=chunksize,
         names=['src', 'dst'],
         dtype=['int32', 'int32'],
     )

From 1399e5258c0f61f9b716cb87d958b88df6f33999 Mon Sep 17 00:00:00 2001
From: Don Acosta <97529984+acostadon@users.noreply.github.com>
Date: Thu, 9 May 2024 09:05:24 -0400
Subject: [PATCH 350/384] Removed obsolete methods from rst file (#4331)

Removes doc generation for the link prediction algorithm methods that have been taken out
closes #4330

Authors:
  - Don Acosta (https://github.com/acostadon)
  - Alex Barghi (https://github.com/alexbarghi-nv)

Approvers:
  - Brad Rees (https://github.com/BradReesWork)

URL: https://github.com/rapidsai/cugraph/pull/4331
---
 docs/cugraph/source/api_docs/cugraph/link_prediction.rst | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst
index f05dce6f7..3d2f9562e 100644
--- a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst
+++ b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst
@@ -11,7 +11,6 @@ Jaccard Coefficient
 
    cugraph.jaccard
    cugraph.jaccard_coefficient
-   cugraph.jaccard_w
 
 
 Overlap Coefficient
@@ -21,7 +20,6 @@ Overlap Coefficient
 
    cugraph.overlap
    cugraph.overlap_coefficient
-   cugraph.overlap_w
 
 
 Sorensen Coefficient
@@ -31,4 +29,3 @@ Sorensen Coefficient
 
    cugraph.sorensen
    cugraph.sorensen_coefficient
-   cugraph.sorensen_w

From 7e4ff7d627f16920778c68d604e4ac64bc1479ff Mon Sep 17 00:00:00 2001
From: Ray Bell 
Date: Mon, 20 May 2024 17:09:36 -0400
Subject: [PATCH 351/384] Update operators.rst (#4339)

Closes https://github.com/rapidsai/cugraph/issues/4337

Authors:
  - Ray Bell (https://github.com/raybellwaves)
  - Tingyu Wang (https://github.com/tingyu66)

Approvers:
  - Tingyu Wang (https://github.com/tingyu66)
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4339
---
 .../api_docs/cugraph-ops/python/operators.rst | 24 +++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst
index 3e6664b2d..8b5efd7aa 100644
--- a/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst
+++ b/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst
@@ -47,10 +47,26 @@ Graph Attention (GATConv/GATv2Conv)
 .. autosummary::
    :toctree: ../../api/ops
 
-   operators.mha_gat_n2n_fwd
-   operators.mha_gat_n2n_bwd
-   operators.mha_gat_n2n_efeat_fwd
-   operators.mha_gat_n2n_efeat_bwd
+   operators.mha_gat_n2n_fwd_bf16_fp32
+   operators.mha_gat_n2n_fwd_fp16_fp32
+   operators.mha_gat_n2n_fwd_fp32_fp32
+   operators.mha_gat_n2n_bwd_bf16_bf16_bf16_fp32
+   operators.mha_gat_n2n_bwd_bf16_bf16_fp32_fp32
+   operators.mha_gat_n2n_bwd_bf16_fp32_fp32_fp32
+   operators.mha_gat_n2n_bwd_fp16_fp16_fp16_fp32
+   operators.mha_gat_n2n_bwd_fp16_fp16_fp32_fp32
+   operators.mha_gat_n2n_bwd_fp16_fp32_fp32_fp32
+   operators.mha_gat_n2n_bwd_fp32_fp32_fp32_fp32
+   operators.mha_gat_n2n_efeat_fwd_bf16_fp32
+   operators.mha_gat_n2n_efeat_fwd_fp16_fp32
+   operators.mha_gat_n2n_efeat_fwd_fp32_fp32
+   operators.mha_gat_n2n_efeat_bwd_bf16_bf16_bf16_fp32
+   operators.mha_gat_n2n_efeat_bwd_bf16_bf16_fp32_fp32
+   operators.mha_gat_n2n_efeat_bwd_bf16_fp32_fp32_fp32
+   operators.mha_gat_n2n_efeat_bwd_fp16_fp16_fp16_fp32
+   operators.mha_gat_n2n_efeat_bwd_fp16_fp16_fp32_fp32
+   operators.mha_gat_n2n_efeat_bwd_fp16_fp32_fp32_fp32
+   operators.mha_gat_n2n_efeat_bwd_fp32_fp32_fp32_fp32
 
    operators.mha_gat_v2_n2n_fwd
    operators.mha_gat_v2_n2n_bwd

From 3fdc08ffc74765161f6ea9ee98996df36ebd6a9d Mon Sep 17 00:00:00 2001
From: Ray Douglass 
Date: Mon, 20 May 2024 17:42:47 -0400
Subject: [PATCH 352/384] DOC v24.08 Updates [skip ci]

---
 VERSION                                      | 2 +-
 docs/cugraph/source/nx_cugraph/nx_cugraph.md | 2 +-
 python/nx-cugraph/pyproject.toml             | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/VERSION b/VERSION
index 0bff6981a..ec8489fda 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-24.06.00
+24.08.00
diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
index 92fbf90a4..82bebecdf 100644
--- a/docs/cugraph/source/nx_cugraph/nx_cugraph.md
+++ b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
@@ -4,7 +4,7 @@
 Whereas previous versions of cuGraph have included mechanisms to make it
 trivial to plug in cuGraph algorithm calls. Beginning with version 24.02, nx-cuGraph
 is now a [networkX backend]().
-The user now need only [install nx-cugraph]()
+The user now need only [install nx-cugraph]()
 to experience GPU speedups.
 
 Lets look at some examples of algorithm speedups comparing CPU based NetworkX to dispatched versions run on GPU with nx_cugraph.
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index a7daf0177..e65a4cb51 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -34,7 +34,7 @@ dependencies = [
     "cupy-cuda11x>=12.0.0",
     "networkx>=3.0",
     "numpy>=1.23,<2.0a0",
-    "pylibcugraph==24.6.*",
+    "pylibcugraph==24.8.*",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 
 [project.optional-dependencies]

From fc326dd9681ff225371b86e8a83c4a174573e577 Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Mon, 20 May 2024 19:24:47 -0500
Subject: [PATCH 353/384] nx-cugraph: add `ego_graph` (#4395)

Authors:
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4395
---
 python/nx-cugraph/README.md                   |   2 +
 python/nx-cugraph/_nx_cugraph/__init__.py     |   5 +
 python/nx-cugraph/lint.yaml                   |   8 +-
 python/nx-cugraph/nx_cugraph/convert.py       |   9 +-
 .../nx_cugraph/generators/__init__.py         |   3 +-
 .../nx-cugraph/nx_cugraph/generators/ego.py   | 161 ++++++++++++++++++
 .../nx_cugraph/tests/test_ego_graph.py        |  81 +++++++++
 python/nx-cugraph/pyproject.toml              |   5 +-
 8 files changed, 265 insertions(+), 9 deletions(-)
 create mode 100644 python/nx-cugraph/nx_cugraph/generators/ego.py
 create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_ego_graph.py

diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 75b5c1c5a..27825585c 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -216,6 +216,8 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
  └─ wheel_graph
 community
  └─ caveman_graph
+ego
+ └─ ego_graph
 small
  ├─ bull_graph
  ├─ chvatal_graph
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index edc96983b..f57b90eb4 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -77,6 +77,7 @@
         "diamond_graph",
         "dodecahedral_graph",
         "edge_betweenness_centrality",
+        "ego_graph",
         "eigenvector_centrality",
         "empty_graph",
         "florentine_families_graph",
@@ -163,6 +164,7 @@
         "clustering": "Directed graphs and `weight` parameter are not yet supported.",
         "core_number": "Directed graphs are not yet supported.",
         "edge_betweenness_centrality": "`weight` parameter is not yet supported, and RNG with seed may be different.",
+        "ego_graph": "Weighted ego_graph with negative cycles is not yet supported. `NotImplementedError` will be raised if there are negative `distance` edge weights.",
         "eigenvector_centrality": "`nstart` parameter is not used, but it is checked for validity.",
         "from_pandas_edgelist": "cudf.DataFrame inputs also supported; value columns with str is unsuppported.",
         "generic_bfs_edges": "`neighbors` and `sort_neighbors` parameters are not yet supported.",
@@ -191,6 +193,9 @@
         "bellman_ford_path_length": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
+        "ego_graph": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         "eigenvector_centrality": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml
index d220cb18d..c4422ffb9 100644
--- a/python/nx-cugraph/lint.yaml
+++ b/python/nx-cugraph/lint.yaml
@@ -26,7 +26,7 @@ repos:
       - id: mixed-line-ending
       - id: trailing-whitespace
   - repo: https://github.com/abravalheri/validate-pyproject
-    rev: v0.16
+    rev: v0.17
     hooks:
       - id: validate-pyproject
         name: Validate pyproject.toml
@@ -50,7 +50,7 @@ repos:
       - id: black
       # - id: black-jupyter
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.4.2
+    rev: v0.4.4
     hooks:
       - id: ruff
         args: [--fix-only, --show-fixes]  # --unsafe-fixes]
@@ -62,7 +62,7 @@ repos:
         additional_dependencies: &flake8_dependencies
           # These versions need updated manually
           - flake8==7.0.0
-          - flake8-bugbear==24.4.21
+          - flake8-bugbear==24.4.26
           - flake8-simplify==0.21.0
   - repo: https://github.com/asottile/yesqa
     rev: v1.5.0
@@ -77,7 +77,7 @@ repos:
         additional_dependencies: [tomli]
         files: ^(nx_cugraph|docs)/
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.4.2
+    rev: v0.4.4
     hooks:
       - id: ruff
   - repo: https://github.com/pre-commit/pre-commit-hooks
diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py
index f265540a1..b34245d50 100644
--- a/python/nx-cugraph/nx_cugraph/convert.py
+++ b/python/nx-cugraph/nx_cugraph/convert.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -562,7 +562,12 @@ def to_networkx(G: nxcg.Graph, *, sort_edges: bool = False) -> nx.Graph:
         dst_iter = map(id_to_key.__getitem__, dst_indices)
     if G.is_multigraph() and (G.edge_keys is not None or G.edge_indices is not None):
         if G.edge_keys is not None:
-            edge_keys = G.edge_keys
+            if not G.is_directed():
+                edge_keys = [k for k, m in zip(G.edge_keys, mask.tolist()) if m]
+            else:
+                edge_keys = G.edge_keys
+        elif not G.is_directed():
+            edge_keys = G.edge_indices[mask].tolist()
         else:
             edge_keys = G.edge_indices.tolist()
         if edge_values:
diff --git a/python/nx-cugraph/nx_cugraph/generators/__init__.py b/python/nx-cugraph/nx_cugraph/generators/__init__.py
index c1834a4de..60a9d9237 100644
--- a/python/nx-cugraph/nx_cugraph/generators/__init__.py
+++ b/python/nx-cugraph/nx_cugraph/generators/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -12,5 +12,6 @@
 # limitations under the License.
 from .classic import *
 from .community import *
+from .ego import *
 from .small import *
 from .social import *
diff --git a/python/nx-cugraph/nx_cugraph/generators/ego.py b/python/nx-cugraph/nx_cugraph/generators/ego.py
new file mode 100644
index 000000000..66c9c8b95
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/generators/ego.py
@@ -0,0 +1,161 @@
+# Copyright (c) 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
+#
+#     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.
+import math
+
+import cupy as cp
+import networkx as nx
+import numpy as np
+import pylibcugraph as plc
+
+import nx_cugraph as nxcg
+
+from ..utils import _dtype_param, _get_float_dtype, index_dtype, networkx_algorithm
+
+__all__ = ["ego_graph"]
+
+
+@networkx_algorithm(
+    extra_params=_dtype_param, version_added="24.06", _plc={"bfs", "ego_graph", "sssp"}
+)
+def ego_graph(
+    G, n, radius=1, center=True, undirected=False, distance=None, *, dtype=None
+):
+    """Weighted ego_graph with negative cycles is not yet supported. `NotImplementedError` will be raised if there are negative `distance` edge weights."""  # noqa: E501
+    if isinstance(G, nx.Graph):
+        G = nxcg.from_networkx(G, preserve_all_attrs=True)
+    if n not in G:
+        if distance is None:
+            raise nx.NodeNotFound(f"Source {n} is not in G")
+        raise nx.NodeNotFound(f"Node {n} not found in graph")
+    src_index = n if G.key_to_id is None else G.key_to_id[n]
+    symmetrize = "union" if undirected and G.is_directed() else None
+    if distance is None or distance not in G.edge_values:
+        # Simple BFS to determine nodes
+        if radius is not None and radius <= 0:
+            if center:
+                node_ids = cp.array([src_index], dtype=index_dtype)
+            else:
+                node_ids = cp.empty(0, dtype=index_dtype)
+            node_mask = None
+        else:
+            if radius is None or np.isinf(radius):
+                radius = -1
+            else:
+                radius = math.ceil(radius)
+            distances, unused_predecessors, node_ids = plc.bfs(
+                handle=plc.ResourceHandle(),
+                graph=G._get_plc_graph(symmetrize=symmetrize),
+                sources=cp.array([src_index], index_dtype),
+                direction_optimizing=False,  # True for undirected only; what's best?
+                depth_limit=radius,
+                compute_predecessors=False,
+                do_expensive_check=False,
+            )
+            node_mask = distances != np.iinfo(distances.dtype).max
+    else:
+        # SSSP to determine nodes
+        if callable(distance):
+            raise NotImplementedError("callable `distance` argument is not supported")
+        if symmetrize and G.is_multigraph():
+            # G._get_plc_graph does not implement `symmetrize=True` w/ edge array
+            raise NotImplementedError(
+                "Weighted ego_graph with undirected=True not implemented"
+            )
+        # Check for negative values since we don't support negative cycles
+        edge_vals = G.edge_values[distance]
+        if distance in G.edge_masks:
+            edge_vals = edge_vals[G.edge_masks[distance]]
+        if (edge_vals < 0).any():
+            raise NotImplementedError(
+                "Negative edge weights not yet supported by ego_graph"
+            )
+        # PERF: we could use BFS if all edges are equal
+        if radius is None:
+            radius = np.inf
+        dtype = _get_float_dtype(dtype, graph=G, weight=distance)
+        node_ids, distances, unused_predecessors = plc.sssp(
+            resource_handle=plc.ResourceHandle(),
+            graph=(G.to_undirected() if symmetrize else G)._get_plc_graph(
+                distance, 1, dtype
+            ),
+            source=src_index,
+            cutoff=np.nextafter(radius, np.inf, dtype=np.float64),
+            compute_predecessors=True,  # TODO: False is not yet supported
+            do_expensive_check=False,
+        )
+        node_mask = distances != np.finfo(distances.dtype).max
+
+    if node_mask is not None:
+        if not center:
+            node_mask &= node_ids != src_index
+        node_ids = node_ids[node_mask]
+    if node_ids.size == G._N:
+        return G.copy()
+    # TODO: create renumbering helper function(s)
+    node_ids.sort()  # TODO: is this ever necessary? Keep for safety
+    node_values = {key: val[node_ids] for key, val in G.node_values.items()}
+    node_masks = {key: val[node_ids] for key, val in G.node_masks.items()}
+
+    G._sort_edge_indices()  # TODO: is this ever necessary? Keep for safety
+    edge_mask = cp.isin(G.src_indices, node_ids) & cp.isin(G.dst_indices, node_ids)
+    src_indices = cp.searchsorted(node_ids, G.src_indices[edge_mask]).astype(
+        index_dtype
+    )
+    dst_indices = cp.searchsorted(node_ids, G.dst_indices[edge_mask]).astype(
+        index_dtype
+    )
+    edge_values = {key: val[edge_mask] for key, val in G.edge_values.items()}
+    edge_masks = {key: val[edge_mask] for key, val in G.edge_masks.items()}
+
+    # Renumber nodes
+    if (id_to_key := G.id_to_key) is not None:
+        key_to_id = {
+            id_to_key[old_index]: new_index
+            for new_index, old_index in enumerate(node_ids.tolist())
+        }
+    else:
+        key_to_id = {
+            old_index: new_index
+            for new_index, old_index in enumerate(node_ids.tolist())
+        }
+    kwargs = {
+        "N": node_ids.size,
+        "src_indices": src_indices,
+        "dst_indices": dst_indices,
+        "edge_values": edge_values,
+        "edge_masks": edge_masks,
+        "node_values": node_values,
+        "node_masks": node_masks,
+        "key_to_id": key_to_id,
+    }
+    if G.is_multigraph():
+        if G.edge_keys is not None:
+            kwargs["edge_keys"] = [
+                x for x, m in zip(G.edge_keys, edge_mask.tolist()) if m
+            ]
+        if G.edge_indices is not None:
+            kwargs["edge_indices"] = G.edge_indices[edge_mask]
+    rv = G.__class__.from_coo(**kwargs)
+    rv.graph.update(G.graph)
+    return rv
+
+
+@ego_graph._can_run
+def _(G, n, radius=1, center=True, undirected=False, distance=None, *, dtype=None):
+    if distance is not None and undirected and G.is_directed() and G.is_multigraph():
+        return "Weighted ego_graph with undirected=True not implemented"
+    if distance is not None and nx.is_negatively_weighted(G, weight=distance):
+        return "Weighted ego_graph with negative cycles not yet supported"
+    if callable(distance):
+        return "callable `distance` argument is not supported"
+    return True
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_ego_graph.py b/python/nx-cugraph/nx_cugraph/tests/test_ego_graph.py
new file mode 100644
index 000000000..5474f9d79
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/tests/test_ego_graph.py
@@ -0,0 +1,81 @@
+# Copyright (c) 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
+#
+#     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.
+import networkx as nx
+import pytest
+from packaging.version import parse
+
+import nx_cugraph as nxcg
+
+from .testing_utils import assert_graphs_equal
+
+nxver = parse(nx.__version__)
+
+
+if nxver.major == 3 and nxver.minor < 2:
+    pytest.skip("Need NetworkX >=3.2 to test ego_graph", allow_module_level=True)
+
+
+@pytest.mark.parametrize(
+    "create_using", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
+)
+@pytest.mark.parametrize("radius", [-1, 0, 1, 1.5, 2, float("inf"), None])
+@pytest.mark.parametrize("center", [True, False])
+@pytest.mark.parametrize("undirected", [False, True])
+@pytest.mark.parametrize("multiple_edges", [False, True])
+@pytest.mark.parametrize("n", [0, 3])
+def test_ego_graph_cycle_graph(
+    create_using, radius, center, undirected, multiple_edges, n
+):
+    Gnx = nx.cycle_graph(7, create_using=create_using)
+    if multiple_edges:
+        # Test multigraph with multiple edges
+        if not Gnx.is_multigraph():
+            return
+        Gnx.add_edges_from(nx.cycle_graph(7, create_using=nx.DiGraph).edges)
+        Gnx.add_edge(0, 1, 10)
+    Gcg = nxcg.from_networkx(Gnx, preserve_all_attrs=True)
+    assert_graphs_equal(Gnx, Gcg)  # Sanity check
+
+    kwargs = {"radius": radius, "center": center, "undirected": undirected}
+    Hnx = nx.ego_graph(Gnx, n, **kwargs)
+    Hcg = nx.ego_graph(Gnx, n, **kwargs, backend="cugraph")
+    assert_graphs_equal(Hnx, Hcg)
+    with pytest.raises(nx.NodeNotFound, match="not in G"):
+        nx.ego_graph(Gnx, -1, **kwargs)
+    with pytest.raises(nx.NodeNotFound, match="not in G"):
+        nx.ego_graph(Gnx, -1, **kwargs, backend="cugraph")
+    # Using sssp with default weight of 1 should give same answer as bfs
+    nx.set_edge_attributes(Gnx, 1, name="weight")
+    Gcg = nxcg.from_networkx(Gnx, preserve_all_attrs=True)
+    assert_graphs_equal(Gnx, Gcg)  # Sanity check
+
+    kwargs["distance"] = "weight"
+    H2nx = nx.ego_graph(Gnx, n, **kwargs)
+    is_nx32 = nxver.major == 3 and nxver.minor == 2
+    if undirected and Gnx.is_directed() and Gnx.is_multigraph():
+        if is_nx32:
+            # `should_run` was added in nx 3.3
+            match = "Weighted ego_graph with undirected=True not implemented"
+        else:
+            match = "not implemented by cugraph"
+        with pytest.raises(RuntimeError, match=match):
+            nx.ego_graph(Gnx, n, **kwargs, backend="cugraph")
+        with pytest.raises(NotImplementedError, match="ego_graph"):
+            nx.ego_graph(Gcg, n, **kwargs)
+    else:
+        H2cg = nx.ego_graph(Gnx, n, **kwargs, backend="cugraph")
+        assert_graphs_equal(H2nx, H2cg)
+        with pytest.raises(nx.NodeNotFound, match="not found in graph"):
+            nx.ego_graph(Gnx, -1, **kwargs)
+        with pytest.raises(nx.NodeNotFound, match="not found in graph"):
+            nx.ego_graph(Gnx, -1, **kwargs, backend="cugraph")
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index a7daf0177..477fe8bb4 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 [build-system]
 
@@ -19,7 +19,7 @@ authors = [
 license = { text = "Apache 2.0" }
 requires-python = ">=3.9"
 classifiers = [
-    "Development Status :: 3 - Alpha",
+    "Development Status :: 4 - Beta",
     "License :: OSI Approved :: Apache Software License",
     "Programming Language :: Python",
     "Programming Language :: Python :: 3",
@@ -233,6 +233,7 @@ ignore = [
 "nx_cugraph/**/tests/*py" = ["S101", "S311", "T201", "D103", "D100"]
 "_nx_cugraph/__init__.py" = ["E501"]
 "nx_cugraph/algorithms/**/*py" = ["D205", "D401"]  # Allow flexible docstrings for algorithms
+"nx_cugraph/generators/**/*py" = ["D205", "D401"]  # Allow flexible docstrings for generators
 "nx_cugraph/interface.py" = ["D401"]  # Flexible docstrings
 "scripts/update_readme.py" = ["INP001"]  # Not part of a package
 

From 611232892245258b512b9b06f2da582982ce38ba Mon Sep 17 00:00:00 2001
From: Ray Bell 
Date: Mon, 20 May 2024 21:02:17 -0400
Subject: [PATCH 354/384] test sphinx mapping to networkx (#4323)

Closes https://github.com/rapidsai/cugraph/issues/4285

I'll report back if it get to render locally. Ran out of mem building the library on my ec2 machine (g5.2xlarge: 32 Gb RAM) but I did just build cudf. I'll try again soon.

~~Also brainstorming here and I probably should upstream this to the rapids CI process. Would be nice to have /ok to test docs which just builds the docs for this PR~~ created https://github.com/nv-gha-runners/nvidia-runners/issues/25

I tried building the docs locally and got

```
WARNING: [autosummary] failed to import cugraph.jaccard_w.
Possible hints:
* AttributeError: module 'cugraph' has no attribute 'jaccard_w'
* ImportError:
* ModuleNotFoundError: No module named 'cugraph.jaccard_w'
WARNING: [autosummary] failed to import cugraph.overlap_w.
Possible hints:
* ModuleNotFoundError: No module named 'cugraph.overlap_w'
* ImportError:
* AttributeError: module 'cugraph' has no attribute 'overlap_w'
WARNING: [autosummary] failed to import cugraph.sorensen_w.
Possible hints:
* ModuleNotFoundError: No module named 'cugraph.sorensen_w'
* ImportError:
* AttributeError: module 'cugraph' has no attribute 'sorensen_w'
```

Think this comes from https://github.com/rapidsai/cugraph/blob/abe69c0419b67b567d3c8fce91ee1a062d53e385/docs/cugraph/source/api_docs/cugraph/link_prediction.rst#L14

but I may have messed up my build

Authors:
  - Ray Bell (https://github.com/raybellwaves)
  - Rick Ratzel (https://github.com/rlratzel)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4323
---
 docs/cugraph/source/conf.py | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py
index 952b962ac..66bc3137f 100644
--- a/docs/cugraph/source/conf.py
+++ b/docs/cugraph/source/conf.py
@@ -190,9 +190,17 @@
      'Miscellaneous'),
 ]
 
-# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {'https://docs.python.org/': None}
-
+# Connect docs in other projects
+intersphinx_mapping = {
+    "networkx": (
+        "https://networkx.org/documentation/stable/",
+        "https://networkx.org/documentation/stable/objects.inv",
+    ),
+    "python": (
+        "https://docs.python.org/3",
+        "https://docs.python.org/3/objects.inv",
+    ),
+}
 
 # Config numpydoc
 numpydoc_show_inherited_class_members = False

From fb2c64a642a8dafdbb4dc3b5afa233b5f697b8e4 Mon Sep 17 00:00:00 2001
From: Ray Bell 
Date: Tue, 21 May 2024 12:18:07 -0400
Subject: [PATCH 355/384] Update DGL_support.md (#4327)

Believe the path suggested previously is outdated.

Authors:
  - Ray Bell (https://github.com/raybellwaves)
  - Don Acosta (https://github.com/acostadon)
  - Rick Ratzel (https://github.com/rlratzel)

Approvers:
  - Don Acosta (https://github.com/acostadon)

URL: https://github.com/rapidsai/cugraph/pull/4327
---
 docs/cugraph/source/graph_support/DGL_support.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md
index dc4f66180..9df462155 100644
--- a/docs/cugraph/source/graph_support/DGL_support.md
+++ b/docs/cugraph/source/graph_support/DGL_support.md
@@ -17,7 +17,7 @@ mamba install cugraph-dgl -c rapidsai-nightly -c rapidsai -c pytorch -c conda-fo
 
 ### Create the conda development environment
 ```
-mamba env create -n cugraph_dgl_dev --file conda/cugraph_dgl_dev_11.6.yml
+conda env create -n cugraph_dgl_dev --file conda/environments/all_cuda-122_arch-x86_64.yaml
 ```
 
 ### Install  in editable mode

From 83b7d159fe60d411342d35aba25e1242c03e1f06 Mon Sep 17 00:00:00 2001
From: Ray Bell 
Date: Tue, 21 May 2024 21:24:18 -0400
Subject: [PATCH 356/384] DOC: doc-update-link-for-cugraphops (#4279)

Fixes a broken link

https://github.com/rapidsai/cugraph-ops/blob/branch-23.04/README.md -> https://github.com/rapidsai/cugraph/blob/branch-24.04/readme_pages/cugraph_ops.md

Authors:
  - Ray Bell (https://github.com/raybellwaves)
  - Alex Barghi (https://github.com/alexbarghi-nv)
  - Rick Ratzel (https://github.com/rlratzel)

Approvers:
  - Don Acosta (https://github.com/acostadon)

URL: https://github.com/rapidsai/cugraph/pull/4279
---
 docs/cugraph/source/graph_support/cugraphops_support.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/cugraph/source/graph_support/cugraphops_support.rst b/docs/cugraph/source/graph_support/cugraphops_support.rst
index fd79564f8..96b13f62a 100644
--- a/docs/cugraph/source/graph_support/cugraphops_support.rst
+++ b/docs/cugraph/source/graph_support/cugraphops_support.rst
@@ -7,4 +7,4 @@ cugraph-ops aims to be a low-level, framework agnostic library providing commonl
 .. toctree::
    :maxdepth: 3
 
-   https://github.com/rapidsai/cugraph-ops/blob/branch-23.04/README.md
+   https://github.com/rapidsai/cugraph/blob/branch-24.06/readme_pages/cugraph_ops.md

From 0b668b6cdcb1094f1cb9b06e8a666e8fed518c1c Mon Sep 17 00:00:00 2001
From: Don Acosta <97529984+acostadon@users.noreply.github.com>
Date: Wed, 29 May 2024 08:43:47 -0400
Subject: [PATCH 357/384] adding notebook to demo nx_cugraph (#4366)

This notebook will be used to demontstrate how to  use nx-cugraph and show the speed-up.

Authors:
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Brad Rees (https://github.com/BradReesWork)

URL: https://github.com/rapidsai/cugraph/pull/4366
---
 docs/cugraph/source/nx_cugraph/nx_cugraph.md  | 159 +++---------
 .../nx_cugraph_codeless_switching.ipynb       | 244 ++++++++++++++++++
 2 files changed, 275 insertions(+), 128 deletions(-)
 create mode 100644 notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb

diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
index 92fbf90a4..ff2fc3d1d 100644
--- a/docs/cugraph/source/nx_cugraph/nx_cugraph.md
+++ b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
@@ -24,142 +24,45 @@ Each chart has three measurements.
 ![Single Source Shortest Path](../images/sssp.png)
 ![Weakly Connected Components](../images/wcc.png)
 
+### Command line example
+Open bc_demo.ipy and paste the code below.
 
-The following algorithms are supported and automatically dispatched to nx-cuGraph for acceleration.
+```
+import pandas as pd
+import networkx as nx
+
+url = "https://data.rapids.ai/cugraph/datasets/cit-Patents.csv"
+df = pd.read_csv(url, sep=" ", names=["src", "dst"], dtype="int32")
+G = nx.from_pandas_edgelist(df, source="src", target="dst")
 
-#### Algorithms
+%time result = nx.betweenness_centrality(G, k=10)
+```
+Run the command:
 ```
-bipartite
- ├─ basic
- │   └─ is_bipartite
- └─ generators
-     └─ complete_bipartite_graph
-centrality
- ├─ betweenness
- │   ├─ betweenness_centrality
- │   └─ edge_betweenness_centrality
- ├─ degree_alg
- │   ├─ degree_centrality
- │   ├─ in_degree_centrality
- │   └─ out_degree_centrality
- ├─ eigenvector
- │   └─ eigenvector_centrality
- └─ katz
-     └─ katz_centrality
-cluster
- ├─ average_clustering
- ├─ clustering
- ├─ transitivity
- └─ triangles
-community
- └─ louvain
-     └─ louvain_communities
-components
- ├─ connected
- │   ├─ connected_components
- │   ├─ is_connected
- │   ├─ node_connected_component
- │   └─ number_connected_components
- └─ weakly_connected
-     ├─ is_weakly_connected
-     ├─ number_weakly_connected_components
-     └─ weakly_connected_components
-core
- ├─ core_number
- └─ k_truss
-dag
- ├─ ancestors
- └─ descendants
-isolate
- ├─ is_isolate
- ├─ isolates
- └─ number_of_isolates
-link_analysis
- ├─ hits_alg
- │   └─ hits
- └─ pagerank_alg
-     └─ pagerank
-operators
- └─ unary
-     ├─ complement
-     └─ reverse
-reciprocity
- ├─ overall_reciprocity
- └─ reciprocity
-shortest_paths
- └─ unweighted
-     ├─ single_source_shortest_path_length
-     └─ single_target_shortest_path_length
-traversal
- └─ breadth_first_search
-     ├─ bfs_edges
-     ├─ bfs_layers
-     ├─ bfs_predecessors
-     ├─ bfs_successors
-     ├─ bfs_tree
-     ├─ descendants_at_distance
-     └─ generic_bfs_edges
-tree
- └─ recognition
-     ├─ is_arborescence
-     ├─ is_branching
-     ├─ is_forest
-     └─ is_tree
+user@machine:/# ipython bc_demo.ipy
 ```
 
-#### Generators
+You will observe a run time of approximately 7 minutes...more or less depending on your cpu.
+
+Run the command again, this time specifiying cugraph as the NetworkX backend of choice.
+```
+user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy
 ```
-classic
- ├─ barbell_graph
- ├─ circular_ladder_graph
- ├─ complete_graph
- ├─ complete_multipartite_graph
- ├─ cycle_graph
- ├─ empty_graph
- ├─ ladder_graph
- ├─ lollipop_graph
- ├─ null_graph
- ├─ path_graph
- ├─ star_graph
- ├─ tadpole_graph
- ├─ trivial_graph
- ├─ turan_graph
- └─ wheel_graph
-community
- └─ caveman_graph
-small
- ├─ bull_graph
- ├─ chvatal_graph
- ├─ cubical_graph
- ├─ desargues_graph
- ├─ diamond_graph
- ├─ dodecahedral_graph
- ├─ frucht_graph
- ├─ heawood_graph
- ├─ house_graph
- ├─ house_x_graph
- ├─ icosahedral_graph
- ├─ krackhardt_kite_graph
- ├─ moebius_kantor_graph
- ├─ octahedral_graph
- ├─ pappus_graph
- ├─ petersen_graph
- ├─ sedgewick_maze_graph
- ├─ tetrahedral_graph
- ├─ truncated_cube_graph
- ├─ truncated_tetrahedron_graph
- └─ tutte_graph
-social
- ├─ davis_southern_women_graph
- ├─ florentine_families_graph
- ├─ karate_club_graph
- └─ les_miserables_graph
+This run will be much faster, typically around 20 seconds depending on your GPU.
+```
+user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy
+```
+There is also an option to add caching. This will dramatically help performance when running multiple algorithms on the same graph.
+```
+NETWORKX_BACKEND_PRIORITY=cugraph CACHE_CONVERTED_GRAPH=True ipython bc_demo.ipy
 ```
 
-#### Other
+When running Python interactively, cugraph backend can be specified as an argument in the algorithm call.
 
+For example:
 ```
-convert_matrix
- ├─ from_pandas_edgelist
- └─ from_scipy_sparse_array
+nx.betweenness_centrality(cit_patents_graph, k=k, backend="cugraph")
 ```
+
+
+The latest list of algorithms that can be dispatched to nx-cuGraph for acceleration is found [here](https://github.com/rapidsai/cugraph/blob/main/python/nx-cugraph/README.md#algorithms).
diff --git a/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb b/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb
new file mode 100644
index 000000000..e05544448
--- /dev/null
+++ b/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb
@@ -0,0 +1,244 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Benchmarking Performance of NetworkX with Rapids GPU-based nx_cugraph backend vs on cpu\n",
+    "# Skip notebook test\n",
+    "This notebook demonstrates compares the performance of nx_cugraph as a dispatcher for NetworkX algorithms. \n",
+    "\n",
+    "We do this by executing Betweenness Centrality, Breadth First Search and Louvain Community Detection, collecting run times with and without nx_cugraph backend and graph caching enabled. nx_cugraph is a registered NetworkX backend. Using it is a zero code change solution.\n",
+    "\n",
+    "In the notebook switching to the nx-cugraph backend is done via variables set using the [NetworkX config package](https://networkx.org/documentation/stable/reference/backends.html#networkx.utils.configs.NetworkXConfig) **which requires networkX 3.3 or later !!**\n",
+    "\n",
+    "\n",
+    "They can be set at the command line as well.\n",
+    "\n",
+    "### See this example from GTC Spring 2024\n",
+    "\n",
+    "\n",
+    "\n",
+    "Here is a sample minimal script to demonstrate No-code-change GPU acceleration using nx-cugraph.\n",
+    "\n",
+    "----\n",
+    "bc_demo.ipy:\n",
+    "\n",
+    "```\n",
+    "import pandas as pd\n",
+    "import networkx as nx\n",
+    "\n",
+    "url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
+    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
+    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")\n",
+    "\n",
+    "%time result = nx.betweenness_centrality(G, k=10)\n",
+    "```\n",
+    "----\n",
+    "Running it with the nx-cugraph backend looks like this:\n",
+    "```\n",
+    "user@machine:/# ipython bc_demo.ipy\n",
+    "CPU times: user 7min 38s, sys: 5.6 s, total: 7min 44s\n",
+    "Wall time: 7min 44s\n",
+    "\n",
+    "user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy\n",
+    "CPU times: user 18.4 s, sys: 1.44 s, total: 19.9 s\n",
+    "Wall time: 20 s\n",
+    "```\n",
+    "----\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "First import the needed packages"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import pandas as pd\n",
+    "import networkx as nx\n",
+    "import time\n",
+    "import os"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This installs the NetworkX cuGraph dispatcher if not already present."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "try: \n",
+    "    import nx_cugraph\n",
+    "except ModuleNotFoundError:\n",
+    "    os.system('conda install -c rapidsai -c conda-forge -c nvidia nx-cugraph')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This is boiler plate NetworkX code to run:\n",
+    "* betweenness Centrality\n",
+    "* Bredth first Search\n",
+    "* Louvain community detection\n",
+    "\n",
+    "and report times. it is completely unaware of cugraph or GPU-based tools.\n",
+    "[NetworkX configurations](https://networkx.org/documentation/stable/reference/utils.html#backends) can determine how they are run."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def run_algos(G):\n",
+    "    runtime = time.time()\n",
+    "    result = nx.betweenness_centrality(G, k=10)\n",
+    "    print (\"Betweenness Centrality time: \" + str(round(time.time() - runtime))+ \" seconds\")\n",
+    "    runtime = time.time()\n",
+    "    result = nx.bfs_tree(G,source=1)\n",
+    "    print (\"Breadth First Search time:  \" + str(round(time.time() - runtime))+ \" seconds\")\n",
+    "    runtime = time.time()\n",
+    "    result = nx.community.louvain_communities(G,threshold=1e-04)\n",
+    "    print (\"Louvain time: \" + str(round(time.time() - runtime))+ \" seconds\")\n",
+    "    return"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Downloads a patent citation dataset containing 3774768 nodes and 16518948 edges and loads it into a NetworkX graph."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "filepath = \"./data/cit-Patents.csv\"\n",
+    "\n",
+    "if os.path.exists(filepath):\n",
+    "    print(\"File found\")\n",
+    "    url = filepath\n",
+    "else:\n",
+    "    url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
+    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
+    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Setting the NetworkX dispatcher with an environment variable or in code using NetworkX config package which is new to [NetworkX 3.3 config](https://networkx.org/documentation/stable/reference/backends.html#networkx.utils.configs.NetworkXConfig).\n",
+    "\n",
+    "These convenience settinge allow turning off caching and cugraph dispatching if you want to see how long cpu-only takes.\n",
+    "This example using an AMD Ryzen Threadripper PRO 3975WX 32-Cores cpu completed in slightly over 40 minutes."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "use_cugraph = True\n",
+    "cache_graph = True"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "if use_cugraph:\n",
+    "    nx.config[\"backend_priority\"]=['cugraph']\n",
+    "else:\n",
+    "    # Use this setting to turn off the cugraph dispatcher running in legacy cpu mode.\n",
+    "    nx.config[\"backend_priority\"]=[]\n",
+    "if cache_graph:\n",
+    "    nx.config[\"cache_converted_graphs\"]= True\n",
+    "else:\n",
+    "    # Use this setting to turn off graph caching which will convertthe NetworkX to a gpu-resident graph each time an algorithm is run.\n",
+    "    nx.config[\"cache_converted_graphs\"]= False\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Run the algorithms on GPU. \n",
+    "\n",
+    "**Note the messages NetworkX generates to remind us cached graph shouldn't be modified.**\n",
+    "\n",
+    "```\n",
+    "For the cache to be consistent (i.e., correct), the input graph must not have been manually mutated since the cached graph was created.\n",
+    "\n",
+    "Using cached graph for 'cugraph' backend in call to bfs_edges.\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%time\n",
+    "run_algos(G)\n",
+    "print (\"Total Algorithm run time\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "___\n",
+    "Copyright (c) 2024, NVIDIA CORPORATION.\n",
+    "\n",
+    "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\n",
+    "\n",
+    "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.\n",
+    "___"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.8"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}

From bce633af383aeff9a71d79ad835f60fdbb368ad0 Mon Sep 17 00:00:00 2001
From: Don Acosta <97529984+acostadon@users.noreply.github.com>
Date: Wed, 29 May 2024 15:16:07 -0400
Subject: [PATCH 358/384] Fixed links and added c++ docs per issue 4431 (#4435)

added content to document c++ algorithms and fixed links that were pointing to the previously removed content
resolves #4431
Resolves #4116

Authors:
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)
  - Brad Rees (https://github.com/BradReesWork)
  - Chuck Hastings (https://github.com/ChuckHastings)

URL: https://github.com/rapidsai/cugraph/pull/4435
---
 .../source/graph_support/algorithms.md        | 10 +--
 .../cpp_algorithms/centrality_cpp.md          | 81 +++++++++++++++++++
 .../algorithms/cpp_algorithms/linear_cpp.md   | 37 +++++++++
 .../cpp_algorithms/traversal_cpp.md           | 56 +++++++++++++
 4 files changed, 179 insertions(+), 5 deletions(-)
 create mode 100644 docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md
 create mode 100644 docs/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md
 create mode 100644 docs/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md

diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/cugraph/source/graph_support/algorithms.md
index 8a5158f2f..2aac61325 100644
--- a/docs/cugraph/source/graph_support/algorithms.md
+++ b/docs/cugraph/source/graph_support/algorithms.md
@@ -50,10 +50,10 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M
 | Layout            |                                    |                     |                                                                 |
 |                   | [Force Atlas 2](https://github.com/rapidsai/cugraph/blob/main/notebooks/algorithms/layout/Force-Atlas2.ipynb)              | Single-GPU          |        |
 | Linear Assignment |                                    |                     |                                                                 |
-|                   | [Hungarian]()                      | Single-GPU          | [README](cpp/src/linear_assignment/README-hungarian.md)         |
+|                   | [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](cpp/src/centrality/README.md#Pagerank)                |
-|                   | [Personal Pagerank]()                  | __Multi-GPU__ | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank)   |
+|                   | [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                         |
@@ -68,8 +68,8 @@ Note: Multi-GPU, or MG, includes support for Multi-Node Multi-GPU (also called M
 |                   | Node2Vec                           | __Multi-GPU__       |                                             |
 |                   | Neighborhood sampling      | __Multi-GPU__ |                                                                 |
 | Traversal         |                                    |                     |                                                                 |
-|                   | Breadth First Search (BFS)         | __Multi-GPU__ | with cutoff support [C++ README](cpp/src/traversal/README.md#BFS) |
-|                   | Single Source Shortest Path (SSSP) | __Multi-GPU__ | [C++ README](cpp/src/traversal/README.md#SSSP)                     |
+|                   | 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          |                                                                 |
diff --git a/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md
new file mode 100644
index 000000000..b3f7ac17d
--- /dev/null
+++ b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md
@@ -0,0 +1,81 @@
+# 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/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md
new file mode 100644
index 000000000..8af4a5042
--- /dev/null
+++ b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md
@@ -0,0 +1,37 @@
+# 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/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md
new file mode 100644
index 000000000..6480d885a
--- /dev/null
+++ b/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md
@@ -0,0 +1,56 @@
+# 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);
+```

From 310914b4b0e907ae2aedd424e553bcd488a68de3 Mon Sep 17 00:00:00 2001
From: Don Acosta <97529984+acostadon@users.noreply.github.com>
Date: Wed, 29 May 2024 19:16:55 -0400
Subject: [PATCH 359/384] first copy of general cugraph tutorial. (#4396)

Adding a tutorial to get started with cugraph.

There are more to follow but this is identified as an important one.

closes #4385

Authors:
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Brad Rees (https://github.com/BradReesWork)

URL: https://github.com/rapidsai/cugraph/pull/4396
---
 .../cugraph/source/tutorials/basic_cugraph.md | 38 +++++++++++++++++++
 .../cugraph/source/tutorials/how_to_guides.md |  2 +-
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 docs/cugraph/source/tutorials/basic_cugraph.md

diff --git a/docs/cugraph/source/tutorials/basic_cugraph.md b/docs/cugraph/source/tutorials/basic_cugraph.md
new file mode 100644
index 000000000..783254724
--- /dev/null
+++ b/docs/cugraph/source/tutorials/basic_cugraph.md
@@ -0,0 +1,38 @@
+# 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 or 12.2
+ * Python version 3.9, 3.10, or 3.11
+ * 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/cugraph/source/tutorials/how_to_guides.md b/docs/cugraph/source/tutorials/how_to_guides.md
index 80be5b4ab..998957afe 100644
--- a/docs/cugraph/source/tutorials/how_to_guides.md
+++ b/docs/cugraph/source/tutorials/how_to_guides.md
@@ -1,5 +1,5 @@
 # How To Guides
-- Basic use of cuGraph, on the page
+- [Basic use of cuGraph](./basic_cugraph.md)
 - Property graph with analytic flow
 - GNN – model building
 - cuGraph Service – client/server setup and use (ucx)

From 62013d72c622f10237108db1cad244f9333995f2 Mon Sep 17 00:00:00 2001
From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com>
Date: Wed, 29 May 2024 21:30:00 -0500
Subject: [PATCH 360/384] Adds benchmark for `nx_cugraph.ego_graph` (#4451)

Adds benchmark for `nx_cugraph.ego_graph`

_Note: this code is not part of any installed package and does not affect the release.  It is being added so it can be included in the `branch-24.06` sources for reference._

Authors:
  - Rick Ratzel (https://github.com/rlratzel)

Approvers:
  - Alex Barghi (https://github.com/alexbarghi-nv)
  - Erik Welch (https://github.com/eriknw)

URL: https://github.com/rapidsai/cugraph/pull/4451
---
 .../nx-cugraph/pytest-based/bench_algos.py      | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/benchmarks/nx-cugraph/pytest-based/bench_algos.py b/benchmarks/nx-cugraph/pytest-based/bench_algos.py
index 3b085a9bf..d40b51308 100644
--- a/benchmarks/nx-cugraph/pytest-based/bench_algos.py
+++ b/benchmarks/nx-cugraph/pytest-based/bench_algos.py
@@ -848,6 +848,23 @@ def bench_weakly_connected_components(benchmark, graph_obj, backend_wrapper):
     assert type(result) is list
 
 
+def bench_ego_graph(benchmark, graph_obj, backend_wrapper):
+    G = get_graph_obj_for_benchmark(graph_obj, backend_wrapper)
+    node = get_highest_degree_node(graph_obj)
+    result = benchmark.pedantic(
+        target=backend_wrapper(nx.ego_graph),
+        args=(G,),
+        kwargs=dict(
+            n=node,
+            radius=100,
+        ),
+        rounds=rounds,
+        iterations=iterations,
+        warmup_rounds=warmup_rounds,
+    )
+    assert isinstance(result, (nx.Graph, nxcg.Graph))
+
+
 @pytest.mark.skip(reason="benchmark not implemented")
 def bench_complete_bipartite_graph(benchmark, graph_obj, backend_wrapper):
     pass

From f63e1c3414104b7c6049fbf23341432b4b621956 Mon Sep 17 00:00:00 2001
From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com>
Date: Thu, 30 May 2024 00:44:27 -0400
Subject: [PATCH 361/384] Distributed Sampling in cuGraph-PyG (#4384)

Distributed sampling in cuGraph-PyG.  Also renames the existing API to clarify that it is dask based.
Adds a dependency on `tensordict` for `cuGraph-PyG` which supports the new `TensorDictFeatureStore`.
Also no longer installs `torch-cluster` and `torch-spline-conv` in CI for testing since that results in an `ImportError` and neither of those packages are needed.

Requires PyG 2.5.  Should be merged after #4335

Merge after #4355

Closes #4248
Closes #4249
Closes #3383
Closes #3942
Closes #3836
Closes #4202
Closes #4051
Closes #4326
Closes #4252
Partially addresses #3805

Authors:
  - Alex Barghi (https://github.com/alexbarghi-nv)
  - Seunghwa Kang (https://github.com/seunghwak)
  - Tingyu Wang (https://github.com/tingyu66)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Tingyu Wang (https://github.com/tingyu66)
  - Brad Rees (https://github.com/BradReesWork)
  - Jake Awe (https://github.com/AyodeAwe)

URL: https://github.com/rapidsai/cugraph/pull/4384
---
 .../api_docs/cugraph-pyg/cugraph_pyg.rst      | 33 +++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
index a150d4db9..5475fd6c5 100644
--- a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
+++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
@@ -6,8 +6,37 @@ cugraph-pyg
 
 .. currentmodule:: cugraph_pyg
 
+Graph Storage
+-------------
 .. autosummary::
    :toctree: ../api/cugraph-pyg/
 
-..   cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore
-..   cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler
+   cugraph_pyg.data.dask_graph_store.DaskGraphStore
+   cugraph_pyg.data.graph_store.GraphStore
+
+Feature Storage
+---------------
+.. autosummary::
+   :toctree: ../api/cugraph-pyg/
+
+   cugraph_pyg.data.feature_store.TensorDictFeatureStore
+
+Data Loaders
+------------
+.. autosummary::
+   :toctree: ../api/cugraph-pyg/
+
+   cugraph_pyg.loader.dask_node_loader.DaskNeighborLoader
+   cugraph_pyg.loader.dask_node_loader.BulkSampleLoader
+   cugraph_pyg.loader.node_loader.NodeLoader
+   cugraph_pyg.loader.neighbor_loader.NeighborLoader
+
+Samplers
+--------
+.. autosummary::
+   :toctree: ../api/cugraph-pyg/
+
+   cugraph_pyg.sampler.sampler.BaseSampler
+   cugraph_pyg.sampler.sampler.SampleReader
+   cugraph_pyg.sampler.sampler.HomogeneousSampleReader
+   cugraph_pyg.sampler.sampler.SampleIterator

From c515bcbdb3d5c7cf30c2005b09853a644cf2b7b3 Mon Sep 17 00:00:00 2001
From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com>
Date: Thu, 30 May 2024 15:40:17 -0700
Subject: [PATCH 362/384] [FEA] New WholeGraph Feature Store for PyG (#4432)

Reimplements the WG feature store for PyG using the `FeatureStore` interface.
Merge after #4384

Closes rapidsai/wholegraph#47
Closes #4399

Authors:
  - Alex Barghi (https://github.com/alexbarghi-nv)
  - Seunghwa Kang (https://github.com/seunghwak)
  - Tingyu Wang (https://github.com/tingyu66)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Tingyu Wang (https://github.com/tingyu66)
  - Vibhu Jawa (https://github.com/VibhuJawa)
  - Brad Rees (https://github.com/BradReesWork)
  - Ray Douglass (https://github.com/raydouglass)

URL: https://github.com/rapidsai/cugraph/pull/4432
---
 docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
index 5475fd6c5..d2b1d124c 100644
--- a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
+++ b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst
@@ -20,6 +20,7 @@ Feature Storage
    :toctree: ../api/cugraph-pyg/
 
    cugraph_pyg.data.feature_store.TensorDictFeatureStore
+   cugraph_pyg.data.feature_store.WholeFeatureStore
 
 Data Loaders
 ------------

From 5ef723f62478df794efc6ebe26f67741017cb4b0 Mon Sep 17 00:00:00 2001
From: Ray Douglass 
Date: Wed, 5 Jun 2024 13:44:21 -0400
Subject: [PATCH 363/384] REL v24.06.00 release


From 66e2279be4cd3589a70ecbce07e97d16632b2552 Mon Sep 17 00:00:00 2001
From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com>
Date: Thu, 6 Jun 2024 13:33:04 -0400
Subject: [PATCH 364/384] [DOC] Minor Improvements to cuGraph-PyG Documentation
 (#4460)

Makes some minor updates and clarifications to the cuGraph-PyG API docs.

Authors:
  - Alex Barghi (https://github.com/alexbarghi-nv)

Approvers:
  - Don Acosta (https://github.com/acostadon)
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4460
---
 docs/cugraph/source/api_docs/index.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/cugraph/source/api_docs/index.rst
index d76902772..c4b90b579 100644
--- a/docs/cugraph/source/api_docs/index.rst
+++ b/docs/cugraph/source/api_docs/index.rst
@@ -20,7 +20,7 @@ Graph Neural Networks API Documentation
 
 .. toctree::
     :maxdepth: 3
-    :caption: Graph Nerual Networks API Documentation
+    :caption: Graph Neural Networks API Documentation
 
     cugraph-dgl/cugraph_dgl.rst
     cugraph-pyg/cugraph_pyg.rst

From 8c190460edf9f38f9b59c9fa47a74bdb4e943365 Mon Sep 17 00:00:00 2001
From: Ray Douglass 
Date: Thu, 13 Jun 2024 13:24:26 -0400
Subject: [PATCH 365/384] REL v24.06.01 release

---
 VERSION | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/VERSION b/VERSION
index 0bff6981a..e2cfb4c64 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-24.06.00
+24.06.01

From 74f282789e1cf77e947f5380bb0fdbf906eec86a Mon Sep 17 00:00:00 2001
From: Ray Bell 
Date: Mon, 1 Jul 2024 13:38:34 -0400
Subject: [PATCH 366/384] DOC: typo in nx_transition.rst (#4491)

Authors:
  - Ray Bell (https://github.com/raybellwaves)
  - Ralph Liu (https://github.com/nv-rliu)
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Don Acosta (https://github.com/acostadon)

URL: https://github.com/rapidsai/cugraph/pull/4491
---
 docs/cugraph/source/basics/nx_transition.rst | 2 --
 1 file changed, 2 deletions(-)

diff --git a/docs/cugraph/source/basics/nx_transition.rst b/docs/cugraph/source/basics/nx_transition.rst
index 07c2ad26f..9da2fe9b4 100644
--- a/docs/cugraph/source/basics/nx_transition.rst
+++ b/docs/cugraph/source/basics/nx_transition.rst
@@ -26,8 +26,6 @@ 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.
 
-improvements.
-
 
 .. image:: ../images/Nx_Cg_1.png
   :width: 600

From 84695a66bbba3db8b94f6cb31d663e9c1e3098ba Mon Sep 17 00:00:00 2001
From: Kyle Edwards 
Date: Mon, 1 Jul 2024 18:47:57 -0400
Subject: [PATCH 367/384] Use rapids-build-backend (#4393)

Contributes to https://github.com/rapidsai/build-planning/issues/31
Contributes to https://github.com/rapidsai/dependency-file-generator/issues/89

Proposes introducing `rapids-build-backend` as this project's build backend, to reduce the complexity of various CI/build scripts.

Authors:
  - Kyle Edwards (https://github.com/KyleFromNVIDIA)
  - James Lamb (https://github.com/jameslamb)

Approvers:
  - Mike Sarahan (https://github.com/msarahan)
  - Vyas Ramasubramani (https://github.com/vyasr)
  - Brad Rees (https://github.com/BradReesWork)

URL: https://github.com/rapidsai/cugraph/pull/4393
---
 .pre-commit-config.yaml                            | 13 +++++++------
 python/nx-cugraph/_nx_cugraph/_version.py          | 14 ++++++++++++--
 python/nx-cugraph/nx_cugraph/tests/test_version.py | 12 ++++++++++++
 python/nx-cugraph/pyproject.toml                   | 10 ++++++++--
 4 files changed, 39 insertions(+), 10 deletions(-)
 create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_version.py

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 07bf1667c..36c5fa841 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -41,13 +41,8 @@ repos:
       - id: clang-format
         types_or: [c, c++, cuda]
         args: ["-fallback-style=none", "-style=file", "-i"]
-  - repo: https://github.com/rapidsai/dependency-file-generator
-    rev: v1.8.0
-    hooks:
-        - id: rapids-dependency-file-generator
-          args: ["--clean"]
   - repo: https://github.com/rapidsai/pre-commit-hooks
-    rev: v0.0.3
+    rev: v0.2.0
     hooks:
       - id: verify-copyright
         files: |
@@ -58,6 +53,12 @@ repos:
               [.]flake8[.]cython$|
               meta[.]yaml$|
               setup[.]cfg$
+      - id: verify-alpha-spec
+  - repo: https://github.com/rapidsai/dependency-file-generator
+    rev: v1.13.11
+    hooks:
+        - id: rapids-dependency-file-generator
+          args: ["--clean"]
   - repo: local
     hooks:
       - id: nx-cugraph-meta-data-update
diff --git a/python/nx-cugraph/_nx_cugraph/_version.py b/python/nx-cugraph/_nx_cugraph/_version.py
index dc2d2a3a3..3cf8b23da 100644
--- a/python/nx-cugraph/_nx_cugraph/_version.py
+++ b/python/nx-cugraph/_nx_cugraph/_version.py
@@ -19,6 +19,16 @@
 # to update version info (including commit hashes) without modifying
 # source files.
 __version__ = (
-    importlib.resources.files("_nx_cugraph").joinpath("VERSION").read_text().strip()
+    importlib.resources.files(__package__).joinpath("VERSION").read_text().strip()
 )
-__git_commit__ = ""
+try:
+    __git_commit__ = (
+        importlib.resources.files(__package__)
+        .joinpath("GIT_COMMIT")
+        .read_text()
+        .strip()
+    )
+except FileNotFoundError:
+    __git_commit__ = ""
+
+__all__ = ["__git_commit__", "__version__"]
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_version.py b/python/nx-cugraph/nx_cugraph/tests/test_version.py
new file mode 100644
index 000000000..c45702b60
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/tests/test_version.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2024, NVIDIA CORPORATION.
+
+import nx_cugraph
+
+
+def test_version_constants_are_populated():
+    # __git_commit__ will only be non-empty in a built distribution
+    assert isinstance(nx_cugraph.__git_commit__, str)
+
+    # __version__ should always be non-empty
+    assert isinstance(nx_cugraph.__version__, str)
+    assert len(nx_cugraph.__version__) > 0
diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index 9df6d745b..50881d5db 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -3,10 +3,11 @@
 [build-system]
 
 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`.
-build-backend = "setuptools.build_meta"
+build-backend = "rapids_build_backend.build"
 
 [project]
 name = "nx-cugraph"
@@ -34,7 +35,7 @@ dependencies = [
     "cupy-cuda11x>=12.0.0",
     "networkx>=3.0",
     "numpy>=1.23,<2.0a0",
-    "pylibcugraph==24.8.*",
+    "pylibcugraph==24.8.*,>=0.0.0a0",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 
 [project.optional-dependencies]
@@ -81,6 +82,11 @@ include = [
     "_nx_cugraph.*",
 ]
 
+[tool.rapids-build-backend]
+build-backend = "setuptools.build_meta"
+commit-files = ["_nx_cugraph/GIT_COMMIT"]
+dependencies-file = "../../dependencies.yaml"
+
 [tool.black]
 line-length = 88
 target-version = ["py39", "py310", "py311"]

From 8df1d53b4376c44c0c07d33d8b33d5c43d48e982 Mon Sep 17 00:00:00 2001
From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com>
Date: Tue, 2 Jul 2024 15:38:24 -0500
Subject: [PATCH 368/384] Doc cleanup for nx-cugraph: fixed typos, cleaned up
 various descriptions, renamed notebook to match naming convetion. (#4478)

closes #4466

* Fixed typos
* Changed various descriptions to match existing terminology and hopefully clarify
* Renamed notebook to match file name conventions

Authors:
  - Rick Ratzel (https://github.com/rlratzel)
  - Ralph Liu (https://github.com/nv-rliu)
  - Don Acosta (https://github.com/acostadon)

Approvers:
  - Don Acosta (https://github.com/acostadon)
  - James Lamb (https://github.com/jameslamb)
  - Erik Welch (https://github.com/eriknw)

URL: https://github.com/rapidsai/cugraph/pull/4478
---
 docs/cugraph/source/nx_cugraph/nx_cugraph.md  |  27 +-
 .../nx_cugraph_benchmark.ipynb                | 365 ++++++++++++++++++
 .../nx_cugraph_codeless_switching.ipynb       | 244 ------------
 3 files changed, 378 insertions(+), 258 deletions(-)
 create mode 100644 notebooks/cugraph_benchmarks/nx_cugraph_benchmark.ipynb
 delete mode 100644 notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb

diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
index 854f755cb..75a30b0be 100644
--- a/docs/cugraph/source/nx_cugraph/nx_cugraph.md
+++ b/docs/cugraph/source/nx_cugraph/nx_cugraph.md
@@ -1,18 +1,17 @@
 ### nx_cugraph
 
 
-Whereas previous versions of cuGraph have included mechanisms to make it
-trivial to plug in cuGraph algorithm calls. Beginning with version 24.02, nx-cuGraph
-is now a [networkX backend]().
-The user now need only [install nx-cugraph]()
-to experience GPU speedups.
+nx-cugraph is a [NetworkX
+backend]() that provides GPU acceleration to many popular NetworkX algorithms.
 
-Lets look at some examples of algorithm speedups comparing CPU based NetworkX to dispatched versions run on GPU with nx_cugraph.
+By simply [installing and enabling nx-cugraph](), users can see significant speedup on workflows where performance is hindered by the default NetworkX implementation.  With nx-cugraph, users can have GPU-based, large-scale performance without changing their familiar and easy-to-use NetworkX code.
+
+Let's look at some examples of algorithm speedups comparing NetworkX with and without GPU acceleration using nx-cugraph.
 
 Each chart has three measurements.
-* NX - running the algorithm natively with networkX on CPU.
-* nx-cugraph - running with GPU accelerated networkX achieved by simply calling the cugraph backend. This pays the overhead of building the GPU resident object for each algorithm called. This achieves significant improvement but stil isn't compleltely optimum.
-* nx-cugraph (preconvert) - This is a bit more complicated since it involves building (precomputing) the GPU resident graph ahead and reusing it for each algorithm.
+* NX - default NetworkX, no GPU acceleration
+* nx-cugraph - GPU-accelerated NetworkX using nx-cugraph. This involves an internal conversion/transfer of graph data from CPU to GPU memory
+* nx-cugraph (preconvert) - GPU-accelerated NetworkX using nx-cugraph with the graph data pre-converted/transferred to GPU
 
 
 ![Ancestors](../images/ancestors.png)
@@ -44,7 +43,7 @@ user@machine:/# ipython bc_demo.ipy
 
 You will observe a run time of approximately 7 minutes...more or less depending on your cpu.
 
-Run the command again, this time specifiying cugraph as the NetworkX backend of choice.
+Run the command again, this time specifying cugraph as the NetworkX backend.
 ```
 user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy
 ```
@@ -52,12 +51,12 @@ This run will be much faster, typically around 20 seconds depending on your GPU.
 ```
 user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy
 ```
-There is also an option to add caching. This will dramatically help performance when running multiple algorithms on the same graph.
+There is also an option to cache the graph conversion to GPU. This can dramatically improve performance when running multiple algorithms on the same graph.
 ```
-NETWORKX_BACKEND_PRIORITY=cugraph CACHE_CONVERTED_GRAPH=True ipython bc_demo.ipy
+NETWORKX_BACKEND_PRIORITY=cugraph NETWORKX_CACHE_CONVERTED_GRAPHS=True ipython bc_demo.ipy
 ```
 
-When running Python interactively, cugraph backend can be specified as an argument in the algorithm call.
+When running Python interactively, the cugraph backend can be specified as an argument in the algorithm call.
 
 For example:
 ```
@@ -65,4 +64,4 @@ nx.betweenness_centrality(cit_patents_graph, k=k, backend="cugraph")
 ```
 
 
-The latest list of algorithms that can be dispatched to nx-cuGraph for acceleration is found [here](https://github.com/rapidsai/cugraph/blob/main/python/nx-cugraph/README.md#algorithms).
+The latest list of algorithms supported by nx-cugraph can be found [here](https://github.com/rapidsai/cugraph/blob/main/python/nx-cugraph/README.md#algorithms).
diff --git a/notebooks/cugraph_benchmarks/nx_cugraph_benchmark.ipynb b/notebooks/cugraph_benchmarks/nx_cugraph_benchmark.ipynb
new file mode 100644
index 000000000..bc57947f2
--- /dev/null
+++ b/notebooks/cugraph_benchmarks/nx_cugraph_benchmark.ipynb
@@ -0,0 +1,365 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Benchmarking Performance of NetworkX without and with the RAPIDS GPU-based nx-cugraph backend\n",
+    "\n",
+    "This notebook collects the run-times without and with the nx-cugraph backend enabled for three popular NetworkX algorithms: Betweenness Centrality, Breadth First Search, and Louvain Community Detection.\n",
+    "\n",
+    "Here is a sample minimal script to demonstrate no-code-change GPU acceleration using nx-cugraph.\n",
+    "\n",
+    "----\n",
+    "bc_demo.ipy:\n",
+    "\n",
+    "```\n",
+    "import pandas as pd\n",
+    "import networkx as nx\n",
+    "\n",
+    "url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
+    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
+    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")\n",
+    "\n",
+    "%time result = nx.betweenness_centrality(G, k=10)\n",
+    "```\n",
+    "----\n",
+    "Running it with the nx-cugraph backend looks like this:\n",
+    "```\n",
+    "user@machine:/# ipython bc_demo.ipy\n",
+    "CPU times: user 7min 38s, sys: 5.6 s, total: 7min 44s\n",
+    "Wall time: 7min 44s\n",
+    "\n",
+    "user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy\n",
+    "CPU times: user 18.4 s, sys: 1.44 s, total: 19.9 s\n",
+    "Wall time: 20 s\n",
+    "```\n",
+    "----\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "First import the needed packages"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "import pandas as pd\n",
+    "import networkx as nx"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This installs nx-cugraph if not already present."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "try: \n",
+    "    import nx_cugraph\n",
+    "except ModuleNotFoundError:\n",
+    "    os.system('conda install -c rapidsai -c conda-forge -c nvidia nx-cugraph')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Download a patent citation dataset containing 3774768 nodes and 16518948 edges and loads it into a NetworkX graph."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "File ./data/cit-Patents.csv not found, downloading https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\n"
+     ]
+    }
+   ],
+   "source": [
+    "filepath = \"./data/cit-Patents.csv\"\n",
+    "\n",
+    "if os.path.exists(filepath):\n",
+    "    url = filepath\n",
+    "else:\n",
+    "    url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
+    "    print(f\"File {filepath} not found, downloading {url}\")\n",
+    "\n",
+    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
+    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Define a function that can be used to run various NetworkX algorithms on the Graph created above. This can be used to compare run-times for NetworkX both without `nx-cugraph` and with `nx-cugraph` enabled.\n",
+    "\n",
+    "The following NetworkX calls will be run:\n",
+    "* [Betweenness Centrality](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.centrality.betweenness_centrality.html)\n",
+    "* [Breadth First Search](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.traversal.breadth_first_search.bfs_tree.html)\n",
+    "* [Louvain Community Detection](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.community.louvain.louvain_communities.html)\n",
+    "\n",
+    "This code does not require modification to use with nx-cugraph and can be used with NetworkX as-is even when no backends are installed."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def run_algos():\n",
+    "   print(\"\\nRunning Betweenness Centrality...\")\n",
+    "   %time nx.betweenness_centrality(G, k=10)\n",
+    "\n",
+    "   print(\"\\nRunning Breadth First Search (bfs_edges)...\")\n",
+    "   %time list(nx.bfs_edges(G, source=1))  # yields individual edges, use list() to force the full computation\n",
+    "\n",
+    "   print(\"\\nRunning Louvain...\")\n",
+    "   %time nx.community.louvain_communities(G, threshold=1e-04)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## NetworkX (no backend) Benchmark Runs\n",
+    "**_NOTE: NetworkX benchmarks without a backend for the graph used in this notebook can take very long time.  Using a Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz with 45GB of memory, the three algo runs took approximately 50 minutes._**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Running Betweenness Centrality...\n",
+      "CPU times: user 7min 47s, sys: 5.61 s, total: 7min 53s\n",
+      "Wall time: 7min 52s\n",
+      "\n",
+      "Running Breadth First Search (bfs_edges)...\n",
+      "CPU times: user 28.9 s, sys: 336 ms, total: 29.2 s\n",
+      "Wall time: 29.1 s\n",
+      "\n",
+      "Running Louvain...\n",
+      "CPU times: user 42min 46s, sys: 4.8 s, total: 42min 51s\n",
+      "Wall time: 42min 50s\n"
+     ]
+    }
+   ],
+   "source": [
+    "run_algos()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## NetworkX with `nx-cugraph` Benchmark Runs\n",
+    "Use the `nx.config` API introduced in ([NetworkX 3.3](https://networkx.org/documentation/stable/reference/backends.html#networkx.utils.configs.NetworkXConfig)) to configure NetworkX to use nx-cugraph.  Both options used below can also be set using environment variables."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Set the prioritized list of backends to automatically try. If none of the backends in the list\n",
+    "# support the algorithm, NetworkX will use the default implementation).\n",
+    "#\n",
+    "# This can also be set using the environment variable NETWORKX_BACKEND_PRIORITY which accepts a\n",
+    "# comma-separated list.\n",
+    "nx.config.backend_priority = [\"cugraph\"]  # Try the \"cugraph\" (nx-cugraph) backend first, then\n",
+    "                                          # fall back to NetworkX\n",
+    "#nx.config.backend_priority = []          # Do not use any backends\n",
+    "\n",
+    "# Enable caching of graph conversions. When set to False (the default) nx-cugraph will convert\n",
+    "# the CPU-based NetworkX graph object to a nx-cugraph GPU-based graph object each time an algorithm\n",
+    "# is run. When True, the conversion will happen once and be saved for future use *if* the graph has\n",
+    "# not been modified via a supported method such as G.add_edge(u, v, weight=val)\n",
+    "#\n",
+    "# This can also be set using the environment variable NETWORKX_CACHE_CONVERTED_GRAPHS\n",
+    "nx.config.cache_converted_graphs = True\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Note the warning message NetworkX generates to remind us a cached graph should not be manually mutated. This is shown because caching was enabled, and the initial call resulted in a cached graph conversion for use with subsequent nx-cugraph calls.**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Running Betweenness Centrality...\n",
+      "CPU times: user 17.9 s, sys: 1.5 s, total: 19.4 s\n",
+      "Wall time: 19.1 s\n",
+      "\n",
+      "Running Breadth First Search (bfs_edges)...\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/opt/conda/lib/python3.10/site-packages/networkx/utils/backends.py:1101: UserWarning: Using cached graph for 'cugraph' backend in call to bfs_edges.\n",
+      "\n",
+      "For the cache to be consistent (i.e., correct), the input graph must not have been manually mutated since the cached graph was created. Examples of manually mutating the graph data structures resulting in an inconsistent cache include:\n",
+      "\n",
+      "    >>> G[u][v][key] = val\n",
+      "\n",
+      "and\n",
+      "\n",
+      "    >>> for u, v, d in G.edges(data=True):\n",
+      "    ...     d[key] = val\n",
+      "\n",
+      "Using methods such as `G.add_edge(u, v, weight=val)` will correctly clear the cache to keep it consistent. You may also use `G.__networkx_cache__.clear()` to manually clear the cache, or set `G.__networkx_cache__` to None to disable caching for G. Enable or disable caching via `nx.config.cache_converted_graphs` config.\n",
+      "  warnings.warn(warning_message)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "CPU times: user 50.5 s, sys: 589 ms, total: 51 s\n",
+      "Wall time: 50.7 s\n",
+      "\n",
+      "Running Louvain...\n",
+      "CPU times: user 27.4 s, sys: 3.36 s, total: 30.7 s\n",
+      "Wall time: 30.6 s\n"
+     ]
+    }
+   ],
+   "source": [
+    "run_algos()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The Betweenness Centrality call above resulted in a conversion from a NetworkX Graph to a nx-cugraph Graph due to it being the first to use nx-cugraph. However, since caching was enabled, a second call will show the run-time for Betweenness Centrality without the need to convert the graph."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Running Betweenness Centrality (again)...\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/opt/conda/lib/python3.10/site-packages/networkx/utils/backends.py:1128: UserWarning: Using cached graph for 'cugraph' backend in call to betweenness_centrality.\n",
+      "\n",
+      "For the cache to be consistent (i.e., correct), the input graph must not have been manually mutated since the cached graph was created. Examples of manually mutating the graph data structures resulting in an inconsistent cache include:\n",
+      "\n",
+      "    >>> G[u][v][key] = val\n",
+      "\n",
+      "and\n",
+      "\n",
+      "    >>> for u, v, d in G.edges(data=True):\n",
+      "    ...     d[key] = val\n",
+      "\n",
+      "Using methods such as `G.add_edge(u, v, weight=val)` will correctly clear the cache to keep it consistent. You may also use `G.__networkx_cache__.clear()` to manually clear the cache, or set `G.__networkx_cache__` to None to disable caching for G. Enable or disable caching via `nx.config.cache_converted_graphs` config.\n",
+      "  warnings.warn(warning_message)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "CPU times: user 1.84 s, sys: 312 ms, total: 2.15 s\n",
+      "Wall time: 2.12 s\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"\\nRunning Betweenness Centrality (again)...\")\n",
+    "%time result = nx.betweenness_centrality(G, k=10)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "___\n",
+    "Each user is responsible for checking the content of datasets and the applicable licenses and determining if suitable for the intended use.\n",
+    "\n",
+    "Information on the U.S. Patent Citation Network dataset used in this notebook is as follows:\n",
+    "Authors: Jure Leskovec and Andrej Krevl\n",
+    "Title: SNAP Datasets, Stanford Large Network Dataset Collection\n",
+    "URL: http://snap.stanford.edu/data\n",
+    "Date: June 2014 \n",
+    "___\n",
+    "Copyright (c) 2024, NVIDIA CORPORATION.\n",
+    "\n",
+    "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\n",
+    "\n",
+    "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.\n",
+    "___"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.14"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb b/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb
deleted file mode 100644
index e05544448..000000000
--- a/notebooks/cugraph_benchmarks/nx_cugraph_codeless_switching.ipynb
+++ /dev/null
@@ -1,244 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Benchmarking Performance of NetworkX with Rapids GPU-based nx_cugraph backend vs on cpu\n",
-    "# Skip notebook test\n",
-    "This notebook demonstrates compares the performance of nx_cugraph as a dispatcher for NetworkX algorithms. \n",
-    "\n",
-    "We do this by executing Betweenness Centrality, Breadth First Search and Louvain Community Detection, collecting run times with and without nx_cugraph backend and graph caching enabled. nx_cugraph is a registered NetworkX backend. Using it is a zero code change solution.\n",
-    "\n",
-    "In the notebook switching to the nx-cugraph backend is done via variables set using the [NetworkX config package](https://networkx.org/documentation/stable/reference/backends.html#networkx.utils.configs.NetworkXConfig) **which requires networkX 3.3 or later !!**\n",
-    "\n",
-    "\n",
-    "They can be set at the command line as well.\n",
-    "\n",
-    "### See this example from GTC Spring 2024\n",
-    "\n",
-    "\n",
-    "\n",
-    "Here is a sample minimal script to demonstrate No-code-change GPU acceleration using nx-cugraph.\n",
-    "\n",
-    "----\n",
-    "bc_demo.ipy:\n",
-    "\n",
-    "```\n",
-    "import pandas as pd\n",
-    "import networkx as nx\n",
-    "\n",
-    "url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
-    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
-    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")\n",
-    "\n",
-    "%time result = nx.betweenness_centrality(G, k=10)\n",
-    "```\n",
-    "----\n",
-    "Running it with the nx-cugraph backend looks like this:\n",
-    "```\n",
-    "user@machine:/# ipython bc_demo.ipy\n",
-    "CPU times: user 7min 38s, sys: 5.6 s, total: 7min 44s\n",
-    "Wall time: 7min 44s\n",
-    "\n",
-    "user@machine:/# NETWORKX_BACKEND_PRIORITY=cugraph ipython bc_demo.ipy\n",
-    "CPU times: user 18.4 s, sys: 1.44 s, total: 19.9 s\n",
-    "Wall time: 20 s\n",
-    "```\n",
-    "----\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "First import the needed packages"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import pandas as pd\n",
-    "import networkx as nx\n",
-    "import time\n",
-    "import os"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "This installs the NetworkX cuGraph dispatcher if not already present."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "try: \n",
-    "    import nx_cugraph\n",
-    "except ModuleNotFoundError:\n",
-    "    os.system('conda install -c rapidsai -c conda-forge -c nvidia nx-cugraph')"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "This is boiler plate NetworkX code to run:\n",
-    "* betweenness Centrality\n",
-    "* Bredth first Search\n",
-    "* Louvain community detection\n",
-    "\n",
-    "and report times. it is completely unaware of cugraph or GPU-based tools.\n",
-    "[NetworkX configurations](https://networkx.org/documentation/stable/reference/utils.html#backends) can determine how they are run."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "def run_algos(G):\n",
-    "    runtime = time.time()\n",
-    "    result = nx.betweenness_centrality(G, k=10)\n",
-    "    print (\"Betweenness Centrality time: \" + str(round(time.time() - runtime))+ \" seconds\")\n",
-    "    runtime = time.time()\n",
-    "    result = nx.bfs_tree(G,source=1)\n",
-    "    print (\"Breadth First Search time:  \" + str(round(time.time() - runtime))+ \" seconds\")\n",
-    "    runtime = time.time()\n",
-    "    result = nx.community.louvain_communities(G,threshold=1e-04)\n",
-    "    print (\"Louvain time: \" + str(round(time.time() - runtime))+ \" seconds\")\n",
-    "    return"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Downloads a patent citation dataset containing 3774768 nodes and 16518948 edges and loads it into a NetworkX graph."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "filepath = \"./data/cit-Patents.csv\"\n",
-    "\n",
-    "if os.path.exists(filepath):\n",
-    "    print(\"File found\")\n",
-    "    url = filepath\n",
-    "else:\n",
-    "    url = \"https://data.rapids.ai/cugraph/datasets/cit-Patents.csv\"\n",
-    "df = pd.read_csv(url, sep=\" \", names=[\"src\", \"dst\"], dtype=\"int32\")\n",
-    "G = nx.from_pandas_edgelist(df, source=\"src\", target=\"dst\")"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Setting the NetworkX dispatcher with an environment variable or in code using NetworkX config package which is new to [NetworkX 3.3 config](https://networkx.org/documentation/stable/reference/backends.html#networkx.utils.configs.NetworkXConfig).\n",
-    "\n",
-    "These convenience settinge allow turning off caching and cugraph dispatching if you want to see how long cpu-only takes.\n",
-    "This example using an AMD Ryzen Threadripper PRO 3975WX 32-Cores cpu completed in slightly over 40 minutes."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "use_cugraph = True\n",
-    "cache_graph = True"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if use_cugraph:\n",
-    "    nx.config[\"backend_priority\"]=['cugraph']\n",
-    "else:\n",
-    "    # Use this setting to turn off the cugraph dispatcher running in legacy cpu mode.\n",
-    "    nx.config[\"backend_priority\"]=[]\n",
-    "if cache_graph:\n",
-    "    nx.config[\"cache_converted_graphs\"]= True\n",
-    "else:\n",
-    "    # Use this setting to turn off graph caching which will convertthe NetworkX to a gpu-resident graph each time an algorithm is run.\n",
-    "    nx.config[\"cache_converted_graphs\"]= False\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Run the algorithms on GPU. \n",
-    "\n",
-    "**Note the messages NetworkX generates to remind us cached graph shouldn't be modified.**\n",
-    "\n",
-    "```\n",
-    "For the cache to be consistent (i.e., correct), the input graph must not have been manually mutated since the cached graph was created.\n",
-    "\n",
-    "Using cached graph for 'cugraph' backend in call to bfs_edges.\n",
-    "```"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "%%time\n",
-    "run_algos(G)\n",
-    "print (\"Total Algorithm run time\")"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "___\n",
-    "Copyright (c) 2024, NVIDIA CORPORATION.\n",
-    "\n",
-    "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\n",
-    "\n",
-    "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.\n",
-    "___"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.11.8"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}

From 5303de0cead5df950bd4ca3bd9c2bb2b15d71158 Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 9 Jul 2024 01:25:11 +0200
Subject: [PATCH 369/384] Better handle cudf.pandas in `from_pandas_edgelist`
 (#4525)

Optimistically use cupy, but fall back to numpy if necessary.

Also, bump lint versions.

CC @rlratzel

Authors:
  - Erik Welch (https://github.com/eriknw)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4525
---
 python/nx-cugraph/lint.yaml                   | 14 ++++++-------
 python/nx-cugraph/nx_cugraph/classes/graph.py |  8 ++++----
 .../nx-cugraph/nx_cugraph/convert_matrix.py   | 20 ++++++++++++++-----
 3 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml
index c4422ffb9..317d5b8d4 100644
--- a/python/nx-cugraph/lint.yaml
+++ b/python/nx-cugraph/lint.yaml
@@ -26,7 +26,7 @@ repos:
       - id: mixed-line-ending
       - id: trailing-whitespace
   - repo: https://github.com/abravalheri/validate-pyproject
-    rev: v0.17
+    rev: v0.18
     hooks:
       - id: validate-pyproject
         name: Validate pyproject.toml
@@ -40,7 +40,7 @@ repos:
     hooks:
       - id: isort
   - repo: https://github.com/asottile/pyupgrade
-    rev: v3.15.2
+    rev: v3.16.0
     hooks:
       - id: pyupgrade
         args: [--py39-plus]
@@ -50,18 +50,18 @@ repos:
       - id: black
       # - id: black-jupyter
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.4.4
+    rev: v0.5.1
     hooks:
       - id: ruff
         args: [--fix-only, --show-fixes]  # --unsafe-fixes]
   - repo: https://github.com/PyCQA/flake8
-    rev: 7.0.0
+    rev: 7.1.0
     hooks:
       - id: flake8
         args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501', '--extend-ignore=SIM105']  # Why is this necessary?
         additional_dependencies: &flake8_dependencies
           # These versions need updated manually
-          - flake8==7.0.0
+          - flake8==7.1.0
           - flake8-bugbear==24.4.26
           - flake8-simplify==0.21.0
   - repo: https://github.com/asottile/yesqa
@@ -70,14 +70,14 @@ repos:
       - id: yesqa
         additional_dependencies: *flake8_dependencies
   - repo: https://github.com/codespell-project/codespell
-    rev: v2.2.6
+    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.4.4
+    rev: v0.5.1
     hooks:
       - id: ruff
   - repo: https://github.com/pre-commit/pre-commit-hooks
diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py
index 5132e6a54..ad7cf3191 100644
--- a/python/nx-cugraph/nx_cugraph/classes/graph.py
+++ b/python/nx-cugraph/nx_cugraph/classes/graph.py
@@ -124,13 +124,13 @@ def from_coo(
         # Easy and fast sanity checks
         if size != new_graph.dst_indices.size:
             raise ValueError
-        for attr in ["edge_values", "edge_masks"]:
-            if datadict := getattr(new_graph, attr):
+        for edge_attr in ["edge_values", "edge_masks"]:
+            if datadict := getattr(new_graph, edge_attr):
                 for key, val in datadict.items():
                     if val.shape[0] != size:
                         raise ValueError(key)
-        for attr in ["node_values", "node_masks"]:
-            if datadict := getattr(new_graph, attr):
+        for node_attr in ["node_values", "node_masks"]:
+            if datadict := getattr(new_graph, node_attr):
                 for key, val in datadict.items():
                     if val.shape[0] != N:
                         raise ValueError(key)
diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py
index 1a2ecde9b..67f638698 100644
--- a/python/nx-cugraph/nx_cugraph/convert_matrix.py
+++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py
@@ -35,11 +35,21 @@ def from_pandas_edgelist(
 ):
     """cudf.DataFrame inputs also supported; value columns with str is unsuppported."""
     graph_class, inplace = _create_using_class(create_using)
+    # Try to be optimal whether using pandas, cudf, or cudf.pandas
     src_array = df[source].to_numpy()
     dst_array = df[target].to_numpy()
+    try:
+        # Optimistically try to use cupy, but fall back to numpy if necessary
+        src_array = cp.asarray(src_array)
+        dst_array = cp.asarray(dst_array)
+        np_or_cp = cp
+    except ValueError:
+        src_array = np.asarray(src_array)
+        dst_array = np.asarray(dst_array)
+        np_or_cp = np
     # TODO: create renumbering helper function(s)
     # Renumber step 0: node keys
-    nodes = np.unique(np.concatenate([src_array, dst_array]))
+    nodes = np_or_cp.unique(np_or_cp.concatenate([src_array, dst_array]))
     N = nodes.size
     kwargs = {}
     if N > 0 and (
@@ -47,13 +57,13 @@ def from_pandas_edgelist(
         or nodes[N - 1] != N - 1
         or (
             nodes.dtype.kind not in {"i", "u"}
-            and not (nodes == np.arange(N, dtype=np.int64)).all()
+            and not (nodes == np_or_cp.arange(N, dtype=np.int64)).all()
         )
     ):
-        # We need to renumber indices--np.searchsorted to the rescue!
+        # We need to renumber indices--np_or_cp.searchsorted to the rescue!
         kwargs["id_to_key"] = nodes.tolist()
-        src_indices = cp.array(np.searchsorted(nodes, src_array), index_dtype)
-        dst_indices = cp.array(np.searchsorted(nodes, dst_array), index_dtype)
+        src_indices = cp.asarray(np_or_cp.searchsorted(nodes, src_array), index_dtype)
+        dst_indices = cp.asarray(np_or_cp.searchsorted(nodes, dst_array), index_dtype)
     else:
         src_indices = cp.array(src_array)
         dst_indices = cp.array(dst_array)

From 943f6f32975062f98bead202a5aca88460570c3d Mon Sep 17 00:00:00 2001
From: Kyle Edwards 
Date: Wed, 17 Jul 2024 12:43:36 -0400
Subject: [PATCH 370/384] Build and test with CUDA 12.5.1 (#4534)

This PR updates the latest CUDA build/test version 12.2.2 to 12.5.1.

Contributes to https://github.com/rapidsai/build-planning/issues/73

Authors:
  - Kyle Edwards (https://github.com/KyleFromNVIDIA)
  - https://github.com/jakirkham

Approvers:
  - James Lamb (https://github.com/jameslamb)
  - https://github.com/jakirkham
  - Chuck Hastings (https://github.com/ChuckHastings)

URL: https://github.com/rapidsai/cugraph/pull/4534
---
 docs/cugraph/source/graph_support/DGL_support.md | 2 +-
 docs/cugraph/source/installation/source_build.md | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/cugraph/source/graph_support/DGL_support.md
index 9df462155..ba9a28e31 100644
--- a/docs/cugraph/source/graph_support/DGL_support.md
+++ b/docs/cugraph/source/graph_support/DGL_support.md
@@ -17,7 +17,7 @@ mamba install cugraph-dgl -c rapidsai-nightly -c rapidsai -c pytorch -c conda-fo
 
 ### Create the conda development environment
 ```
-conda env create -n cugraph_dgl_dev --file conda/environments/all_cuda-122_arch-x86_64.yaml
+conda env create -n cugraph_dgl_dev --file conda/environments/all_cuda-125_arch-x86_64.yaml
 ```
 
 ### Install  in editable mode
diff --git a/docs/cugraph/source/installation/source_build.md b/docs/cugraph/source/installation/source_build.md
index 49af13757..89e63bade 100644
--- a/docs/cugraph/source/installation/source_build.md
+++ b/docs/cugraph/source/installation/source_build.md
@@ -43,7 +43,7 @@ files](https://github.com/rapidsai/cugraph/blob/main/conda/environments).
 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-12.2_arch-x86_64.yaml
+conda env create --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-125_arch-x86_64.yaml
 
 
 # activate the environment
@@ -61,7 +61,7 @@ conda env update --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_
 conda activate cugraph_dev
 
 # for CUDA 12.x
-conda env update --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-122_arch-x86_64.yaml
+conda env update --name cugraph_dev --file $CUGRAPH_HOME/conda/environments/all_cuda-125_arch-x86_64.yaml
 conda activate cugraph_dev
 
 

From b8b0a7094765e07c38da583003dbf5a5714d5a25 Mon Sep 17 00:00:00 2001
From: Ralph Liu <137829296+nv-rliu@users.noreply.github.com>
Date: Thu, 18 Jul 2024 20:14:23 -0400
Subject: [PATCH 371/384] Add Additional Check For SSSP Source Vertex & Fix
 SSSP Benchmark (#4541)

Closes https://github.com/rapidsai/cugraph/issues/4511. Part of https://github.com/rapidsai/graph_dl/issues/513

### Fixes
 - `bench_algos.py` will properly convert `source` vertex values returned from MG and SG graphs before calling the actual algorithm.

---
*Other minor changes*
- Fix white-space formatting of `pytest.ini`

Authors:
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4541
---
 benchmarks/pytest.ini | 106 +++++++++++++++++++++---------------------
 1 file changed, 53 insertions(+), 53 deletions(-)

diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini
index b3d8a8bb3..fe7fc31b6 100644
--- a/benchmarks/pytest.ini
+++ b/benchmarks/pytest.ini
@@ -1,67 +1,67 @@
 [pytest]
 pythonpath =
-             shared/python
+    shared/python
 
 testpaths =
-            cugraph/pytest_based
-	    cugraph-service/pytest_based
+    cugraph/pytest_based
+    cugraph-service/pytest_based
 
 addopts =
-          --benchmark-columns="min, max, mean, stddev, outliers"
+    --benchmark-columns="min, max, mean, stddev, outliers"
 
 markers =
-          managedmem_on: RMM managed memory enabled
-          managedmem_off: RMM managed memory disabled
-          poolallocator_on: RMM pool allocator enabled
-          poolallocator_off: RMM pool allocator disabled
-          tiny: tiny datasets
-          small: small datasets
-	  medium: medium datasets
-          large: large datasets
-          directed: directed datasets
-          undirected: undirected datasets
-	  matrix_types: inputs are matrices
-	  nx_types: inputs are NetowrkX Graph objects
-	  cugraph_types: inputs are cuGraph Graph objects
-	  sg: single-GPU
-	  mg: multi-GPU
-	  snmg: single-node multi-GPU
-	  mnmg: multi-node multi-GPU
-	  local: local cugraph
-	  remote: cugraph-service
-	  batch_size_100: batch size of 100 for sampling algos
-	  batch_size_500: batch size of 500 for sampling algos
-	  batch_size_1000: batch size of 1000 for sampling algos
-	  batch_size_2500: batch size of 2500 for sampling algos
-	  batch_size_5000: batch size of 5000 for sampling algos
-	  batch_size_10000: batch size of 10000 for sampling algos
-	  batch_size_20000: batch size of 20000 for sampling algos
-	  batch_size_30000: batch size of 30000 for sampling algos
-	  batch_size_40000: batch size of 40000 for sampling algos
-	  batch_size_50000: batch size of 50000 for sampling algos
-	  batch_size_60000: batch size of 60000 for sampling algos
-	  batch_size_70000: batch size of 70000 for sampling algos
-	  batch_size_80000: batch size of 80000 for sampling algos
-	  batch_size_90000: batch size of 90000 for sampling algos
-	  batch_size_100000: batch size of 100000 for sampling algos
-	  num_clients_2: start 2 cugraph-service clients
-	  num_clients_4: start 4 cugraph-service clients
-	  num_clients_8: start 8 cugraph-service clients
-	  num_clients_16: start 16 cugraph-service clients
-	  num_clients_32: start 32 cugraph-service clients
-	  fanout_10_25: fanout [10, 25] for sampling algos
-	  fanout_5_10_15: fanout [5, 10, 15] for sampling algos
-	  rmat_data: RMAT-generated synthetic datasets
-	  file_data: datasets from $RAPIDS_DATASET_ROOT_DIR
+    managedmem_on: RMM managed memory enabled
+    managedmem_off: RMM managed memory disabled
+    poolallocator_on: RMM pool allocator enabled
+    poolallocator_off: RMM pool allocator disabled
+    tiny: tiny datasets
+    small: small datasets
+    medium: medium datasets
+    large: large datasets
+    directed: directed datasets
+    undirected: undirected datasets
+    matrix_types: inputs are matrices
+    nx_types: inputs are NetowrkX Graph objects
+    cugraph_types: inputs are cuGraph Graph objects
+    sg: single-GPU
+    mg: multi-GPU
+    snmg: single-node multi-GPU
+    mnmg: multi-node multi-GPU
+    local: local cugraph
+    remote: cugraph-service
+    batch_size_100: batch size of 100 for sampling algos
+    batch_size_500: batch size of 500 for sampling algos
+    batch_size_1000: batch size of 1000 for sampling algos
+    batch_size_2500: batch size of 2500 for sampling algos
+    batch_size_5000: batch size of 5000 for sampling algos
+    batch_size_10000: batch size of 10000 for sampling algos
+    batch_size_20000: batch size of 20000 for sampling algos
+    batch_size_30000: batch size of 30000 for sampling algos
+    batch_size_40000: batch size of 40000 for sampling algos
+    batch_size_50000: batch size of 50000 for sampling algos
+    batch_size_60000: batch size of 60000 for sampling algos
+    batch_size_70000: batch size of 70000 for sampling algos
+    batch_size_80000: batch size of 80000 for sampling algos
+    batch_size_90000: batch size of 90000 for sampling algos
+    batch_size_100000: batch size of 100000 for sampling algos
+    num_clients_2: start 2 cugraph-service clients
+    num_clients_4: start 4 cugraph-service clients
+    num_clients_8: start 8 cugraph-service clients
+    num_clients_16: start 16 cugraph-service clients
+    num_clients_32: start 32 cugraph-service clients
+    fanout_10_25: fanout [10, 25] for sampling algos
+    fanout_5_10_15: fanout [5, 10, 15] for sampling algos
+    rmat_data: RMAT-generated synthetic datasets
+    file_data: datasets from $RAPIDS_DATASET_ROOT_DIR
 
 python_classes =
-                 Bench*
-                 Test*
+    Bench*
+    Test*
 
 python_files =
-                 bench_*
-                 test_*
+    bench_*
+    test_*
 
 python_functions =
-                   bench_*
-                   test_*
+    bench_*
+    test_*

From d03bfac093e03dac86caf45fb9a9c87acd64f5fa Mon Sep 17 00:00:00 2001
From: James Lamb 
Date: Tue, 30 Jul 2024 00:14:13 -0500
Subject: [PATCH 372/384] split up CUDA-suffixed dependencies in
 dependencies.yaml (#4552)

Contributes to https://github.com/rapidsai/build-planning/issues/31

In short, RAPIDS DLFW builds want to produce wheels with unsuffixed dependencies, e.g. `cudf` depending on `rmm`, not `rmm-cu12`.

This PR is part of a series across all of RAPIDS to try to support that type of build by setting up CUDA-suffixed and CUDA-unsuffixed dependency lists in `dependencies.yaml`.

For more details, see:

* https://github.com/rapidsai/build-planning/issues/31#issuecomment-2245815818
* https://github.com/rapidsai/cudf/pull/16183

## Notes for Reviewers

### Why target 24.08?

This is targeting 24.08 because:

1. it should be very low-risk
2. getting these changes into 24.08 prevents the need to carry around patches for every library in DLFW builds using RAPIDS 24.08

Authors:
  - James Lamb (https://github.com/jameslamb)

Approvers:
  - Bradley Dice (https://github.com/bdice)

URL: https://github.com/rapidsai/cugraph/pull/4552
---
 python/nx-cugraph/pyproject.toml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml
index 50881d5db..07e09201c 100644
--- a/python/nx-cugraph/pyproject.toml
+++ b/python/nx-cugraph/pyproject.toml
@@ -86,6 +86,7 @@ include = [
 build-backend = "setuptools.build_meta"
 commit-files = ["_nx_cugraph/GIT_COMMIT"]
 dependencies-file = "../../dependencies.yaml"
+matrix-entry = "cuda_suffixed=true"
 
 [tool.black]
 line-length = 88

From cbcffaf1efdb5999dc875626bd02cd1672e7823f Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 30 Jul 2024 08:47:39 +0200
Subject: [PATCH 373/384] nx-cugraph: add `from_dict_of_lists` and
 `to_dict_of_lists` (#4537)

Tests were added to improve coverage. Perhaps we could/should upstream tests to networkx.

Authors:
  - Erik Welch (https://github.com/eriknw)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4537
---
 python/nx-cugraph/README.md                   |   3 +
 python/nx-cugraph/_nx_cugraph/__init__.py     |   2 +
 python/nx-cugraph/nx_cugraph/convert.py       | 102 +++++++++++++++++-
 .../nx_cugraph/tests/test_convert.py          |  50 ++++++++-
 4 files changed, 154 insertions(+), 3 deletions(-)

diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 27825585c..088f2fd20 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -253,6 +253,9 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
 classes
  └─ function
      └─ is_negatively_weighted
+convert
+ ├─ from_dict_of_lists
+ └─ to_dict_of_lists
 convert_matrix
  ├─ from_pandas_edgelist
  └─ from_scipy_sparse_array
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index f57b90eb4..3d27e4b9e 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -81,6 +81,7 @@
         "eigenvector_centrality",
         "empty_graph",
         "florentine_families_graph",
+        "from_dict_of_lists",
         "from_pandas_edgelist",
         "from_scipy_sparse_array",
         "frucht_graph",
@@ -138,6 +139,7 @@
         "star_graph",
         "tadpole_graph",
         "tetrahedral_graph",
+        "to_dict_of_lists",
         "transitivity",
         "triangles",
         "trivial_graph",
diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py
index b34245d50..9e6c080d6 100644
--- a/python/nx-cugraph/nx_cugraph/convert.py
+++ b/python/nx-cugraph/nx_cugraph/convert.py
@@ -14,7 +14,7 @@
 
 import itertools
 import operator as op
-from collections import Counter
+from collections import Counter, defaultdict
 from collections.abc import Mapping
 from typing import TYPE_CHECKING
 
@@ -24,7 +24,8 @@
 
 import nx_cugraph as nxcg
 
-from .utils import index_dtype
+from .utils import index_dtype, networkx_algorithm
+from .utils.misc import pairwise
 
 if TYPE_CHECKING:  # pragma: no cover
     from nx_cugraph.typing import AttrKey, Dtype, EdgeValue, NodeValue, any_ndarray
@@ -32,6 +33,8 @@
 __all__ = [
     "from_networkx",
     "to_networkx",
+    "from_dict_of_lists",
+    "to_dict_of_lists",
 ]
 
 concat = itertools.chain.from_iterable
@@ -653,3 +656,98 @@ def _to_undirected_graph(
         )
     # TODO: handle cugraph.Graph
     raise TypeError
+
+
+@networkx_algorithm(version_added="24.08")
+def from_dict_of_lists(d, create_using=None):
+    from .generators._utils import _create_using_class
+
+    graph_class, inplace = _create_using_class(create_using)
+    key_to_id = defaultdict(itertools.count().__next__)
+    src_indices = cp.array(
+        # cp.repeat is slow to use here, so use numpy instead
+        np.repeat(
+            np.fromiter(map(key_to_id.__getitem__, d), index_dtype),
+            np.fromiter(map(len, d.values()), index_dtype),
+        )
+    )
+    dst_indices = cp.fromiter(
+        map(key_to_id.__getitem__, concat(d.values())), index_dtype
+    )
+    # Initialize as directed first them symmetrize if undirected.
+    G = graph_class.to_directed_class().from_coo(
+        len(key_to_id),
+        src_indices,
+        dst_indices,
+        key_to_id=key_to_id,
+    )
+    if not graph_class.is_directed():
+        G = G.to_undirected()
+    if inplace:
+        return create_using._become(G)
+    return G
+
+
+@networkx_algorithm(version_added="24.08")
+def to_dict_of_lists(G, nodelist=None):
+    G = _to_graph(G)
+    src_indices = G.src_indices
+    dst_indices = G.dst_indices
+    if nodelist is not None:
+        try:
+            node_ids = G._nodekeys_to_nodearray(nodelist)
+        except KeyError as exc:
+            gname = "digraph" if G.is_directed() else "graph"
+            raise nx.NetworkXError(
+                f"The node {exc.args[0]} is not in the {gname}."
+            ) from exc
+        mask = cp.isin(src_indices, node_ids) & cp.isin(dst_indices, node_ids)
+        src_indices = src_indices[mask]
+        dst_indices = dst_indices[mask]
+    # Sort indices so we can use `cp.unique` to determine boundaries.
+    # This is like exporting to DCSR.
+    if G.is_multigraph():
+        stacked = cp.unique(cp.vstack((src_indices, dst_indices)), axis=1)
+        src_indices = stacked[0]
+        dst_indices = stacked[1]
+    else:
+        stacked = cp.vstack((dst_indices, src_indices))
+        indices = cp.lexsort(stacked)
+        src_indices = src_indices[indices]
+        dst_indices = dst_indices[indices]
+    compressed_srcs, left_bounds = cp.unique(src_indices, return_index=True)
+    # Ensure we include isolate nodes in the result (and in proper order)
+    rv = None
+    if nodelist is not None:
+        if compressed_srcs.size != len(nodelist):
+            if G.key_to_id is None:
+                # `G._nodekeys_to_nodearray` does not check for valid node keys.
+                container = range(G._N)
+                for key in nodelist:
+                    if key not in container:
+                        gname = "digraph" if G.is_directed() else "graph"
+                        raise nx.NetworkXError(f"The node {key} is not in the {gname}.")
+            rv = {key: [] for key in nodelist}
+    elif compressed_srcs.size != G._N:
+        rv = {key: [] for key in G}
+    # We use `boundaries` like this in `_groupby` too
+    boundaries = pairwise(itertools.chain(left_bounds.tolist(), [src_indices.size]))
+    dst_indices = dst_indices.tolist()
+    if G.key_to_id is None:
+        it = zip(compressed_srcs.tolist(), boundaries)
+        if rv is None:
+            return {src: dst_indices[start:end] for src, (start, end) in it}
+        rv.update((src, dst_indices[start:end]) for src, (start, end) in it)
+        return rv
+    to_key = G.id_to_key.__getitem__
+    it = zip(compressed_srcs.tolist(), boundaries)
+    if rv is None:
+        return {
+            to_key(src): list(map(to_key, dst_indices[start:end]))
+            for src, (start, end) in it
+        }
+    rv.update(
+        (to_key(src), list(map(to_key, dst_indices[start:end])))
+        for src, (start, end) in it
+    )
+    return rv
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_convert.py b/python/nx-cugraph/nx_cugraph/tests/test_convert.py
index 1a71b7968..634b28e96 100644
--- a/python/nx-cugraph/nx_cugraph/tests/test_convert.py
+++ b/python/nx-cugraph/nx_cugraph/tests/test_convert.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -13,10 +13,13 @@
 import cupy as cp
 import networkx as nx
 import pytest
+from packaging.version import parse
 
 import nx_cugraph as nxcg
 from nx_cugraph import interface
 
+nxver = parse(nx.__version__)
+
 
 @pytest.mark.parametrize(
     "graph_class", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
@@ -224,3 +227,48 @@ def test_multigraph(graph_class):
     H = nxcg.to_networkx(Gcg)
     assert type(G) is type(H)
     assert nx.utils.graphs_equal(G, H)
+
+
+def test_to_dict_of_lists():
+    G = nx.MultiGraph()
+    G.add_edge("a", "b")
+    G.add_edge("a", "c")
+    G.add_edge("a", "b")
+    expected = nx.to_dict_of_lists(G)
+    result = nxcg.to_dict_of_lists(G)
+    assert expected == result
+    expected = nx.to_dict_of_lists(G, nodelist=["a", "b"])
+    result = nxcg.to_dict_of_lists(G, nodelist=["a", "b"])
+    assert expected == result
+    with pytest.raises(nx.NetworkXError, match="The node d is not in the graph"):
+        nx.to_dict_of_lists(G, nodelist=["a", "d"])
+    with pytest.raises(nx.NetworkXError, match="The node d is not in the graph"):
+        nxcg.to_dict_of_lists(G, nodelist=["a", "d"])
+    G.add_node("d")  # No edges
+    expected = nx.to_dict_of_lists(G)
+    result = nxcg.to_dict_of_lists(G)
+    assert expected == result
+    expected = nx.to_dict_of_lists(G, nodelist=["a", "d"])
+    result = nxcg.to_dict_of_lists(G, nodelist=["a", "d"])
+    assert expected == result
+    # Now try with default node ids
+    G = nx.DiGraph()
+    G.add_edge(0, 1)
+    G.add_edge(0, 2)
+    expected = nx.to_dict_of_lists(G)
+    result = nxcg.to_dict_of_lists(G)
+    assert expected == result
+    expected = nx.to_dict_of_lists(G, nodelist=[0, 1])
+    result = nxcg.to_dict_of_lists(G, nodelist=[0, 1])
+    assert expected == result
+    with pytest.raises(nx.NetworkXError, match="The node 3 is not in the digraph"):
+        nx.to_dict_of_lists(G, nodelist=[0, 3])
+    with pytest.raises(nx.NetworkXError, match="The node 3 is not in the digraph"):
+        nxcg.to_dict_of_lists(G, nodelist=[0, 3])
+    G.add_node(3)  # No edges
+    expected = nx.to_dict_of_lists(G)
+    result = nxcg.to_dict_of_lists(G)
+    assert expected == result
+    expected = nx.to_dict_of_lists(G, nodelist=[0, 3])
+    result = nxcg.to_dict_of_lists(G, nodelist=[0, 3])
+    assert expected == result

From 9742e59b176659ace49252f45d04a621f3bc42bd Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 30 Jul 2024 08:49:57 +0200
Subject: [PATCH 374/384] nx-cugraph: fix `from_pandas_edgekey` given edgekey
 but not edgeattr (#4550)

This fixes this: https://github.com/networkx/networkx/pull/7466

We would catch this (and other changes) if we tested networkx nightlies. Someday!

I kept the buggy behavior for older versions of networkx in order to match networkx, which feels kinda silly, but also okay-ish.

Authors:
  - Erik Welch (https://github.com/eriknw)
  - Rick Ratzel (https://github.com/rlratzel)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4550
---
 .../nx-cugraph/nx_cugraph/convert_matrix.py   | 35 ++++++++++++-------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py
index 67f638698..10793c641 100644
--- a/python/nx-cugraph/nx_cugraph/convert_matrix.py
+++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py
@@ -111,19 +111,28 @@ def from_pandas_edgelist(
             }
         kwargs["edge_values"] = edge_values
 
-        if graph_class.is_multigraph() and edge_key is not None:
-            try:
-                edge_keys = df[edge_key].to_list()
-            except (KeyError, TypeError) as exc:
-                raise nx.NetworkXError(
-                    f"Invalid edge_key argument: {edge_key}"
-                ) from exc
-            if not graph_class.is_directed():
-                # Symmetrize the edges
-                edge_keys = cp.hstack(
-                    (edge_keys, edge_keys[mask] if mask is not None else edge_keys)
-                )
-            kwargs["edge_keys"] = edge_keys
+    if (
+        graph_class.is_multigraph()
+        and edge_key is not None
+        and (
+            # In nx <= 3.3, `edge_key` was ignored if `edge_attr` is None
+            edge_attr is not None
+            or nx.__version__[:3] > "3.3"
+        )
+    ):
+        try:
+            edge_keys = df[edge_key].to_list()
+        except (KeyError, TypeError) as exc:
+            raise nx.NetworkXError(f"Invalid edge_key argument: {edge_key}") from exc
+        if not graph_class.is_directed():
+            # Symmetrize the edges; remember, `edge_keys` is a list!
+            if mask is None:
+                edge_keys *= 2
+            else:
+                edge_keys += [
+                    key for keep, key in zip(mask.tolist(), edge_keys) if keep
+                ]
+        kwargs["edge_keys"] = edge_keys
 
     G = graph_class.from_coo(N, src_indices, dst_indices, **kwargs)
     if inplace:

From 5e5d59869bd7baedaae3d8dcad11c04e6e7e7840 Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 30 Jul 2024 08:53:35 +0200
Subject: [PATCH 375/384] nx-cugraph: add dijkstra sssp functions (#4538)

This does add new functionality (so it's not just sugar!), since dijstra methods have `cutoff=` arguments.

Note that we are missing multi-source dijstra methods, since `plc.sssp` only accepts a single source.

We also do not have `bidirectional_dijkstra`, since PLC does not implement this algorithm.

Authors:
  - Erik Welch (https://github.com/eriknw)
  - Rick Ratzel (https://github.com/rlratzel)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4538
---
 python/nx-cugraph/README.md                   |  10 +-
 python/nx-cugraph/_nx_cugraph/__init__.py     |  36 +++-
 .../algorithms/shortest_paths/generic.py      |  54 +++---
 .../algorithms/shortest_paths/unweighted.py   |   9 +-
 .../algorithms/shortest_paths/weighted.py     | 170 +++++++++++++++---
 .../nx_cugraph/tests/test_match_api.py        |  14 +-
 6 files changed, 230 insertions(+), 63 deletions(-)

diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 088f2fd20..8a1824a7a 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -173,11 +173,19 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
  └─ weighted
      ├─ all_pairs_bellman_ford_path
      ├─ all_pairs_bellman_ford_path_length
+     ├─ all_pairs_dijkstra
+     ├─ all_pairs_dijkstra_path
+     ├─ all_pairs_dijkstra_path_length
      ├─ bellman_ford_path
      ├─ bellman_ford_path_length
+     ├─ dijkstra_path
+     ├─ dijkstra_path_length
      ├─ single_source_bellman_ford
      ├─ single_source_bellman_ford_path
-     └─ single_source_bellman_ford_path_length
+     ├─ single_source_bellman_ford_path_length
+     ├─ single_source_dijkstra
+     ├─ single_source_dijkstra_path
+     └─ single_source_dijkstra_path_length
 traversal
  └─ breadth_first_search
      ├─ bfs_edges
diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py
index 3d27e4b9e..2d6017fa2 100644
--- a/python/nx-cugraph/_nx_cugraph/__init__.py
+++ b/python/nx-cugraph/_nx_cugraph/__init__.py
@@ -42,6 +42,9 @@
         # BEGIN: functions
         "all_pairs_bellman_ford_path",
         "all_pairs_bellman_ford_path_length",
+        "all_pairs_dijkstra",
+        "all_pairs_dijkstra_path",
+        "all_pairs_dijkstra_path_length",
         "all_pairs_shortest_path",
         "all_pairs_shortest_path_length",
         "ancestors",
@@ -75,6 +78,8 @@
         "descendants",
         "descendants_at_distance",
         "diamond_graph",
+        "dijkstra_path",
+        "dijkstra_path_length",
         "dodecahedral_graph",
         "edge_betweenness_centrality",
         "ego_graph",
@@ -132,6 +137,9 @@
         "single_source_bellman_ford",
         "single_source_bellman_ford_path",
         "single_source_bellman_ford_path_length",
+        "single_source_dijkstra",
+        "single_source_dijkstra_path",
+        "single_source_dijkstra_path_length",
         "single_source_shortest_path",
         "single_source_shortest_path_length",
         "single_target_shortest_path",
@@ -173,8 +181,8 @@
         "katz_centrality": "`nstart` isn't used (but is checked), and `normalized=False` is not supported.",
         "louvain_communities": "`seed` parameter is currently ignored, and self-loops are not yet supported.",
         "pagerank": "`dangling` parameter is not supported, but it is checked for validity.",
-        "shortest_path": "Negative weights are not yet supported, and method is ununsed.",
-        "shortest_path_length": "Negative weights are not yet supported, and method is ununsed.",
+        "shortest_path": "Negative weights are not yet supported.",
+        "shortest_path_length": "Negative weights are not yet supported.",
         "single_source_bellman_ford": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
         "single_source_bellman_ford_path": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
         "single_source_bellman_ford_path_length": "Negative cycles are not yet supported. ``NotImplementedError`` will be raised if there are negative edge weights. We plan to support negative edge weights soon. Also, callable ``weight`` argument is not supported.",
@@ -189,12 +197,27 @@
         "all_pairs_bellman_ford_path_length": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
+        "all_pairs_dijkstra": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "all_pairs_dijkstra_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "all_pairs_dijkstra_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         "bellman_ford_path": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
         "bellman_ford_path_length": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
+        "dijkstra_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "dijkstra_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         "ego_graph": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
@@ -229,6 +252,15 @@
         "single_source_bellman_ford_path_length": {
             "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
         },
+        "single_source_dijkstra": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "single_source_dijkstra_path": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
+        "single_source_dijkstra_path_length": {
+            "dtype : dtype or None, optional": "The data type (np.float32, np.float64, or None) to use for the edge weights in the algorithm. If None, then dtype is determined by the edge values.",
+        },
         # END: additional_parameters
     },
 }
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py
index 68dbbace9..7d6d77f34 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/generic.py
@@ -43,7 +43,7 @@ def has_path(G, source, target):
 def shortest_path(
     G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None
 ):
-    """Negative weights are not yet supported, and method is ununsed."""
+    """Negative weights are not yet supported."""
     if method not in {"dijkstra", "bellman-ford"}:
         raise ValueError(f"method not supported: {method}")
     if weight is None:
@@ -53,9 +53,9 @@ def shortest_path(
             # All pairs
             if method == "unweighted":
                 paths = nxcg.all_pairs_shortest_path(G)
-            else:
-                # method == "dijkstra":
-                # method == 'bellman-ford':
+            elif method == "dijkstra":
+                paths = nxcg.all_pairs_dijkstra_path(G, weight=weight, dtype=dtype)
+            else:  # method == 'bellman-ford':
                 paths = nxcg.all_pairs_bellman_ford_path(G, weight=weight, dtype=dtype)
             if nx.__version__[:3] <= "3.4":
                 paths = dict(paths)
@@ -75,9 +75,11 @@ def shortest_path(
         # From source
         if method == "unweighted":
             paths = nxcg.single_source_shortest_path(G, source)
-        else:
-            # method == "dijkstra":
-            # method == 'bellman-ford':
+        elif method == "dijkstra":
+            paths = nxcg.single_source_dijkstra_path(
+                G, source, weight=weight, dtype=dtype
+            )
+        else:  # method == 'bellman-ford':
             paths = nxcg.single_source_bellman_ford_path(
                 G, source, weight=weight, dtype=dtype
             )
@@ -106,7 +108,7 @@ def _(G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None
 def shortest_path_length(
     G, source=None, target=None, weight=None, method="dijkstra", *, dtype=None
 ):
-    """Negative weights are not yet supported, and method is ununsed."""
+    """Negative weights are not yet supported."""
     if method not in {"dijkstra", "bellman-ford"}:
         raise ValueError(f"method not supported: {method}")
     if weight is None:
@@ -116,9 +118,11 @@ def shortest_path_length(
             # All pairs
             if method == "unweighted":
                 lengths = nxcg.all_pairs_shortest_path_length(G)
-            else:
-                # method == "dijkstra":
-                # method == 'bellman-ford':
+            elif method == "dijkstra":
+                lengths = nxcg.all_pairs_dijkstra_path_length(
+                    G, weight=weight, dtype=dtype
+                )
+            else:  # method == 'bellman-ford':
                 lengths = nxcg.all_pairs_bellman_ford_path_length(
                     G, weight=weight, dtype=dtype
                 )
@@ -127,9 +131,11 @@ def shortest_path_length(
             lengths = nxcg.single_target_shortest_path_length(G, target)
             if nx.__version__[:3] <= "3.4":
                 lengths = dict(lengths)
-        else:
-            # method == "dijkstra":
-            # method == 'bellman-ford':
+        elif method == "dijkstra":
+            lengths = nxcg.single_source_dijkstra_path_length(
+                G, target, weight=weight, dtype=dtype
+            )
+        else:  # method == 'bellman-ford':
             lengths = nxcg.single_source_bellman_ford_path_length(
                 G, target, weight=weight, dtype=dtype
             )
@@ -137,21 +143,21 @@ def shortest_path_length(
         # From source
         if method == "unweighted":
             lengths = nxcg.single_source_shortest_path_length(G, source)
-        else:
-            # method == "dijkstra":
-            # method == 'bellman-ford':
-            lengths = dict(
-                nxcg.single_source_bellman_ford_path_length(
-                    G, source, weight=weight, dtype=dtype
-                )
+        elif method == "dijkstra":
+            lengths = nxcg.single_source_dijkstra_path_length(
+                G, source, weight=weight, dtype=dtype
+            )
+        else:  # method == 'bellman-ford':
+            lengths = nxcg.single_source_bellman_ford_path_length(
+                G, source, weight=weight, dtype=dtype
             )
     # From source to target
     elif method == "unweighted":
         G = _to_graph(G)
         lengths = _bfs(G, source, None, "Source", return_type="length", target=target)
-    else:
-        # method == "dijkstra":
-        # method == 'bellman-ford':
+    elif method == "dijkstra":
+        lengths = nxcg.dijkstra_path_length(G, source, target, weight, dtype=dtype)
+    else:  # method == 'bellman-ford':
         lengths = nxcg.bellman_ford_path_length(G, source, target, weight, dtype=dtype)
     return lengths
 
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
index 714289c5b..0e98c366e 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/unweighted.py
@@ -61,7 +61,12 @@ def bidirectional_shortest_path(G, source, target):
     # TODO PERF: do bidirectional traversal in core
     G = _to_graph(G)
     if source not in G or target not in G:
-        raise nx.NodeNotFound(f"Either source {source} or target {target} is not in G")
+        if nx.__version__[:3] <= "3.3":
+            raise nx.NodeNotFound(
+                f"Either source {source} or target {target} is not in G"
+            )
+        missing = f"Source {source}" if source not in G else f"Target {target}"
+        raise nx.NodeNotFound(f"{missing} is not in G")
     return _bfs(G, source, None, "Source", return_type="path", target=target)
 
 
@@ -131,7 +136,7 @@ def _bfs(
         # return_type == "length-path"
         return {source: 0}, {source: [source]}
 
-    if cutoff is None:
+    if cutoff is None or np.isinf(cutoff):
         cutoff = -1
     src_index = source if G.key_to_id is None else G.key_to_id[source]
     distances, predecessors, node_ids = plc.bfs(
diff --git a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py
index 32323dd45..032ef2c7f 100644
--- a/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py
+++ b/python/nx-cugraph/nx_cugraph/algorithms/shortest_paths/weighted.py
@@ -25,6 +25,14 @@
 from .unweighted import _bfs
 
 __all__ = [
+    "dijkstra_path",
+    "dijkstra_path_length",
+    "single_source_dijkstra",
+    "single_source_dijkstra_path",
+    "single_source_dijkstra_path_length",
+    "all_pairs_dijkstra",
+    "all_pairs_dijkstra_path",
+    "all_pairs_dijkstra_path_length",
     "bellman_ford_path",
     "bellman_ford_path_length",
     "single_source_bellman_ford",
@@ -44,14 +52,24 @@ def _add_doc(func):
     return func
 
 
-@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
-@_add_doc
-def bellman_ford_path(G, source, target, weight="weight", *, dtype=None):
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def dijkstra_path(G, source, target, weight="weight", *, dtype=None):
     G = _to_graph(G, weight, 1, np.float32)
     dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     return _sssp(G, source, weight, target, return_type="path", dtype=dtype)
 
 
+@dijkstra_path._can_run
+def _(G, source, target, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def bellman_ford_path(G, source, target, weight="weight", *, dtype=None):
+    return dijkstra_path(G, source, target, weight=weight, dtype=dtype)
+
+
 @bellman_ford_path._can_run
 def _(G, source, target, weight="weight", *, dtype=None):
     return (
@@ -61,14 +79,24 @@ def _(G, source, target, weight="weight", *, dtype=None):
     )
 
 
-@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
-@_add_doc
-def bellman_ford_path_length(G, source, target, weight="weight", *, dtype=None):
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def dijkstra_path_length(G, source, target, weight="weight", *, dtype=None):
     G = _to_graph(G, weight, 1, np.float32)
     dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     return _sssp(G, source, weight, target, return_type="length", dtype=dtype)
 
 
+@dijkstra_path._can_run
+def _(G, source, target, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def bellman_ford_path_length(G, source, target, weight="weight", *, dtype=None):
+    return dijkstra_path_length(G, source, target, weight=weight, dtype=dtype)
+
+
 @bellman_ford_path_length._can_run
 def _(G, source, target, weight="weight", *, dtype=None):
     return (
@@ -78,12 +106,22 @@ def _(G, source, target, weight="weight", *, dtype=None):
     )
 
 
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def single_source_dijkstra_path(G, source, cutoff=None, weight="weight", *, dtype=None):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, return_type="path", dtype=dtype, cutoff=cutoff)
+
+
+@single_source_dijkstra_path._can_run
+def _(G, source, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
 @networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
 @_add_doc
 def single_source_bellman_ford_path(G, source, weight="weight", *, dtype=None):
-    G = _to_graph(G, weight, 1, np.float32)
-    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
-    return _sssp(G, source, weight, return_type="path", dtype=dtype)
+    return single_source_dijkstra_path(G, source, weight=weight, dtype=dtype)
 
 
 @single_source_bellman_ford_path._can_run
@@ -95,12 +133,24 @@ def _(G, source, weight="weight", *, dtype=None):
     )
 
 
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def single_source_dijkstra_path_length(
+    G, source, cutoff=None, weight="weight", *, dtype=None
+):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(G, source, weight, return_type="length", dtype=dtype, cutoff=cutoff)
+
+
+@single_source_dijkstra_path_length._can_run
+def _(G, source, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
 @networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
 @_add_doc
 def single_source_bellman_ford_path_length(G, source, weight="weight", *, dtype=None):
-    G = _to_graph(G, weight, 1, np.float32)
-    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
-    return _sssp(G, source, weight, return_type="length", dtype=dtype)
+    return single_source_dijkstra_path_length(G, source, weight=weight, dtype=dtype)
 
 
 @single_source_bellman_ford_path_length._can_run
@@ -112,12 +162,26 @@ def _(G, source, weight="weight", *, dtype=None):
     )
 
 
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def single_source_dijkstra(
+    G, source, target=None, cutoff=None, weight="weight", *, dtype=None
+):
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    return _sssp(
+        G, source, weight, target, return_type="length-path", dtype=dtype, cutoff=cutoff
+    )
+
+
+@single_source_dijkstra._can_run
+def _(G, source, target=None, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
 @networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
 @_add_doc
 def single_source_bellman_ford(G, source, target=None, weight="weight", *, dtype=None):
-    G = _to_graph(G, weight, 1, np.float32)
-    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
-    return _sssp(G, source, weight, target, return_type="length-path", dtype=dtype)
+    return single_source_dijkstra(G, source, target=target, weight=weight, dtype=dtype)
 
 
 @single_source_bellman_ford._can_run
@@ -129,14 +193,41 @@ def _(G, source, target=None, weight="weight", *, dtype=None):
     )
 
 
-@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
-@_add_doc
-def all_pairs_bellman_ford_path_length(G, weight="weight", *, dtype=None):
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def all_pairs_dijkstra(G, cutoff=None, weight="weight", *, dtype=None):
+    # TODO PERF: batched bfs to compute many at once
+    G = _to_graph(G, weight, 1, np.float32)
+    dtype = _get_float_dtype(dtype, graph=G, weight=weight)
+    for n in G:
+        yield (
+            n,
+            _sssp(G, n, weight, return_type="length-path", dtype=dtype, cutoff=cutoff),
+        )
+
+
+@all_pairs_dijkstra._can_run
+def _(G, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def all_pairs_dijkstra_path_length(G, cutoff=None, weight="weight", *, dtype=None):
     # TODO PERF: batched bfs to compute many at once
     G = _to_graph(G, weight, 1, np.float32)
     dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     for n in G:
-        yield (n, _sssp(G, n, weight, return_type="length", dtype=dtype))
+        yield (n, _sssp(G, n, weight, return_type="length", dtype=dtype, cutoff=cutoff))
+
+
+@all_pairs_dijkstra_path_length._can_run
+def _(G, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def all_pairs_bellman_ford_path_length(G, weight="weight", *, dtype=None):
+    return all_pairs_dijkstra_path_length(G, weight=weight, dtype=None)
 
 
 @all_pairs_bellman_ford_path_length._can_run
@@ -148,14 +239,24 @@ def _(G, weight="weight", *, dtype=None):
     )
 
 
-@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
-@_add_doc
-def all_pairs_bellman_ford_path(G, weight="weight", *, dtype=None):
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.08", _plc="sssp")
+def all_pairs_dijkstra_path(G, cutoff=None, weight="weight", *, dtype=None):
     # TODO PERF: batched bfs to compute many at once
     G = _to_graph(G, weight, 1, np.float32)
     dtype = _get_float_dtype(dtype, graph=G, weight=weight)
     for n in G:
-        yield (n, _sssp(G, n, weight, return_type="path", dtype=dtype))
+        yield (n, _sssp(G, n, weight, return_type="path", dtype=dtype, cutoff=cutoff))
+
+
+@all_pairs_dijkstra_path._can_run
+def _(G, cutoff=None, weight="weight", *, dtype=None):
+    return not callable(weight)
+
+
+@networkx_algorithm(extra_params=_dtype_param, version_added="24.04", _plc="sssp")
+@_add_doc
+def all_pairs_bellman_ford_path(G, weight="weight", *, dtype=None):
+    return all_pairs_dijkstra_path(G, weight=weight, dtype=None)
 
 
 @all_pairs_bellman_ford_path._can_run
@@ -167,7 +268,17 @@ def _(G, weight="weight", *, dtype=None):
     )
 
 
-def _sssp(G, source, weight, target=None, *, return_type, dtype, reverse_path=False):
+def _sssp(
+    G,
+    source,
+    weight,
+    target=None,
+    *,
+    return_type,
+    dtype,
+    reverse_path=False,
+    cutoff=None,
+):
     """SSSP for weighted shortest paths.
 
     Parameters
@@ -201,7 +312,7 @@ def _sssp(G, source, weight, target=None, *, return_type, dtype, reverse_path=Fa
 
     if weight not in G.edge_values:
         # No edge values, so use BFS instead
-        return _bfs(G, source, None, "Source", return_type=return_type, target=target)
+        return _bfs(G, source, cutoff, "Source", return_type=return_type, target=target)
 
     # Check for negative values since we don't support negative cycles
     edge_vals = G.edge_values[weight]
@@ -217,7 +328,7 @@ def _sssp(G, source, weight, target=None, *, return_type, dtype, reverse_path=Fa
         return _bfs(
             G,
             source,
-            None,
+            None if cutoff is None else cutoff / edge_val,
             "Source",
             return_type=return_type,
             target=target,
@@ -226,11 +337,16 @@ def _sssp(G, source, weight, target=None, *, return_type, dtype, reverse_path=Fa
         )
 
     src_index = source if G.key_to_id is None else G.key_to_id[source]
+    if cutoff is None:
+        cutoff = np.inf
+    else:
+        cutoff = np.nextafter(cutoff, np.inf, dtype=np.float64)
+
     node_ids, distances, predecessors = plc.sssp(
         resource_handle=plc.ResourceHandle(),
         graph=G._get_plc_graph(weight, 1, dtype),
         source=src_index,
-        cutoff=np.inf,
+        cutoff=cutoff,
         compute_predecessors=True,  # TODO: False is not yet supported
         # compute_predecessors=return_type != "length",
         do_expensive_check=False,
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
index d784d8c13..176b531a6 100644
--- a/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
+++ b/python/nx-cugraph/nx_cugraph/tests/test_match_api.py
@@ -48,7 +48,7 @@ def test_match_signature_and_names():
         orig_sig = inspect.signature(orig_func)
         func_sig = inspect.signature(func)
         if not func.extra_params:
-            assert orig_sig == func_sig
+            assert orig_sig == func_sig, name
         else:
             # Ignore extra parameters added to nx-cugraph algorithm
             # The key of func.extra_params may be like "max_level : int, optional",
@@ -60,14 +60,14 @@ def test_match_signature_and_names():
                     for name, p in func_sig.parameters.items()
                     if name not in extra_params
                 ]
-            )
+            ), name
         if func.can_run is not nxcg.utils.decorators._default_can_run:
-            assert func_sig == inspect.signature(func.can_run)
+            assert func_sig == inspect.signature(func.can_run), name
         if func.should_run is not nxcg.utils.decorators._default_should_run:
-            assert func_sig == inspect.signature(func.should_run)
+            assert func_sig == inspect.signature(func.should_run), name
 
         # Matching function names?
-        assert func.__name__ == dispatchable_func.__name__ == orig_func.__name__
+        assert func.__name__ == dispatchable_func.__name__ == orig_func.__name__, name
 
         # Matching dispatch names?
         # nx version >=3.2 uses name, version >=3.0,<3.2 uses dispatchname
@@ -75,14 +75,14 @@ def test_match_signature_and_names():
             dispatchname = dispatchable_func.dispatchname
         else:
             dispatchname = dispatchable_func.name
-        assert func.name == dispatchname
+        assert func.name == dispatchname, name
 
         # Matching modules (i.e., where function defined)?
         assert (
             "networkx." + func.__module__.split(".", 1)[1]
             == dispatchable_func.__module__
             == orig_func.__module__
-        )
+        ), name
 
         # Matching package layout (i.e., which modules have the function)?
         nxcg_path = func.__module__

From 4dffdd9c9dc54b008dacd79869f56d20e30118cf Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 30 Jul 2024 15:52:02 +0200
Subject: [PATCH 376/384] Further optimize `from_pandas_edgelist` with cudf
 (#4528)

This continues #4525 (and [this comment](https://github.com/rapidsai/cugraph/pull/4525#discussion_r1669847549)) to avoid copies and to be more optimal whether using pandas, cudf, or cudf.pandas. Notably, using `s.to_numpy` with cudf will return a _numpy_ array, but `cudf.pandas` may return a _cupy_ array (proxy).

Also, `s.to_numpy(copy=False)` ([from comment](https://github.com/rapidsai/cugraph/pull/4525#discussion_r1669020347)) is not used, b/c cudf's `to_numpy` raises if `copy=False`. We get the behavior we want by not specifying `copy=`.

I don't know if this is the best way to determine whether a copy occurred or not, but this seems like a useful pattern to establish, because we want to make ingest more efficient.

CC @rlratzel

Authors:
  - Erik Welch (https://github.com/eriknw)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)

URL: https://github.com/rapidsai/cugraph/pull/4528
---
 .../nx-cugraph/nx_cugraph/convert_matrix.py   | 35 ++++++--
 .../nx_cugraph/tests/test_convert_matrix.py   | 86 +++++++++++++++++++
 .../nx-cugraph/nx_cugraph/tests/test_utils.py | 22 ++++-
 python/nx-cugraph/nx_cugraph/utils/misc.py    | 32 +++++++
 4 files changed, 166 insertions(+), 9 deletions(-)
 create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_convert_matrix.py

diff --git a/python/nx-cugraph/nx_cugraph/convert_matrix.py b/python/nx-cugraph/nx_cugraph/convert_matrix.py
index 10793c641..38139b913 100644
--- a/python/nx-cugraph/nx_cugraph/convert_matrix.py
+++ b/python/nx-cugraph/nx_cugraph/convert_matrix.py
@@ -15,7 +15,7 @@
 import numpy as np
 
 from .generators._utils import _create_using_class
-from .utils import index_dtype, networkx_algorithm
+from .utils import _cp_iscopied_asarray, index_dtype, networkx_algorithm
 
 __all__ = [
     "from_pandas_edgelist",
@@ -34,16 +34,30 @@ def from_pandas_edgelist(
     edge_key=None,
 ):
     """cudf.DataFrame inputs also supported; value columns with str is unsuppported."""
+    # This function never shares ownership of the underlying arrays of the DataFrame
+    # columns. We will perform a copy if necessary even if given e.g. a cudf.DataFrame.
     graph_class, inplace = _create_using_class(create_using)
     # Try to be optimal whether using pandas, cudf, or cudf.pandas
-    src_array = df[source].to_numpy()
-    dst_array = df[target].to_numpy()
+    src_series = df[source]
+    dst_series = df[target]
     try:
         # Optimistically try to use cupy, but fall back to numpy if necessary
-        src_array = cp.asarray(src_array)
-        dst_array = cp.asarray(dst_array)
+        src_array = src_series.to_cupy()
+        dst_array = dst_series.to_cupy()
+    except (AttributeError, TypeError, ValueError, NotImplementedError):
+        src_array = src_series.to_numpy()
+        dst_array = dst_series.to_numpy()
+    try:
+        # Minimize unnecessary data copies by tracking whether we copy or not
+        is_src_copied, src_array = _cp_iscopied_asarray(
+            src_array, orig_object=src_series
+        )
+        is_dst_copied, dst_array = _cp_iscopied_asarray(
+            dst_array, orig_object=dst_series
+        )
         np_or_cp = cp
     except ValueError:
+        is_src_copied = is_dst_copied = False
         src_array = np.asarray(src_array)
         dst_array = np.asarray(dst_array)
         np_or_cp = np
@@ -65,8 +79,15 @@ def from_pandas_edgelist(
         src_indices = cp.asarray(np_or_cp.searchsorted(nodes, src_array), index_dtype)
         dst_indices = cp.asarray(np_or_cp.searchsorted(nodes, dst_array), index_dtype)
     else:
-        src_indices = cp.array(src_array)
-        dst_indices = cp.array(dst_array)
+        # Copy if necessary so we don't share ownership of input arrays.
+        if is_src_copied:
+            src_indices = src_array
+        else:
+            src_indices = cp.array(src_array)
+        if is_dst_copied:
+            dst_indices = dst_array
+        else:
+            dst_indices = cp.array(dst_array)
 
     if not graph_class.is_directed():
         # Symmetrize the edges
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_convert_matrix.py b/python/nx-cugraph/nx_cugraph/tests/test_convert_matrix.py
new file mode 100644
index 000000000..0a9cc087c
--- /dev/null
+++ b/python/nx-cugraph/nx_cugraph/tests/test_convert_matrix.py
@@ -0,0 +1,86 @@
+# Copyright (c) 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
+#
+#     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.
+import networkx as nx
+import pandas as pd
+import pytest
+
+import nx_cugraph as nxcg
+from nx_cugraph.utils import _cp_iscopied_asarray
+
+try:
+    import cudf
+except ModuleNotFoundError:
+    cudf = None
+
+
+DATA = [
+    {"source": [0, 1], "target": [1, 2]},  # nodes are 0, 1, 2
+    {"source": [0, 1], "target": [1, 3]},  # nodes are 0, 1, 3 (need renumbered!)
+    {"source": ["a", "b"], "target": ["b", "c"]},  # nodes are 'a', 'b', 'c'
+]
+CREATE_USING = [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph]
+
+
+@pytest.mark.skipif("not cudf")
+@pytest.mark.parametrize("data", DATA)
+@pytest.mark.parametrize("create_using", CREATE_USING)
+def test_from_cudf_edgelist(data, create_using):
+    df = cudf.DataFrame(data)
+    nxcg.from_pandas_edgelist(df, create_using=create_using)  # Basic smoke test
+    source = df["source"]
+    if source.dtype == int:
+        is_copied, src_array = _cp_iscopied_asarray(source)
+        assert is_copied is False
+        is_copied, src_array = _cp_iscopied_asarray(source.to_cupy())
+        assert is_copied is False
+        is_copied, src_array = _cp_iscopied_asarray(source, orig_object=source)
+        assert is_copied is False
+        is_copied, src_array = _cp_iscopied_asarray(
+            source.to_cupy(), orig_object=source
+        )
+        assert is_copied is False
+        # to numpy
+        is_copied, src_array = _cp_iscopied_asarray(source.to_numpy())
+        assert is_copied is True
+        is_copied, src_array = _cp_iscopied_asarray(
+            source.to_numpy(), orig_object=source
+        )
+        assert is_copied is True
+    else:
+        with pytest.raises(TypeError):
+            _cp_iscopied_asarray(source)
+        with pytest.raises(TypeError):
+            _cp_iscopied_asarray(source.to_cupy())
+        with pytest.raises(ValueError, match="Unsupported dtype"):
+            _cp_iscopied_asarray(source.to_numpy())
+        with pytest.raises(ValueError, match="Unsupported dtype"):
+            _cp_iscopied_asarray(source.to_numpy(), orig_object=source)
+
+
+@pytest.mark.parametrize("data", DATA)
+@pytest.mark.parametrize("create_using", CREATE_USING)
+def test_from_pandas_edgelist(data, create_using):
+    df = pd.DataFrame(data)
+    nxcg.from_pandas_edgelist(df, create_using=create_using)  # Basic smoke test
+    source = df["source"]
+    if source.dtype == int:
+        is_copied, src_array = _cp_iscopied_asarray(source)
+        assert is_copied is True
+        is_copied, src_array = _cp_iscopied_asarray(source, orig_object=source)
+        assert is_copied is True
+        is_copied, src_array = _cp_iscopied_asarray(source.to_numpy())
+        assert is_copied is True
+        is_copied, src_array = _cp_iscopied_asarray(
+            source.to_numpy(), orig_object=source
+        )
+        assert is_copied is True
diff --git a/python/nx-cugraph/nx_cugraph/tests/test_utils.py b/python/nx-cugraph/nx_cugraph/tests/test_utils.py
index fdd0c9199..d38a286fa 100644
--- a/python/nx-cugraph/nx_cugraph/tests/test_utils.py
+++ b/python/nx-cugraph/nx_cugraph/tests/test_utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-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
@@ -10,10 +10,11 @@
 # 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.
+import cupy as cp
 import numpy as np
 import pytest
 
-from nx_cugraph.utils import _get_int_dtype
+from nx_cugraph.utils import _cp_iscopied_asarray, _get_int_dtype
 
 
 def test_get_int_dtype():
@@ -85,3 +86,20 @@ def test_get_int_dtype():
         _get_int_dtype(7, signed=True, unsigned=True)
     assert _get_int_dtype(7, signed=True, unsigned=False) == np.int8
     assert _get_int_dtype(7, signed=False, unsigned=True) == np.uint8
+
+
+def test_cp_iscopied_asarray():
+    # We don't yet run doctest, so do simple copy/paste test here.
+    #
+    # >>> is_copied, a = _cp_iscopied_asarray([1, 2, 3])
+    # >>> is_copied
+    # True
+    # >>> a
+    # array([1, 2, 3])
+    # >>> _cp_iscopied_asarray(a)
+    # (False, array([1, 2, 3]))
+    is_copied, a = _cp_iscopied_asarray([1, 2, 3])
+    assert is_copied is True
+    assert isinstance(a, cp.ndarray)
+    assert repr(a) == "array([1, 2, 3])"
+    assert _cp_iscopied_asarray(a)[0] is False
diff --git a/python/nx-cugraph/nx_cugraph/utils/misc.py b/python/nx-cugraph/nx_cugraph/utils/misc.py
index eab4b42c2..8526524f1 100644
--- a/python/nx-cugraph/nx_cugraph/utils/misc.py
+++ b/python/nx-cugraph/nx_cugraph/utils/misc.py
@@ -45,6 +45,7 @@ def pairwise(it):
     "_get_int_dtype",
     "_get_float_dtype",
     "_dtype_param",
+    "_cp_iscopied_asarray",
 ]
 
 # This may switch to np.uint32 at some point
@@ -206,3 +207,34 @@ def _get_float_dtype(
             f"Dtype {dtype} cannot be safely promoted to float32 or float64"
         )
     return rv
+
+
+def _cp_iscopied_asarray(a, *args, orig_object=None, **kwargs):
+    """Like ``cp.asarray``, but also returns whether the input was copied.
+
+    Use this to avoid unnecessary copies. If given, ``orig_object`` will
+    also be inspected to determine if it was copied.
+
+    >>> is_copied, a = _cp_iscopied_asarray([1, 2, 3])
+    >>> is_copied
+    True
+    >>> a
+    array([1, 2, 3])
+    >>> _cp_iscopied_asarray(a)
+    (False, array([1, 2, 3]))
+    """
+    arr = cp.asarray(a, *args, **kwargs)
+    ptr = arr.__cuda_array_interface__["data"][0]
+    if (
+        hasattr(a, "__cuda_array_interface__")
+        and a.__cuda_array_interface__["data"][0] == ptr
+        and (
+            orig_object is None
+            or hasattr(orig_object, "__cuda_array_interface__")
+            and orig_object.__cuda_array_interface__["data"][0] == ptr
+        )
+        # Should we also check device_id?
+        # and getattr(getattr(a, "data", None), "device_id", None) == arr.data.device_id
+    ):
+        return False, arr
+    return True, arr

From c28474041d9561ca1bc20dcb0c29e6a617d54174 Mon Sep 17 00:00:00 2001
From: Erik Welch 
Date: Tue, 30 Jul 2024 20:42:58 +0200
Subject: [PATCH 377/384] nx-cugraph: add `relabel_nodes` and
 `convert_node_labels_to_integers` (#4531)

This was pretty tricky in places! This begins with `Graph` and `DiGraph`, which are probably tricker, because of the way edge data get merged when nodes are combined (and I wouldn't be surprised if there are other ways to do this operation).

This is one of the most heavily used functions in networkx and also networkx dependents.

Up next: multigraphs

Authors:
  - Erik Welch (https://github.com/eriknw)
  - Ralph Liu (https://github.com/nv-rliu)

Approvers:
  - Rick Ratzel (https://github.com/rlratzel)
  - Bradley Dice (https://github.com/bdice)

URL: https://github.com/rapidsai/cugraph/pull/4531
---
 python/nx-cugraph/.flake8                     |   3 +-
 python/nx-cugraph/README.md                   |   3 +
 python/nx-cugraph/_nx_cugraph/__init__.py     |   2 +
 python/nx-cugraph/lint.yaml                   |   6 +-
 python/nx-cugraph/nx_cugraph/__init__.py      |   3 +
 .../nx_cugraph/algorithms/operators/unary.py  |   5 +
 .../traversal/breadth_first_search.py         |  52 ++--
 python/nx-cugraph/nx_cugraph/convert.py       |  42 ++-
 python/nx-cugraph/nx_cugraph/interface.py     |  95 ++++++
 python/nx-cugraph/nx_cugraph/relabel.py       | 282 ++++++++++++++++++
 .../nx_cugraph/tests/test_relabel.py          |  63 ++++
 .../nx_cugraph/tests/testing_utils.py         |   8 +-
 python/nx-cugraph/pyproject.toml              |   3 +
 13 files changed, 536 insertions(+), 31 deletions(-)
 create mode 100644 python/nx-cugraph/nx_cugraph/relabel.py
 create mode 100644 python/nx-cugraph/nx_cugraph/tests/test_relabel.py

diff --git a/python/nx-cugraph/.flake8 b/python/nx-cugraph/.flake8
index c5874e54f..cdda8d108 100644
--- a/python/nx-cugraph/.flake8
+++ b/python/nx-cugraph/.flake8
@@ -1,9 +1,10 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 [flake8]
 max-line-length = 88
 inline-quotes = "
 extend-ignore =
+    B020,
     E203,
     SIM105,
     SIM401,
diff --git a/python/nx-cugraph/README.md b/python/nx-cugraph/README.md
index 8a1824a7a..458421e2b 100644
--- a/python/nx-cugraph/README.md
+++ b/python/nx-cugraph/README.md
@@ -267,6 +267,9 @@ Below is the list of algorithms that are currently supported in nx-cugraph.
 convert_matrix
  ├─ from_pandas_edgelist
  └─ from_scipy_sparse_array
+relabel
+ ├─ convert_node_labels_to_integers
+ └─ relabel_nodes
 
To request nx-cugraph backend support for a NetworkX API that is not listed diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index 2d6017fa2..d18fc53b8 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -69,6 +69,7 @@ "complete_graph", "complete_multipartite_graph", "connected_components", + "convert_node_labels_to_integers", "core_number", "cubical_graph", "cycle_graph", @@ -130,6 +131,7 @@ "path_graph", "petersen_graph", "reciprocity", + "relabel_nodes", "reverse", "sedgewick_maze_graph", "shortest_path", diff --git a/python/nx-cugraph/lint.yaml b/python/nx-cugraph/lint.yaml index 317d5b8d4..ce46360e2 100644 --- a/python/nx-cugraph/lint.yaml +++ b/python/nx-cugraph/lint.yaml @@ -50,7 +50,7 @@ repos: - id: black # - id: black-jupyter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.1 + rev: v0.5.4 hooks: - id: ruff args: [--fix-only, --show-fixes] # --unsafe-fixes] @@ -58,7 +58,7 @@ repos: rev: 7.1.0 hooks: - id: flake8 - args: ['--per-file-ignores=_nx_cugraph/__init__.py:E501', '--extend-ignore=SIM105'] # Why is this necessary? + 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.0 @@ -77,7 +77,7 @@ repos: additional_dependencies: [tomli] files: ^(nx_cugraph|docs)/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.1 + rev: v0.5.4 hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 2c54da878..7d6a2fbe4 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -23,6 +23,9 @@ from . import convert_matrix from .convert_matrix import * +from . import relabel +from .relabel import * + from . import generators from .generators import * diff --git a/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py b/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py index 08abc9f28..f53b34589 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/operators/unary.py @@ -51,5 +51,10 @@ def reverse(G, copy=True): if not G.is_directed(): raise nx.NetworkXError("Cannot reverse an undirected graph.") if isinstance(G, nx.Graph): + if not copy: + raise RuntimeError( + "Using `copy=False` is invalid when using a NetworkX graph " + "as input to `nx_cugraph.reverse`" + ) G = nxcg.from_networkx(G, preserve_all_attrs=True) return G.reverse(copy=copy) diff --git a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py index f5d5e2a99..5e4466d7d 100644 --- a/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py +++ b/python/nx-cugraph/nx_cugraph/algorithms/traversal/breadth_first_search.py @@ -57,23 +57,41 @@ def _bfs(G, source, *, depth_limit=None, reverse=False): return distances[mask], predecessors[mask], node_ids[mask] -@networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") -def generic_bfs_edges(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): - """`neighbors` and `sort_neighbors` parameters are not yet supported.""" - if neighbors is not None: - raise NotImplementedError( - "neighbors argument in generic_bfs_edges is not currently supported" - ) - if sort_neighbors is not None: - raise NotImplementedError( - "sort_neighbors argument in generic_bfs_edges is not currently supported" - ) - return bfs_edges(G, source, depth_limit=depth_limit) - - -@generic_bfs_edges._can_run -def _(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): - return neighbors is None and sort_neighbors is None +if nx.__version__[:3] <= "3.3": + + @networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") + def generic_bfs_edges( + G, source, neighbors=None, depth_limit=None, sort_neighbors=None + ): + """`neighbors` and `sort_neighbors` parameters are not yet supported.""" + if neighbors is not None: + raise NotImplementedError( + "neighbors argument in generic_bfs_edges is not currently supported" + ) + if sort_neighbors is not None: + raise NotImplementedError( + "sort_neighbors argument in generic_bfs_edges is not supported" + ) + return bfs_edges(G, source, depth_limit=depth_limit) + + @generic_bfs_edges._can_run + def _(G, source, neighbors=None, depth_limit=None, sort_neighbors=None): + return neighbors is None and sort_neighbors is None + +else: + + @networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") + def generic_bfs_edges(G, source, neighbors=None, depth_limit=None): + """`neighbors` parameter is not yet supported.""" + if neighbors is not None: + raise NotImplementedError( + "neighbors argument in generic_bfs_edges is not currently supported" + ) + return bfs_edges(G, source, depth_limit=depth_limit) + + @generic_bfs_edges._can_run + def _(G, source, neighbors=None, depth_limit=None): + return neighbors is None @networkx_algorithm(is_incomplete=True, version_added="24.02", _plc="bfs") diff --git a/python/nx-cugraph/nx_cugraph/convert.py b/python/nx-cugraph/nx_cugraph/convert.py index 9e6c080d6..56d16d837 100644 --- a/python/nx-cugraph/nx_cugraph/convert.py +++ b/python/nx-cugraph/nx_cugraph/convert.py @@ -411,13 +411,21 @@ def func(it, edge_attr=edge_attr, dtype=dtype): # Node values may be numpy or cupy arrays (useful for str, object, etc). # Someday we'll let the user choose np or cp, and support edge values. node_mask = np.fromiter(iter_mask, bool) - node_value = np.array(vals, dtype) try: - node_value = cp.array(node_value) + node_value = np.array(vals, dtype) except ValueError: - pass + # Handle e.g. list elements + if dtype is None or dtype == object: + node_value = np.fromiter(vals, object) + else: + raise else: - node_mask = cp.array(node_mask) + try: + node_value = cp.array(node_value) + except ValueError: + pass + else: + node_mask = cp.array(node_mask) node_values[node_attr] = node_value node_masks[node_attr] = node_mask # if vals.ndim > 1: ... @@ -431,7 +439,12 @@ def func(it, edge_attr=edge_attr, dtype=dtype): # Node values may be numpy or cupy arrays (useful for str, object, etc). # Someday we'll let the user choose np or cp, and support edge values. if dtype is None: - node_value = np.array(list(iter_values)) + vals = list(iter_values) + try: + node_value = np.array(vals) + except ValueError: + # Handle e.g. list elements + node_value = np.fromiter(vals, object) else: node_value = np.fromiter(iter_values, dtype) try: @@ -477,6 +490,23 @@ def func(it, edge_attr=edge_attr, dtype=dtype): return rv +def _to_tuples(ndim, L): + if ndim > 2: + L = list(map(_to_tuples.__get__(ndim - 1), L)) + return list(map(tuple, L)) + + +def _array_to_tuples(a): + """Like ``a.tolist()``, but nested structures are tuples instead of lists. + + This is only different from ``a.tolist()`` if ``a.ndim > 1``. It is used to + try to return tuples instead of lists for e.g. node values. + """ + if a.ndim > 1: + return _to_tuples(a.ndim, a.tolist()) + return a.tolist() + + def _iter_attr_dicts( values: dict[AttrKey, any_ndarray[EdgeValue | NodeValue]], masks: dict[AttrKey, any_ndarray[bool]], @@ -485,7 +515,7 @@ def _iter_attr_dicts( if full_attrs: full_dicts = ( dict(zip(full_attrs, vals)) - for vals in zip(*(values[attr].tolist() for attr in full_attrs)) + for vals in zip(*(_array_to_tuples(values[attr]) for attr in full_attrs)) ) partial_attrs = list(values.keys() & masks.keys()) if partial_attrs: diff --git a/python/nx-cugraph/nx_cugraph/interface.py b/python/nx-cugraph/nx_cugraph/interface.py index 8569bbf40..4007230ef 100644 --- a/python/nx-cugraph/nx_cugraph/interface.py +++ b/python/nx-cugraph/nx_cugraph/interface.py @@ -68,6 +68,13 @@ def key(testpath): louvain_different = "Louvain may be different due to RNG" no_string_dtype = "string edge values not currently supported" sssp_path_different = "sssp may choose a different valid path" + no_object_dtype_for_edges = ( + "Edges don't support object dtype (lists, strings, etc.)" + ) + tuple_elements_preferred = "elements are tuples instead of lists" + nx_cugraph_in_test_setup = ( + "nx-cugraph Graph is incompatible in test setup in nx versions < 3.3" + ) xfail = { # This is removed while strongly_connected_components() is not @@ -91,6 +98,81 @@ def key(testpath): "test_cycles.py:TestMinimumCycleBasis." "test_gh6787_and_edge_attribute_names" ): sssp_path_different, + key( + "test_graph_hashing.py:test_isomorphic_edge_attr" + ): no_object_dtype_for_edges, + key( + "test_graph_hashing.py:test_isomorphic_edge_attr_and_node_attr" + ): no_object_dtype_for_edges, + key( + "test_graph_hashing.py:test_isomorphic_edge_attr_subgraph_hash" + ): no_object_dtype_for_edges, + key( + "test_graph_hashing.py:" + "test_isomorphic_edge_attr_and_node_attr_subgraph_hash" + ): no_object_dtype_for_edges, + key( + "test_summarization.py:TestSNAPNoEdgeTypes.test_summary_graph" + ): no_object_dtype_for_edges, + key( + "test_summarization.py:TestSNAPUndirected.test_summary_graph" + ): no_object_dtype_for_edges, + key( + "test_summarization.py:TestSNAPDirected.test_summary_graph" + ): no_object_dtype_for_edges, + key("test_gexf.py:TestGEXF.test_relabel"): no_object_dtype_for_edges, + key( + "test_gml.py:TestGraph.test_parse_gml_cytoscape_bug" + ): no_object_dtype_for_edges, + key("test_gml.py:TestGraph.test_parse_gml"): no_object_dtype_for_edges, + key("test_gml.py:TestGraph.test_read_gml"): no_object_dtype_for_edges, + key("test_gml.py:TestGraph.test_data_types"): no_object_dtype_for_edges, + key( + "test_gml.py:TestPropertyLists.test_reading_graph_with_list_property" + ): no_object_dtype_for_edges, + key( + "test_relabel.py:" + "test_relabel_preserve_node_order_partial_mapping_with_copy_false" + ): "Node order is preserved when relabeling with partial mapping", + key( + "test_gml.py:" + "TestPropertyLists.test_reading_graph_with_single_element_list_property" + ): tuple_elements_preferred, + key( + "test_relabel.py:" + "TestRelabel.test_relabel_multidigraph_inout_merge_nodes" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multigraph_merge_inplace" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multidigraph_merge_inplace" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multidigraph_inout_copy" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multigraph_merge_copy" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multidigraph_merge_copy" + ): no_string_dtype, + key( + "test_relabel.py:TestRelabel.test_relabel_multigraph_nonnumeric_key" + ): no_string_dtype, + key("test_contraction.py:test_multigraph_path"): no_object_dtype_for_edges, + key( + "test_contraction.py:test_directed_multigraph_path" + ): no_object_dtype_for_edges, + key( + "test_contraction.py:test_multigraph_blockmodel" + ): no_object_dtype_for_edges, + key( + "test_summarization.py:TestSNAPUndirectedMulti.test_summary_graph" + ): no_string_dtype, + key( + "test_summarization.py:TestSNAPDirectedMulti.test_summary_graph" + ): no_string_dtype, } from packaging.version import parse @@ -118,6 +200,19 @@ def key(testpath): "test_strongly_connected.py:" "TestStronglyConnected.test_connected_raise" ): "test is incompatible with pytest>=8", + # NetworkX 3.3 introduced logic around functions that return graphs + key( + "test_vf2pp_helpers.py:TestGraphTinoutUpdating.test_updating" + ): nx_cugraph_in_test_setup, + key( + "test_vf2pp_helpers.py:TestGraphTinoutUpdating.test_restoring" + ): nx_cugraph_in_test_setup, + key( + "test_vf2pp_helpers.py:TestDiGraphTinoutUpdating.test_updating" + ): nx_cugraph_in_test_setup, + key( + "test_vf2pp_helpers.py:TestDiGraphTinoutUpdating.test_restoring" + ): nx_cugraph_in_test_setup, } ) diff --git a/python/nx-cugraph/nx_cugraph/relabel.py b/python/nx-cugraph/nx_cugraph/relabel.py new file mode 100644 index 000000000..20d1337a9 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/relabel.py @@ -0,0 +1,282 @@ +# Copyright (c) 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 +# +# 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. +import itertools +from collections import defaultdict + +import cupy as cp +import networkx as nx +import numpy as np + +import nx_cugraph as nxcg + +from .utils import _get_int_dtype, _groupby, index_dtype, networkx_algorithm + +__all__ = [ + "convert_node_labels_to_integers", + "relabel_nodes", +] + + +@networkx_algorithm(version_added="24.08") +def relabel_nodes(G, mapping, copy=True): + if isinstance(G, nx.Graph): + if not copy: + raise RuntimeError( + "Using `copy=False` is invalid when using a NetworkX graph " + "as input to `nx_cugraph.relabel_nodes`" + ) + G = nxcg.from_networkx(G, preserve_all_attrs=True) + it = range(G._N) if G.key_to_id is None else G.id_to_key + if callable(mapping): + previd_to_key = [mapping(node) for node in it] + else: + previd_to_key = [mapping.get(node, node) for node in it] + if not copy: + # Our implementation does not need to raise here, but do so to match networkx. + it = range(G._N) if G.key_to_id is None else G.id_to_key + D = nx.DiGraph([(x, y) for x, y in zip(it, previd_to_key) if x != y]) + if nx.algorithms.dag.has_cycle(D): + raise nx.NetworkXUnfeasible( + "The node label sets are overlapping and no ordering can " + "resolve the mapping. Use copy=True." + ) + key_to_previd = {val: i for i, val in enumerate(previd_to_key)} + newid_to_key = list(key_to_previd) + key_to_newid = dict(zip(newid_to_key, range(len(newid_to_key)))) + + src_indices = G.src_indices + dst_indices = G.dst_indices + edge_values = G.edge_values + edge_masks = G.edge_masks + node_values = G.node_values + node_masks = G.node_masks + if G.is_multigraph(): + edge_indices = G.edge_indices + edge_keys = G.edge_keys + if len(key_to_previd) != G._N: + # Some nodes were combined. + # Node data doesn't get merged, so use the data from the last shared index + int_dtype = _get_int_dtype(G._N - 1) + node_indices = cp.fromiter(key_to_previd.values(), int_dtype) + node_indices_np = node_indices.get() # Node data may be cupy or numpy arrays + node_values = {key: val[node_indices_np] for key, val in node_values.items()} + node_masks = {key: val[node_indices_np] for key, val in node_masks.items()} + + # Renumber, but will have duplicates + translations = cp.fromiter( + (key_to_newid[key] for key in previd_to_key), index_dtype + ) + src_indices_dup = translations[src_indices] + dst_indices_dup = translations[dst_indices] + + if G.is_multigraph(): + # No merging necessary for multigraphs. + if G.is_directed(): + src_indices = src_indices_dup + dst_indices = dst_indices_dup + else: + # New self-edges should have one edge entry, not two + mask = ( + # Not self-edges, no need to deduplicate + (src_indices_dup != dst_indices_dup) + # == : already self-edges; no need to deduplicate + # < : if new self-edges, keep where src < dst + | (src_indices <= dst_indices) + ) + if mask.all(): + src_indices = src_indices_dup + dst_indices = dst_indices_dup + else: + src_indices = src_indices_dup[mask] + dst_indices = dst_indices_dup[mask] + if edge_values: + edge_values = { + key: val[mask] for key, val in edge_values.items() + } + edge_masks = {key: val[mask] for key, val in edge_masks.items()} + if edge_keys is not None: + edge_keys = [ + key for keep, key in zip(mask.tolist(), edge_keys) if keep + ] + if edge_indices is not None: + edge_indices = edge_indices[mask] + # Handling of `edge_keys` and `edge_indices` is pure Python to match nx. + # This may be slower than we'd like; if it's way too slow, should we + # direct users to use the defaults of None? + if edge_keys is not None: + seen = set() + new_edge_keys = [] + for key in zip(src_indices.tolist(), dst_indices.tolist(), edge_keys): + if key in seen: + src, dst, edge_key = key + if not isinstance(edge_key, (int, float)): + edge_key = 0 + for edge_key in itertools.count(edge_key): + if (src, dst, edge_key) not in seen: + seen.add((src, dst, edge_key)) + break + else: + seen.add(key) + edge_key = key[2] + new_edge_keys.append(edge_key) + edge_keys = new_edge_keys + if edge_indices is not None: + # PERF: can we do this using cupy? + seen = set() + new_edge_indices = [] + for key in zip( + src_indices.tolist(), dst_indices.tolist(), edge_indices.tolist() + ): + if key in seen: + src, dst, edge_index = key + for edge_index in itertools.count(edge_index): + if (src, dst, edge_index) not in seen: + seen.add((src, dst, edge_index)) + break + else: + seen.add(key) + edge_index = key[2] + new_edge_indices.append(edge_index) + edge_indices = cp.array(new_edge_indices, index_dtype) + else: + stacked_dup = cp.vstack((src_indices_dup, dst_indices_dup)) + if not edge_values: + # Drop duplicates + stacked = cp.unique(stacked_dup, axis=1) + else: + # Drop duplicates. This relies heavily on `_groupby`. + # It has not been compared to alternative implementations. + # I wonder if there are ways to use assignment using duplicate indices. + (stacked, ind, inv) = cp.unique( + stacked_dup, axis=1, return_index=True, return_inverse=True + ) + if ind.dtype != int_dtype: + ind = ind.astype(int_dtype) + if inv.dtype != int_dtype: + inv = inv.astype(int_dtype) + + # We need to merge edge data + mask = cp.ones(src_indices.size, dtype=bool) + mask[ind] = False + edge_data = [val[mask] for val in edge_values.values()] + edge_data.extend(val[mask] for val in edge_masks.values()) + groups = _groupby(inv[mask], edge_data) + + edge_values = {key: val[ind] for key, val in edge_values.items()} + edge_masks = {key: val[ind] for key, val in edge_masks.items()} + + value_keys = list(edge_values.keys()) + mask_keys = list(edge_masks.keys()) + + values_to_update = defaultdict(list) + masks_to_update = defaultdict(list) + for k, v in groups.items(): + it = iter(v) + vals = dict(zip(value_keys, it)) # zip(strict=False) + masks = dict(zip(mask_keys, it)) # zip(strict=True) + for key, val in vals.items(): + if key in masks: + val = val[masks[key]] + if val.size > 0: + values_to_update[key].append((k, val[-1])) + masks_to_update[key].append((k, True)) + else: + values_to_update[key].append((k, val[-1])) + if key in edge_masks: + masks_to_update[key].append((k, True)) + + int_dtype = _get_int_dtype(src_indices.size - 1) + for k, v in values_to_update.items(): + ii, jj = zip(*v) + edge_val = edge_values[k] + edge_val[cp.array(ii, dtype=int_dtype)] = cp.array( + jj, dtype=edge_val.dtype + ) + for k, v in masks_to_update.items(): + ii, jj = zip(*v) + edge_masks[k][cp.array(ii, dtype=int_dtype)] = cp.array( + jj, dtype=bool + ) + src_indices = stacked[0] + dst_indices = stacked[1] + + if G.is_multigraph(): + # `edge_keys` and `edge_indices` are preserved for free if no nodes were merged + extra_kwargs = {"edge_keys": edge_keys, "edge_indices": edge_indices} + else: + extra_kwargs = {} + rv = G.__class__.from_coo( + len(key_to_previd), + src_indices, + dst_indices, + edge_values=edge_values, + edge_masks=edge_masks, + node_values=node_values, + node_masks=node_masks, + id_to_key=newid_to_key, + key_to_id=key_to_newid, + **extra_kwargs, + ) + rv.graph.update(G.graph) + if not copy: + G._become(rv) + return G + return rv + + +@networkx_algorithm(version_added="24.08") +def convert_node_labels_to_integers( + G, first_label=0, ordering="default", label_attribute=None +): + if ordering not in {"default", "sorted", "increasing degree", "decreasing degree"}: + raise nx.NetworkXError(f"Unknown node ordering: {ordering}") + if isinstance(G, nx.Graph): + G = nxcg.from_networkx(G, preserve_all_attrs=True) + G = G.copy() + if label_attribute is not None: + prev_vals = G.id_to_key + if prev_vals is None: + prev_vals = cp.arange(G._N, dtype=_get_int_dtype(G._N - 1)) + else: + try: + prev_vals = np.array(prev_vals) + except ValueError: + prev_vals = np.fromiter(prev_vals, object) + else: + try: + prev_vals = cp.array(prev_vals) + except ValueError: + pass + G.node_values[label_attribute] = prev_vals + G.node_masks.pop(label_attribute, None) + id_to_key = None + if ordering == "default" or ordering == "sorted" and G.key_to_id is None: + if first_label == 0: + G.key_to_id = None + else: + id_to_key = list(range(first_label, first_label + G._N)) + G.key_to_id = dict(zip(id_to_key, range(G._N))) + elif ordering == "sorted": + key_to_id = G.key_to_id + G.key_to_id = { + i: key_to_id[n] for i, n in enumerate(sorted(key_to_id), first_label) + } + else: + pairs = sorted( + ((d, n) for (n, d) in G._nodearray_to_dict(G._degrees_array()).items()), + reverse=ordering == "decreasing degree", + ) + key_to_id = G.key_to_id + G.key_to_id = {i: key_to_id[n] for i, (d, n) in enumerate(pairs, first_label)} + G._id_to_key = id_to_key + return G diff --git a/python/nx-cugraph/nx_cugraph/tests/test_relabel.py b/python/nx-cugraph/nx_cugraph/tests/test_relabel.py new file mode 100644 index 000000000..40bf851d3 --- /dev/null +++ b/python/nx-cugraph/nx_cugraph/tests/test_relabel.py @@ -0,0 +1,63 @@ +# Copyright (c) 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 +# +# 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. +import networkx as nx +import pytest + +import nx_cugraph as nxcg + +from .testing_utils import assert_graphs_equal + + +@pytest.mark.parametrize( + "create_using", [nx.Graph, nx.DiGraph, nx.MultiGraph, nx.MultiDiGraph] +) +def test_relabel(create_using): + G = nx.complete_graph(3, create_using=create_using) + Hnx = nx.relabel_nodes(G, {2: 1}) + Hcg = nxcg.relabel_nodes(G, {2: 1}) + assert_graphs_equal(Hnx, Hcg) + + G.add_edge(0, 2, a=11) + G.add_edge(1, 2, b=22) + Hnx = nx.relabel_nodes(G, {2: 10, 1: 10}) + Hcg = nxcg.relabel_nodes(G, {2: 10, 1: 10}) + assert_graphs_equal(Hnx, Hcg) + + G = nx.path_graph(3, create_using=create_using) + Hnx = nx.relabel_nodes(G, {2: 0}) + Hcg = nxcg.relabel_nodes(G, {2: 0}) + assert_graphs_equal(Hnx, Hcg) + + +@pytest.mark.parametrize("create_using", [nx.MultiGraph, nx.MultiDiGraph]) +def test_relabel_multigraph(create_using): + G = nx.empty_graph(create_using=create_using) + G.add_edge(0, 1, "x", a=11) + G.add_edge(0, 2, "y", a=10, b=6) + G.add_edge(0, 0, c=7) + G.add_edge(0, 0, "x", a=-1, b=-1, c=-1) + Hnx = nx.relabel_nodes(G, {0: 1, 2: 1}) + Hcg = nxcg.relabel_nodes(G, {0: 1, 2: 1}) + assert_graphs_equal(Hnx, Hcg) + Hnx = nx.relabel_nodes(G, {2: 3, 1: 3, 0: 3}) + Hcg = nxcg.relabel_nodes(G, {2: 3, 1: 3, 0: 3}) + assert_graphs_equal(Hnx, Hcg) + + +def test_relabel_nx_input(): + G = nx.complete_graph(3) + with pytest.raises(RuntimeError, match="Using `copy=False` is invalid"): + nxcg.relabel_nodes(G, {0: 1}, copy=False) + Hnx = nx.relabel_nodes(G, {0: 1}, copy=True) + Hcg = nxcg.relabel_nodes(G, {0: 1}, copy=True) + assert_graphs_equal(Hnx, Hcg) diff --git a/python/nx-cugraph/nx_cugraph/tests/testing_utils.py b/python/nx-cugraph/nx_cugraph/tests/testing_utils.py index 6d4741c9c..529a96efd 100644 --- a/python/nx-cugraph/nx_cugraph/tests/testing_utils.py +++ b/python/nx-cugraph/nx_cugraph/tests/testing_utils.py @@ -18,10 +18,10 @@ def assert_graphs_equal(Gnx, Gcg): assert isinstance(Gnx, nx.Graph) assert isinstance(Gcg, nxcg.Graph) - assert Gnx.number_of_nodes() == Gcg.number_of_nodes() - assert Gnx.number_of_edges() == Gcg.number_of_edges() - assert Gnx.is_directed() == Gcg.is_directed() - assert Gnx.is_multigraph() == Gcg.is_multigraph() + assert (a := Gnx.number_of_nodes()) == (b := Gcg.number_of_nodes()), (a, b) + assert (a := Gnx.number_of_edges()) == (b := Gcg.number_of_edges()), (a, b) + assert (a := Gnx.is_directed()) == (b := Gcg.is_directed()), (a, b) + assert (a := Gnx.is_multigraph()) == (b := Gcg.is_multigraph()), (a, b) G = nxcg.to_networkx(Gcg) rv = nx.utils.graphs_equal(G, Gnx) if not rv: diff --git a/python/nx-cugraph/pyproject.toml b/python/nx-cugraph/pyproject.toml index 07e09201c..881e5aa4d 100644 --- a/python/nx-cugraph/pyproject.toml +++ b/python/nx-cugraph/pyproject.toml @@ -181,6 +181,7 @@ ignore = [ # "SIM300", # Yoda conditions are discouraged, use ... instead (Note: we're not this picky) # "SIM401", # Use dict.get ... instead of if-else-block (Note: if-else better for coverage and sometimes clearer) # "TRY004", # Prefer `TypeError` exception for invalid type (Note: good advice, but not worth the nuisance) + "B020", # Found for loop that reassigns the iterable it is iterating with each iterable value (too strict) "B904", # Bare `raise` inside exception clause (like TRY200; sometimes okay) "S310", # Audit URL open for permitted schemes (Note: we don't download URLs in normal usage) @@ -207,6 +208,7 @@ ignore = [ "RET502", # Do not implicitly `return None` in function able to return non-`None` value "RET503", # Missing explicit `return` at the end of function able to return non-`None` value "RET504", # Unnecessary variable assignment before `return` statement + "RUF018", # Avoid assignment expressions in `assert` statements "S110", # `try`-`except`-`pass` detected, consider logging the exception (Note: good advice, but we don't log) "S112", # `try`-`except`-`continue` detected, consider logging the exception (Note: good advice, but we don't log) "SIM102", # Use a single `if` statement instead of nested `if` statements (Note: often necessary) @@ -242,6 +244,7 @@ ignore = [ "nx_cugraph/algorithms/**/*py" = ["D205", "D401"] # Allow flexible docstrings for algorithms "nx_cugraph/generators/**/*py" = ["D205", "D401"] # Allow flexible docstrings for generators "nx_cugraph/interface.py" = ["D401"] # Flexible docstrings +"nx_cugraph/convert.py" = ["E721"] # Allow `dtype == object` "scripts/update_readme.py" = ["INP001"] # Not part of a package [tool.ruff.lint.flake8-annotations] From bfaf50cf6122a4aa39233d76f23e7576cdb06a5e Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 31 Jul 2024 07:21:43 +0200 Subject: [PATCH 378/384] nx-cugraph: add `G.__networkx_cache__` to enable graph conversion caching (#4567) Adding this now, because this was an oversight. By having a `G.__networkx_cache__` MutableMapping, we give NetworkX the ability to cache graph conversions. This will be most useful in dev and future versions of NetworkX. As such, it would be nice (but not strictly essential) to get this in 24.08. Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4567 --- python/nx-cugraph/nx_cugraph/classes/graph.py | 26 +++++++++++++++++++ .../nx_cugraph/classes/multigraph.py | 9 +++++++ 2 files changed, 35 insertions(+) diff --git a/python/nx-cugraph/nx_cugraph/classes/graph.py b/python/nx-cugraph/nx_cugraph/classes/graph.py index ad7cf3191..7425eacb2 100644 --- a/python/nx-cugraph/nx_cugraph/classes/graph.py +++ b/python/nx-cugraph/nx_cugraph/classes/graph.py @@ -50,6 +50,10 @@ class Graph: __networkx_backend__: ClassVar[str] = "cugraph" # nx >=3.2 __networkx_plugin__: ClassVar[str] = "cugraph" # nx <3.2 + # Allow networkx dispatch machinery to cache conversions. + # This means we should clear the cache if we ever mutate the object! + __networkx_cache__: dict | None + # networkx properties graph: dict graph_attr_dict_factory: ClassVar[type] = dict @@ -108,6 +112,7 @@ def from_coo( **attr, ) -> Graph: new_graph = object.__new__(cls) + new_graph.__networkx_cache__ = {} new_graph.src_indices = src_indices new_graph.dst_indices = dst_indices new_graph.edge_values = {} if edge_values is None else dict(edge_values) @@ -420,6 +425,8 @@ def clear(self) -> None: self._node_ids = None self.key_to_id = None self._id_to_key = None + if cache := self.__networkx_cache__: + cache.clear() @networkx_api def clear_edges(self) -> None: @@ -427,6 +434,8 @@ def clear_edges(self) -> None: self.edge_masks.clear() self.src_indices = cp.empty(0, self.src_indices.dtype) self.dst_indices = cp.empty(0, self.dst_indices.dtype) + if cache := self.__networkx_cache__: + cache.clear() @networkx_api def copy(self, as_view: bool = False) -> Graph: @@ -553,6 +562,12 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): node_masks = self.node_masks key_to_id = self.key_to_id id_to_key = None if key_to_id is None else self._id_to_key + if self.__networkx_cache__ is None: + __networkx_cache__ = None + elif not reverse and cls is self.__class__: + __networkx_cache__ = self.__networkx_cache__ + else: + __networkx_cache__ = {} if not as_view: src_indices = src_indices.copy() dst_indices = dst_indices.copy() @@ -564,6 +579,8 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): key_to_id = key_to_id.copy() if id_to_key is not None: id_to_key = id_to_key.copy() + if __networkx_cache__ is not None: + __networkx_cache__ = __networkx_cache__.copy() if reverse: src_indices, dst_indices = dst_indices, src_indices rv = cls.from_coo( @@ -581,6 +598,7 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): rv.graph = self.graph else: rv.graph.update(deepcopy(self.graph)) + rv.__networkx_cache__ = __networkx_cache__ return rv def _get_plc_graph( @@ -719,18 +737,26 @@ def _become(self, other: Graph): edge_masks = self.edge_masks node_values = self.node_values node_masks = self.node_masks + __networkx_cache__ = self.__networkx_cache__ graph = self.graph edge_values.update(other.edge_values) edge_masks.update(other.edge_masks) node_values.update(other.node_values) node_masks.update(other.node_masks) graph.update(other.graph) + if other.__networkx_cache__ is None: + __networkx_cache__ = None + else: + if __networkx_cache__ is None: + __networkx_cache__ = {} + __networkx_cache__.update(other.__networkx_cache__) self.__dict__.update(other.__dict__) self.edge_values = edge_values self.edge_masks = edge_masks self.node_values = node_values self.node_masks = node_masks self.graph = graph + self.__networkx_cache__ = __networkx_cache__ return self def _degrees_array(self, *, ignore_selfloops=False): diff --git a/python/nx-cugraph/nx_cugraph/classes/multigraph.py b/python/nx-cugraph/nx_cugraph/classes/multigraph.py index de58474de..23d9faa87 100644 --- a/python/nx-cugraph/nx_cugraph/classes/multigraph.py +++ b/python/nx-cugraph/nx_cugraph/classes/multigraph.py @@ -415,6 +415,12 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): key_to_id = self.key_to_id id_to_key = None if key_to_id is None else self._id_to_key edge_keys = self.edge_keys + if self.__networkx_cache__ is None: + __networkx_cache__ = None + elif not reverse and cls is self.__class__: + __networkx_cache__ = self.__networkx_cache__ + else: + __networkx_cache__ = {} if not as_view: src_indices = src_indices.copy() dst_indices = dst_indices.copy() @@ -429,6 +435,8 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): id_to_key = id_to_key.copy() if edge_keys is not None: edge_keys = edge_keys.copy() + if __networkx_cache__ is not None: + __networkx_cache__ = __networkx_cache__.copy() if reverse: src_indices, dst_indices = dst_indices, src_indices rv = cls.from_coo( @@ -448,6 +456,7 @@ def _copy(self, as_view: bool, cls: type[Graph], reverse: bool = False): rv.graph = self.graph else: rv.graph.update(deepcopy(self.graph)) + rv.__networkx_cache__ = __networkx_cache__ return rv def _sort_edge_indices(self, primary="src"): From 6c1d4ae2ece22d10c34b20a54a42e5d5959ab295 Mon Sep 17 00:00:00 2001 From: Erik Welch Date: Wed, 31 Jul 2024 17:33:18 +0200 Subject: [PATCH 379/384] nx-cugraph: check networkx version (#4571) This is to address the feedback from @bdice in https://github.com/rapidsai/cugraph/pull/4531#discussion_r1697414065, which I was unable to do in that PR. I know checking version strings is playing it fast-and-loose, but I believe we are abundantly safe to do so here, as networkx releases have been, and are expected to be, slow and predictable. Also, we do not have `packaging` as a runtime dependency (it _is_ a test dependency for finer control). So, even better than using `packaging.version.parse`, this PR performs a sanity check on the networkx version. I put it in both `nx_cugraph.__init__` and `_nx_cugraph.__init__` to give us obvious breadcrumbs to discover and follow. Authors: - Erik Welch (https://github.com/eriknw) Approvers: - Rick Ratzel (https://github.com/rlratzel) URL: https://github.com/rapidsai/cugraph/pull/4571 --- python/nx-cugraph/_nx_cugraph/__init__.py | 21 +++++++++++++++++++++ python/nx-cugraph/nx_cugraph/__init__.py | 3 +++ 2 files changed, 24 insertions(+) diff --git a/python/nx-cugraph/_nx_cugraph/__init__.py b/python/nx-cugraph/_nx_cugraph/__init__.py index d18fc53b8..f58a6e229 100644 --- a/python/nx-cugraph/_nx_cugraph/__init__.py +++ b/python/nx-cugraph/_nx_cugraph/__init__.py @@ -296,6 +296,27 @@ def get_info(): return d +def _check_networkx_version(): + import warnings + + import networkx as nx + + version_major, version_minor = nx.__version__.split(".")[:2] + if version_major != "3": + warnings.warn( + f"nx-cugraph version {__version__} is only known to work with networkx " + f"versions 3.x, but networkx {nx.__version__} is installed. " + "Perhaps try upgrading your Python environment.", + UserWarning, + stacklevel=2, + ) + if len(version_minor) > 1: + raise RuntimeWarning( + f"nx-cugraph version {__version__} does not work with networkx version " + f"{nx.__version__}. Please upgrade (or fix) your Python environment." + ) + + if __name__ == "__main__": from pathlib import Path diff --git a/python/nx-cugraph/nx_cugraph/__init__.py b/python/nx-cugraph/nx_cugraph/__init__.py index 7d6a2fbe4..542256fa7 100644 --- a/python/nx-cugraph/nx_cugraph/__init__.py +++ b/python/nx-cugraph/nx_cugraph/__init__.py @@ -33,3 +33,6 @@ from .algorithms import * from _nx_cugraph._version import __git_commit__, __version__ +from _nx_cugraph import _check_networkx_version + +_check_networkx_version() From 4d923738b55e2f6de7ce28e2f98bbb8ed079eef7 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 21 Aug 2024 09:26:51 -0700 Subject: [PATCH 380/384] Copied files while preserving history --- .github/CODEOWNERS | 23 +++++++++++ .github/copy-py-bot.yaml | 4 ++ .github/labeler.yml | 19 +++++++++ .github/ops-bot.yaml | 9 +++++ CHANGELOG.md | 0 lint.yaml | 87 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 142 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/copy-py-bot.yaml create mode 100644 .github/labeler.yml create mode 100644 .github/ops-bot.yaml create mode 100644 CHANGELOG.md create mode 100644 lint.yaml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..86c489c25 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,23 @@ +# https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners +# Order matters - match of highest importance goes last (last match wins) + + +# doc code owners +# + + +# python code owners +# example +# python/nx_cugraph @rapidsai/nx-cugraph-python-codeowners + + +# CI code owners +# /ci/ @rapidsai/ci-codeowners + + +# packaging code owners +# /conda/ @rapidsai/packaging-codeowners +# /dependencies.yaml @rapidsai/packaging-codeowners +# /build.sh @rapidsai/packaging-codeowners +# pyproject.toml @rapidsai/packaging-codeowners +# VERSION @rapidsai/packaging-codeowners diff --git a/.github/copy-py-bot.yaml b/.github/copy-py-bot.yaml new file mode 100644 index 000000000..895ba83ee --- /dev/null +++ b/.github/copy-py-bot.yaml @@ -0,0 +1,4 @@ +# Configuration file for `copy-pr-bot` GitHub App +# https://docs.gha-runners.nvidia.com/apps/copy-pr-bot/ + +enabled: true diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000..4a5b2174d --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,19 @@ +# https://github.com/actions/labeler#common-examples +# Adapted from https://github.com/rapidsai/cugraph/blob/main/.github/CODEOWNERS +# Labels culled from https://github.com/rapidsai/cugraph/labels + +python: + - 'python/**' + - 'notebooks/**' + +benchmarks: + - 'benchmarks/**' + +datasets: + - 'datasets/**' + +ci: + - 'ci/**' + +conda: + - 'conda/**' diff --git a/.github/ops-bot.yaml b/.github/ops-bot.yaml new file mode 100644 index 000000000..2ed5231ae --- /dev/null +++ b/.github/ops-bot.yaml @@ -0,0 +1,9 @@ +# This file controls which features from the `ops-bot` repository below are enabled. +# - https://github.com/rapidsai/ops-bot + +auto_merger: true +branch_checker: true +label_checker: true +release_drafter: true +recently_updated: true +forward_merger: true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..e69de29bb diff --git a/lint.yaml b/lint.yaml new file mode 100644 index 000000000..ce46360e2 --- /dev/null +++ b/lint.yaml @@ -0,0 +1,87 @@ +# 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.18 + 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.16.0 + hooks: + - id: pyupgrade + args: [--py39-plus] + - repo: https://github.com/psf/black + rev: 24.4.2 + hooks: + - id: black + # - id: black-jupyter + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.5.4 + hooks: + - id: ruff + args: [--fix-only, --show-fixes] # --unsafe-fixes] + - repo: https://github.com/PyCQA/flake8 + rev: 7.1.0 + 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.0 + - flake8-bugbear==24.4.26 + - 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.5.4 + 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 3f0112102eb4ae68ed75f6d903a4c8b25cbedf52 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Wed, 21 Aug 2024 09:27:34 -0700 Subject: [PATCH 381/384] Update README --- README.md | 275 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 274 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6710fd646..458421e2b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,276 @@ # nx-cugraph -This will eventually be the repository for nx-cugraph, but for now see the nx-cugraph subdirectory within the [cugraph repo](https://github.com/rapidsai/cugraph/tree/HEAD/python/nx-cugraph). +## Description +[RAPIDS](https://rapids.ai) nx-cugraph is a [backend to NetworkX](https://networkx.org/documentation/stable/reference/utils.html#backends) +to run supported algorithms with GPU acceleration. + +## System Requirements + +nx-cugraph requires the following: + * 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, or 12.0 + * Python version 3.9, 3.10, or 3.11 + * NetworkX >= version 3.0 (version 3.2 or higher recommended) + +More details about system requirements can be found in the [RAPIDS System Requirements documentation](https://docs.rapids.ai/install#system-req). + +## Installation + +nx-cugraph can be installed using either conda or pip. + +### conda +#### latest nightly version +``` +conda install -c rapidsai-nightly -c conda-forge -c nvidia nx-cugraph +``` +#### latest stable version +``` +conda install -c rapidsai -c conda-forge -c nvidia nx-cugraph +``` +### pip +#### latest nightly version +``` +python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.anaconda.org/rapidsai-wheels-nightly/simple +``` +#### latest stable version +``` +python -m pip install nx-cugraph-cu11 --extra-index-url https://pypi.nvidia.com +``` +Notes: + * The pip example above installs for CUDA 11. To install for CUDA 12, replace `-cu11` with `-cu12` + * Additional information relevant to installing any RAPIDS package can be found [here](https://rapids.ai/#quick-start). + +## Enabling nx-cugraph + +NetworkX will use nx-cugraph as the graph analytics backend if any of the +following are used: + +### `NETWORKX_AUTOMATIC_BACKENDS` environment variable. +The `NETWORKX_AUTOMATIC_BACKENDS` environment variable can be used to have NetworkX automatically dispatch to specified backends an API is called that the backend supports. +Set `NETWORKX_AUTOMATIC_BACKENDS=cugraph` to use nx-cugraph to GPU accelerate supported APIs with no code changes. +Example: +``` +bash> NETWORKX_AUTOMATIC_BACKENDS=cugraph python my_networkx_script.py +``` + +### `backend=` keyword argument +To explicitly specify a particular backend for an API, use the `backend=` +keyword argument. This argument takes precedence over the +`NETWORKX_AUTOMATIC_BACKENDS` environment variable. This requires anyone +running code that uses the `backend=` keyword argument to have the specified +backend installed. + +Example: +``` +nx.betweenness_centrality(cit_patents_graph, k=k, backend="cugraph") +``` + +### Type-based dispatching + +NetworkX also supports automatically dispatching to backends associated with +specific graph types. Like the `backend=` keyword argument example above, this +requires the user to write code for a specific backend, and therefore requires +the backend to be installed, but has the advantage of ensuring a particular +behavior without the potential for runtime conversions. + +To use type-based dispatching with nx-cugraph, the user must import the backend +directly in their code to access the utilities provided to create a Graph +instance specifically for the nx-cugraph backend. + +Example: +``` +import networkx as nx +import nx_cugraph as nxcg + +G = nx.Graph() +... +nxcg_G = nxcg.from_networkx(G) # conversion happens once here +nx.betweenness_centrality(nxcg_G, k=1000) # nxcg Graph type causes cugraph backend + # to be used, no conversion necessary +``` + +## Supported Algorithms + +The nx-cugraph backend to NetworkX connects +[pylibcugraph](../../readme_pages/pylibcugraph.md) (cuGraph's low-level python +interface to its CUDA-based graph analytics library) and +[CuPy](https://cupy.dev/) (a GPU-accelerated array library) to NetworkX's +familiar and easy-to-use API. + +Below is the list of algorithms that are currently supported in nx-cugraph. + +### [Algorithms](https://networkx.org/documentation/latest/reference/algorithms/index.html) + +
+bipartite
+ └─ generators
+     └─ complete_bipartite_graph
+centrality
+ ├─ betweenness
+ │   ├─ betweenness_centrality
+ │   └─ edge_betweenness_centrality
+ ├─ degree_alg
+ │   ├─ degree_centrality
+ │   ├─ in_degree_centrality
+ │   └─ out_degree_centrality
+ ├─ eigenvector
+ │   └─ eigenvector_centrality
+ └─ katz
+     └─ katz_centrality
+cluster
+ ├─ average_clustering
+ ├─ clustering
+ ├─ transitivity
+ └─ triangles
+community
+ └─ louvain
+     └─ louvain_communities
+components
+ ├─ connected
+ │   ├─ connected_components
+ │   ├─ is_connected
+ │   ├─ node_connected_component
+ │   └─ number_connected_components
+ └─ weakly_connected
+     ├─ is_weakly_connected
+     ├─ number_weakly_connected_components
+     └─ weakly_connected_components
+core
+ ├─ core_number
+ └─ k_truss
+dag
+ ├─ ancestors
+ └─ descendants
+isolate
+ ├─ is_isolate
+ ├─ isolates
+ └─ number_of_isolates
+link_analysis
+ ├─ hits_alg
+ │   └─ hits
+ └─ pagerank_alg
+     └─ pagerank
+operators
+ └─ unary
+     ├─ complement
+     └─ reverse
+reciprocity
+ ├─ overall_reciprocity
+ └─ reciprocity
+shortest_paths
+ ├─ generic
+ │   ├─ has_path
+ │   ├─ shortest_path
+ │   └─ shortest_path_length
+ ├─ unweighted
+ │   ├─ all_pairs_shortest_path
+ │   ├─ all_pairs_shortest_path_length
+ │   ├─ bidirectional_shortest_path
+ │   ├─ single_source_shortest_path
+ │   ├─ single_source_shortest_path_length
+ │   ├─ single_target_shortest_path
+ │   └─ single_target_shortest_path_length
+ └─ weighted
+     ├─ all_pairs_bellman_ford_path
+     ├─ all_pairs_bellman_ford_path_length
+     ├─ all_pairs_dijkstra
+     ├─ all_pairs_dijkstra_path
+     ├─ all_pairs_dijkstra_path_length
+     ├─ bellman_ford_path
+     ├─ bellman_ford_path_length
+     ├─ dijkstra_path
+     ├─ dijkstra_path_length
+     ├─ single_source_bellman_ford
+     ├─ single_source_bellman_ford_path
+     ├─ single_source_bellman_ford_path_length
+     ├─ single_source_dijkstra
+     ├─ single_source_dijkstra_path
+     └─ single_source_dijkstra_path_length
+traversal
+ └─ breadth_first_search
+     ├─ bfs_edges
+     ├─ bfs_layers
+     ├─ bfs_predecessors
+     ├─ bfs_successors
+     ├─ bfs_tree
+     ├─ descendants_at_distance
+     └─ generic_bfs_edges
+tree
+ └─ recognition
+     ├─ is_arborescence
+     ├─ is_branching
+     ├─ is_forest
+     └─ is_tree
+
+ +### [Generators](https://networkx.org/documentation/latest/reference/generators.html) + +
+classic
+ ├─ barbell_graph
+ ├─ circular_ladder_graph
+ ├─ complete_graph
+ ├─ complete_multipartite_graph
+ ├─ cycle_graph
+ ├─ empty_graph
+ ├─ ladder_graph
+ ├─ lollipop_graph
+ ├─ null_graph
+ ├─ path_graph
+ ├─ star_graph
+ ├─ tadpole_graph
+ ├─ trivial_graph
+ ├─ turan_graph
+ └─ wheel_graph
+community
+ └─ caveman_graph
+ego
+ └─ ego_graph
+small
+ ├─ bull_graph
+ ├─ chvatal_graph
+ ├─ cubical_graph
+ ├─ desargues_graph
+ ├─ diamond_graph
+ ├─ dodecahedral_graph
+ ├─ frucht_graph
+ ├─ heawood_graph
+ ├─ house_graph
+ ├─ house_x_graph
+ ├─ icosahedral_graph
+ ├─ krackhardt_kite_graph
+ ├─ moebius_kantor_graph
+ ├─ octahedral_graph
+ ├─ pappus_graph
+ ├─ petersen_graph
+ ├─ sedgewick_maze_graph
+ ├─ tetrahedral_graph
+ ├─ truncated_cube_graph
+ ├─ truncated_tetrahedron_graph
+ └─ tutte_graph
+social
+ ├─ davis_southern_women_graph
+ ├─ florentine_families_graph
+ ├─ karate_club_graph
+ └─ les_miserables_graph
+
+ +### Other + +
+classes
+ └─ function
+     └─ is_negatively_weighted
+convert
+ ├─ from_dict_of_lists
+ └─ to_dict_of_lists
+convert_matrix
+ ├─ from_pandas_edgelist
+ └─ from_scipy_sparse_array
+relabel
+ ├─ convert_node_labels_to_integers
+ └─ relabel_nodes
+
+ +To request nx-cugraph backend support for a NetworkX API that is not listed +above, visit the [cuGraph GitHub repo](https://github.com/rapidsai/cugraph). From 055ceb30ddf3000b9a42dc4d21df176529b3e98a Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Tue, 10 Sep 2024 17:39:23 -0700 Subject: [PATCH 382/384] Remove unnecessary files --- .../api_docs/cugraph-dgl/cugraph_dgl.rst | 15 -- .../api_docs/cugraph-ops/c_cpp/index.rst | 2 - .../source/api_docs/cugraph-ops/index.rst | 11 - .../api_docs/cugraph-ops/python/dimenet.rst | 24 -- .../cugraph-ops/python/graph_types.rst | 34 --- .../api_docs/cugraph-ops/python/index.rst | 13 - .../api_docs/cugraph-ops/python/operators.rst | 109 --------- .../api_docs/cugraph-ops/python/pytorch.rst | 36 --- .../api_docs/cugraph-pyg/cugraph_pyg.rst | 43 ---- .../source/api_docs/cugraph/centrality.rst | 71 ------ .../source/api_docs/cugraph/community.rst | 80 ------ .../source/api_docs/cugraph/components.rst | 22 -- .../cugraph/source/api_docs/cugraph/cores.rst | 21 -- .../source/api_docs/cugraph/dask-cugraph.rst | 78 ------ .../source/api_docs/cugraph/generators.rst | 13 - .../api_docs/cugraph/graph_implementation.rst | 34 --- .../api_docs/cugraph/helper_functions.rst | 22 -- .../cugraph/source/api_docs/cugraph/index.rst | 25 -- .../source/api_docs/cugraph/layout.rst | 12 - .../api_docs/cugraph/linear_assignment.rst | 13 - .../source/api_docs/cugraph/link_analysis.rst | 34 --- .../api_docs/cugraph/link_prediction.rst | 31 --- .../api_docs/cugraph/property_graph.rst | 29 --- .../source/api_docs/cugraph/sampling.rst | 22 -- .../source/api_docs/cugraph/structure.rst | 99 -------- .../source/api_docs/cugraph/traversal.rst | 37 --- docs/cugraph/source/api_docs/cugraph/tree.rst | 20 -- .../source/api_docs/cugraph_c/centrality.rst | 50 ---- .../source/api_docs/cugraph_c/community.rst | 56 ----- .../source/api_docs/cugraph_c/core.rst | 21 -- .../source/api_docs/cugraph_c/index.rst | 16 -- .../source/api_docs/cugraph_c/labeling.rst | 20 -- .../source/api_docs/cugraph_c/sampling.rst | 34 --- .../source/api_docs/cugraph_c/similarity.rst | 25 -- .../source/api_docs/cugraph_c/traversal.rst | 30 --- .../source/api_docs/plc/pylibcugraph.rst | 22 -- .../service/cugraph_service_client.rst | 20 -- .../service/cugraph_service_server.rst | 14 -- .../cugraph/source/api_docs/service/index.rst | 10 - .../source/api_docs/wholegraph/index.rst | 11 - .../wholegraph/libwholegraph/index.rst | 228 ------------------ .../wholegraph/pylibwholegraph/index.rst | 38 --- .../source/wholegraph/basics/index.rst | 11 - .../wholegraph/basics/wholegraph_intro.md | 135 ----------- .../wholememory_implementation_details.md | 58 ----- .../wholegraph/basics/wholememory_intro.md | 123 ---------- .../imgs/device_chunked_wholememory_step1.png | Bin 23136 -> 0 bytes .../imgs/device_chunked_wholememory_step2.png | Bin 28201 -> 0 bytes .../device_continuous_wholememory_step1.png | Bin 21107 -> 0 bytes .../device_continuous_wholememory_step2.png | Bin 26434 -> 0 bytes .../imgs/distributed_wholememory.png | Bin 23138 -> 0 bytes .../wholegraph/imgs/general_wholememory.png | Bin 14073 -> 0 bytes .../imgs/host_mapped_wholememory_step1.png | Bin 21733 -> 0 bytes .../imgs/host_mapped_wholememory_step2.png | Bin 32110 -> 0 bytes .../wholegraph/imgs/wholememory_tensor.png | Bin 40367 -> 0 bytes docs/cugraph/source/wholegraph/index.rst | 13 - .../wholegraph/installation/container.md | 29 --- .../installation/getting_wholegraph.md | 48 ---- .../source/wholegraph/installation/index.rst | 9 - .../wholegraph/installation/source_build.md | 187 -------------- docs/{cugraph => nx-cugraph}/Makefile | 0 docs/{cugraph => nx-cugraph}/README.md | 0 docs/{cugraph => nx-cugraph}/make.bat | 0 .../source/_static/EMPTY | 0 .../source/_static/references.css | 0 .../source/api_docs/index.rst | 0 .../source/basics/cugraph_cascading.md | 0 .../source/basics/cugraph_intro.md | 0 .../source/basics/index.rst | 0 .../source/basics/nx_transition.rst | 0 docs/{cugraph => nx-cugraph}/source/conf.py | 0 .../source/dev_resources/API.rst | 0 .../source/dev_resources/index.rst | 0 .../source/graph_support/DGL_support.md | 0 .../source/graph_support/PyG_support.md | 0 .../source/graph_support/algorithms.md | 0 .../graph_support/algorithms/Centrality.md | 0 .../graph_support/algorithms/Similarity.md | 0 .../algorithms/betweenness_centrality.md | 0 .../cpp_algorithms/centrality_cpp.md | 0 .../algorithms/cpp_algorithms/linear_cpp.md | 0 .../cpp_algorithms/traversal_cpp.md | 0 .../algorithms/degree_centrality.md | 0 .../algorithms/eigenvector_centrality.md | 0 .../algorithms/jaccard_similarity.md | 0 .../algorithms/katz_centrality.md | 0 .../algorithms/overlap_similarity.md | 0 .../algorithms/sorensen_coefficient.md | 0 .../source/graph_support/compatibility.rst | 0 .../source/graph_support/cugraph_service.rst | 0 .../graph_support/cugraphops_support.rst | 0 .../source/graph_support/datastores.rst | 0 .../source/graph_support/feature_stores.md | 0 .../source/graph_support/gnn_support.rst | 0 .../source/graph_support/graph_algorithms.rst | 0 .../source/graph_support/index.rst | 0 .../source/graph_support/knowledge_stores.md | 0 .../source/graph_support/pg_example.png | Bin .../source/graph_support/property_graph.md | 0 .../graph_support/wholegraph_support.md | 0 .../source/images/Nx_Cg_1.png | Bin .../source/images/Nx_Cg_2.png | Bin .../source/images/Stack2.png | Bin .../source/images/ancestors.png | Bin .../source/images/bfs_tree.png | Bin .../source/images/conn_component.png | Bin .../source/images/cugraph_logo_2.png | Bin .../source/images/descendents.png | Bin .../source/images/k_truss.png | Bin .../source/images/katz.png | Bin .../source/images/pagerank.png | Bin .../source/images/pg_example.png | Bin .../source/images/sssp.png | Bin .../source/images/wcc.png | Bin .../images/zachary_graph_centrality.png | Bin docs/{cugraph => nx-cugraph}/source/index.rst | 0 .../source/installation/getting_cugraph.md | 0 .../source/installation/index.rst | 0 .../source/installation/source_build.md | 0 .../source/nx_cugraph/index.rst | 0 .../source/nx_cugraph/nx_cugraph.md | 0 .../source/references/cugraph_ref.md | 0 .../source/references/datasets.md | 0 .../source/references/index.rst | 0 .../source/references/licenses.md | 0 .../source/releases/index.rst | 0 .../source/sphinxext/github_link.py | 0 .../source/tutorials/basic_cugraph.md | 0 .../source/tutorials/community_resources.md | 0 .../source/tutorials/cugraph_blogs.rst | 0 .../source/tutorials/cugraph_notebooks.md | 0 .../source/tutorials/how_to_guides.md | 0 .../source/tutorials/index.rst | 0 133 files changed, 2158 deletions(-) delete mode 100644 docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/centrality.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/community.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/components.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/cores.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/generators.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/graph_implementation.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/helper_functions.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/layout.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/linear_assignment.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/link_analysis.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/link_prediction.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/property_graph.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/sampling.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/structure.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/traversal.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph/tree.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/centrality.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/community.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/core.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/index.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/labeling.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/sampling.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/similarity.rst delete mode 100644 docs/cugraph/source/api_docs/cugraph_c/traversal.rst delete mode 100644 docs/cugraph/source/api_docs/plc/pylibcugraph.rst delete mode 100644 docs/cugraph/source/api_docs/service/cugraph_service_client.rst delete mode 100644 docs/cugraph/source/api_docs/service/cugraph_service_server.rst delete mode 100644 docs/cugraph/source/api_docs/service/index.rst delete mode 100644 docs/cugraph/source/api_docs/wholegraph/index.rst delete mode 100644 docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst delete mode 100644 docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst delete mode 100644 docs/cugraph/source/wholegraph/basics/index.rst delete mode 100644 docs/cugraph/source/wholegraph/basics/wholegraph_intro.md delete mode 100644 docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md delete mode 100644 docs/cugraph/source/wholegraph/basics/wholememory_intro.md delete mode 100644 docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step1.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/general_wholememory.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step1.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png delete mode 100644 docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png delete mode 100644 docs/cugraph/source/wholegraph/index.rst delete mode 100644 docs/cugraph/source/wholegraph/installation/container.md delete mode 100644 docs/cugraph/source/wholegraph/installation/getting_wholegraph.md delete mode 100644 docs/cugraph/source/wholegraph/installation/index.rst delete mode 100644 docs/cugraph/source/wholegraph/installation/source_build.md rename docs/{cugraph => nx-cugraph}/Makefile (100%) rename docs/{cugraph => nx-cugraph}/README.md (100%) rename docs/{cugraph => nx-cugraph}/make.bat (100%) rename docs/{cugraph => nx-cugraph}/source/_static/EMPTY (100%) rename docs/{cugraph => nx-cugraph}/source/_static/references.css (100%) rename docs/{cugraph => nx-cugraph}/source/api_docs/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/basics/cugraph_cascading.md (100%) rename docs/{cugraph => nx-cugraph}/source/basics/cugraph_intro.md (100%) rename docs/{cugraph => nx-cugraph}/source/basics/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/basics/nx_transition.rst (100%) rename docs/{cugraph => nx-cugraph}/source/conf.py (100%) rename docs/{cugraph => nx-cugraph}/source/dev_resources/API.rst (100%) rename docs/{cugraph => nx-cugraph}/source/dev_resources/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/DGL_support.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/PyG_support.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/Centrality.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/Similarity.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/betweenness_centrality.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/degree_centrality.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/eigenvector_centrality.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/jaccard_similarity.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/katz_centrality.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/overlap_similarity.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/algorithms/sorensen_coefficient.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/compatibility.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/cugraph_service.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/cugraphops_support.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/datastores.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/feature_stores.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/gnn_support.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/graph_algorithms.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/knowledge_stores.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/pg_example.png (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/property_graph.md (100%) rename docs/{cugraph => nx-cugraph}/source/graph_support/wholegraph_support.md (100%) rename docs/{cugraph => nx-cugraph}/source/images/Nx_Cg_1.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/Nx_Cg_2.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/Stack2.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/ancestors.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/bfs_tree.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/conn_component.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/cugraph_logo_2.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/descendents.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/k_truss.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/katz.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/pagerank.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/pg_example.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/sssp.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/wcc.png (100%) rename docs/{cugraph => nx-cugraph}/source/images/zachary_graph_centrality.png (100%) rename docs/{cugraph => nx-cugraph}/source/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/installation/getting_cugraph.md (100%) rename docs/{cugraph => nx-cugraph}/source/installation/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/installation/source_build.md (100%) rename docs/{cugraph => nx-cugraph}/source/nx_cugraph/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/nx_cugraph/nx_cugraph.md (100%) rename docs/{cugraph => nx-cugraph}/source/references/cugraph_ref.md (100%) rename docs/{cugraph => nx-cugraph}/source/references/datasets.md (100%) rename docs/{cugraph => nx-cugraph}/source/references/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/references/licenses.md (100%) rename docs/{cugraph => nx-cugraph}/source/releases/index.rst (100%) rename docs/{cugraph => nx-cugraph}/source/sphinxext/github_link.py (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/basic_cugraph.md (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/community_resources.md (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/cugraph_blogs.rst (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/cugraph_notebooks.md (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/how_to_guides.md (100%) rename docs/{cugraph => nx-cugraph}/source/tutorials/index.rst (100%) diff --git a/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst deleted file mode 100644 index 4ffecd8d0..000000000 --- a/docs/cugraph/source/api_docs/cugraph-dgl/cugraph_dgl.rst +++ /dev/null @@ -1,15 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-dgl API Reference -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -cugraph-dgl - -.. currentmodule:: cugraph_dgl - -Methods -------- -.. autosummary:: - :toctree: ../api/cugraph-dgl/ - - convert.cugraph_storage_from_heterograph - cugraph_storage.CuGraphStorage diff --git a/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst deleted file mode 100644 index 39dae955e..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/c_cpp/index.rst +++ /dev/null @@ -1,2 +0,0 @@ -cugraph-ops C++ API Reference -============================= diff --git a/docs/cugraph/source/api_docs/cugraph-ops/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/index.rst deleted file mode 100644 index 0f6a6c937..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -cugraph-ops API reference -========================= - -This page provides a list of all publicly accessible modules, methods and classes through `pylibcugraphops.*` namespace. - -.. toctree:: - :maxdepth: 2 - :caption: API Documentation - - python/index - c_cpp/index diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst deleted file mode 100644 index 6fadcc57b..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/dimenet.rst +++ /dev/null @@ -1,24 +0,0 @@ -================= -Dimenet operators -================= - -.. currentmodule:: pylibcugraphops - -Radial Basis Functions ----------------------- -.. autosummary:: - :toctree: ../../api/ops - - dimenet.radial_basis_fwd - dimenet.radial_basis_bwd - dimenet.radial_basis_bwd_bwd - -Edge-to-Edge Aggregation -------------------------- -.. autosummary:: - :toctree: ../../api/ops - - dimenet.agg_edge_to_edge_fwd - dimenet.agg_edge_to_edge_bwd - dimenet.agg_edge_to_edge_bwd2_grad - dimenet.agg_edge_to_edge_bwd2_main diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst deleted file mode 100644 index 141d40393..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/graph_types.rst +++ /dev/null @@ -1,34 +0,0 @@ -=========== -Graph types -=========== - -.. currentmodule:: pylibcugraphops - - -CSC Graph ------------------ -.. autosummary:: - :toctree: ../../api/ops - - make_csc - -Heterogenous CSC Graph ----------------------- -.. autosummary:: - :toctree: ../../api/ops - - make_csc_hg - -Bipartite Graph ------------------ -.. autosummary:: - :toctree: ../../api/ops - - make_bipartite_csc - -Heterogenous Bipartite Graph ----------------------------- -.. autosummary:: - :toctree: ../../api/ops - - make_bipartite_csc_hg diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst deleted file mode 100644 index fb25f2fa0..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -cugraph-ops Python API reference -================================ - -This page provides a list of all publicly accessible modules, methods and classes through `pylibcugraphops.*` namespace. - -.. toctree:: - :maxdepth: 2 - :caption: API Documentation - - graph_types - operators - dimenet - pytorch diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst deleted file mode 100644 index 8b5efd7aa..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/operators.rst +++ /dev/null @@ -1,109 +0,0 @@ -============================= -Operators for Message-Passing -============================= - -.. currentmodule:: pylibcugraphops - -Simple Neighborhood Aggregator (SAGEConv) ------------------------------------------ -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_simple_n2n_fwd - operators.agg_simple_n2n_bwd - operators.agg_simple_e2n_fwd - operators.agg_simple_e2n_bwd - operators.agg_simple_n2n_e2n_fwd - operators.agg_simple_n2n_e2n_bwd - - operators.agg_concat_n2n_fwd - operators.agg_concat_n2n_bwd - operators.agg_concat_e2n_fwd - operators.agg_concat_e2n_bwd - operators.agg_concat_n2n_e2n_fwd - operators.agg_concat_n2n_e2n_bwd - - -Weighted Neighborhood Aggregation ---------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_weighted_n2n_fwd - operators.agg_weighted_n2n_bwd - operators.agg_concat_weighted_n2n_fwd - operators.agg_concat_weighted_n2n_bwd - -Heterogenous Aggregator using Basis Decomposition (RGCNConv) ------------------------------------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_hg_basis_n2n_post_fwd - operators.agg_hg_basis_n2n_post_bwd - -Graph Attention (GATConv/GATv2Conv) ------------------------------------ -.. autosummary:: - :toctree: ../../api/ops - - operators.mha_gat_n2n_fwd_bf16_fp32 - operators.mha_gat_n2n_fwd_fp16_fp32 - operators.mha_gat_n2n_fwd_fp32_fp32 - operators.mha_gat_n2n_bwd_bf16_bf16_bf16_fp32 - operators.mha_gat_n2n_bwd_bf16_bf16_fp32_fp32 - operators.mha_gat_n2n_bwd_bf16_fp32_fp32_fp32 - operators.mha_gat_n2n_bwd_fp16_fp16_fp16_fp32 - operators.mha_gat_n2n_bwd_fp16_fp16_fp32_fp32 - operators.mha_gat_n2n_bwd_fp16_fp32_fp32_fp32 - operators.mha_gat_n2n_bwd_fp32_fp32_fp32_fp32 - operators.mha_gat_n2n_efeat_fwd_bf16_fp32 - operators.mha_gat_n2n_efeat_fwd_fp16_fp32 - operators.mha_gat_n2n_efeat_fwd_fp32_fp32 - operators.mha_gat_n2n_efeat_bwd_bf16_bf16_bf16_fp32 - operators.mha_gat_n2n_efeat_bwd_bf16_bf16_fp32_fp32 - operators.mha_gat_n2n_efeat_bwd_bf16_fp32_fp32_fp32 - operators.mha_gat_n2n_efeat_bwd_fp16_fp16_fp16_fp32 - operators.mha_gat_n2n_efeat_bwd_fp16_fp16_fp32_fp32 - operators.mha_gat_n2n_efeat_bwd_fp16_fp32_fp32_fp32 - operators.mha_gat_n2n_efeat_bwd_fp32_fp32_fp32_fp32 - - operators.mha_gat_v2_n2n_fwd - operators.mha_gat_v2_n2n_bwd - operators.mha_gat_v2_n2n_efeat_fwd - operators.mha_gat_v2_n2n_efeat_bwd - -Transformer-like Graph Attention (TransformerConv) --------------------------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.mha_gat_v2_n2n_fwd - operators.mha_gat_v2_n2n_bwd - operators.mha_gat_v2_n2n_efeat_fwd - operators.mha_gat_v2_n2n_efeat_bwd - -Directional Message-Passing (DMPNN) ------------------------------------ -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_dmpnn_e2e_fwd - operators.agg_dmpnn_e2e_bwd - -Update Edges: Concatenation or Sum of Edge and Node Features ------------------------------------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.update_efeat_e2e_concat_fwd - operators.update_efeat_e2e_concat_bwd - - operators.update_efeat_e2e_sum_fwd - operators.update_efeat_e2e_sum_bwd - - operators.update_efeat_e2e_concat_fwd - operators.update_efeat_e2e_concat_bwd - - operators.update_efeat_e2e_sum_fwd - operators.update_efeat_e2e_sum_bwd diff --git a/docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst b/docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst deleted file mode 100644 index d2074df15..000000000 --- a/docs/cugraph/source/api_docs/cugraph-ops/python/pytorch.rst +++ /dev/null @@ -1,36 +0,0 @@ -========================== -PyTorch Autograd Wrappers -========================== - -.. currentmodule:: pylibcugraphops.pytorch - -Simple Neighborhood Aggregator (SAGEConv) ------------------------------------------ -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_concat_n2n - -Graph Attention (GATConv/GATv2Conv) ------------------------------------ -.. autosummary:: - :toctree: ../../api/ops - - operators.mha_gat_n2n - operators.mha_gat_v2_n2n - -Heterogenous Aggregator using Basis Decomposition (RGCNConv) ------------------------------------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.agg_hg_basis_n2n_post - - -Update Edges: Concatenation or Sum of Edge and Node Features ------------------------------------------------------------- -.. autosummary:: - :toctree: ../../api/ops - - operators.update_efeat_e2e - operators.update_efeat_e2e diff --git a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst deleted file mode 100644 index d2b1d124c..000000000 --- a/docs/cugraph/source/api_docs/cugraph-pyg/cugraph_pyg.rst +++ /dev/null @@ -1,43 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-pyg API Reference -~~~~~~~~~~~~~~~~~~~~~~~~~ - -cugraph-pyg - -.. currentmodule:: cugraph_pyg - -Graph Storage -------------- -.. autosummary:: - :toctree: ../api/cugraph-pyg/ - - cugraph_pyg.data.dask_graph_store.DaskGraphStore - cugraph_pyg.data.graph_store.GraphStore - -Feature Storage ---------------- -.. autosummary:: - :toctree: ../api/cugraph-pyg/ - - cugraph_pyg.data.feature_store.TensorDictFeatureStore - cugraph_pyg.data.feature_store.WholeFeatureStore - -Data Loaders ------------- -.. autosummary:: - :toctree: ../api/cugraph-pyg/ - - cugraph_pyg.loader.dask_node_loader.DaskNeighborLoader - cugraph_pyg.loader.dask_node_loader.BulkSampleLoader - cugraph_pyg.loader.node_loader.NodeLoader - cugraph_pyg.loader.neighbor_loader.NeighborLoader - -Samplers --------- -.. autosummary:: - :toctree: ../api/cugraph-pyg/ - - cugraph_pyg.sampler.sampler.BaseSampler - cugraph_pyg.sampler.sampler.SampleReader - cugraph_pyg.sampler.sampler.HomogeneousSampleReader - cugraph_pyg.sampler.sampler.SampleIterator diff --git a/docs/cugraph/source/api_docs/cugraph/centrality.rst b/docs/cugraph/source/api_docs/cugraph/centrality.rst deleted file mode 100644 index 344c95195..000000000 --- a/docs/cugraph/source/api_docs/cugraph/centrality.rst +++ /dev/null @@ -1,71 +0,0 @@ -========== -Centrality -========== -.. currentmodule:: cugraph - - - -Betweenness Centrality ----------------------- -single-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.centrality.betweenness_centrality - cugraph.centrality.edge_betweenness_centrality - -multi-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.centrality.betweenness_centrality - - - -Katz Centrality ---------------- -single-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.centrality.katz_centrality - -multi-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.centrality.katz_centrality.katz_centrality - - -Degree Centrality ------------------ -single-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.centrality.degree_centrality - -multi-GPU -^^^^^^^^^^ - - -Eigenvector Centrality ----------------------- -single-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.centrality.eigenvector_centrality - -multi-GPU -^^^^^^^^^^ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.centrality.eigenvector_centrality.eigenvector_centrality diff --git a/docs/cugraph/source/api_docs/cugraph/community.rst b/docs/cugraph/source/api_docs/cugraph/community.rst deleted file mode 100644 index acbaa086f..000000000 --- a/docs/cugraph/source/api_docs/cugraph/community.rst +++ /dev/null @@ -1,80 +0,0 @@ -========= -Community -========= -.. currentmodule:: cugraph - - - -EgoNet ------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.batched_ego_graphs - cugraph.ego_graph - -Ensemble clustering for graphs (ECG) ------------------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.ecg - - -K-Truss -------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.k_truss - cugraph.ktruss_subgraph - -Leiden ------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.leiden - - -Louvain -------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.louvain - - -Louvain (MG) ------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.community.louvain.louvain - -Spectral Clustering -------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.analyzeClustering_edge_cut - cugraph.analyzeClustering_modularity - cugraph.analyzeClustering_ratio_cut - cugraph.spectralBalancedCutClustering - cugraph.spectralModularityMaximizationClustering - - -Subgraph Extraction -------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.subgraph - - -Triangle Counting ------------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.triangle_count diff --git a/docs/cugraph/source/api_docs/cugraph/components.rst b/docs/cugraph/source/api_docs/cugraph/components.rst deleted file mode 100644 index e61291fcc..000000000 --- a/docs/cugraph/source/api_docs/cugraph/components.rst +++ /dev/null @@ -1,22 +0,0 @@ -========== -Components -========== -.. currentmodule:: cugraph - - -Connected Components --------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.connected_components - cugraph.strongly_connected_components - cugraph.weakly_connected_components - - -Connected Components (MG) -------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.components.connectivity.weakly_connected_components diff --git a/docs/cugraph/source/api_docs/cugraph/cores.rst b/docs/cugraph/source/api_docs/cugraph/cores.rst deleted file mode 100644 index 9d274d1c4..000000000 --- a/docs/cugraph/source/api_docs/cugraph/cores.rst +++ /dev/null @@ -1,21 +0,0 @@ -===== -Cores -===== -.. currentmodule:: cugraph - - - -Core Number ------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.core_number - - -K-Core ------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.k_core diff --git a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst b/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst deleted file mode 100644 index f5132dd65..000000000 --- a/docs/cugraph/source/api_docs/cugraph/dask-cugraph.rst +++ /dev/null @@ -1,78 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~ -Multi-GPU with cuGraph -~~~~~~~~~~~~~~~~~~~~~~ - -cuGraph supports multi-GPU leveraging `Dask `_. Dask is a flexible library for parallel computing in Python which makes scaling out your workflow smooth and simple. cuGraph also uses other Dask-based RAPIDS projects such as `dask-cuda `_. - -Distributed graph analytics -=========================== - -The current solution is able to scale across multiple GPUs on multiple machines. Distributing the graph and computation lets you analyze datasets far larger than a single GPU’s memory. - -With cuGraph and Dask, whether you’re using a single NVIDIA GPU or multiple nodes, your RAPIDS workflow will run smoothly, intelligently distributing the workload across the available resources. - -If your graph comfortably fits in memory on a single GPU, you would want to use the single-GPU version of cuGraph. If you want to distribute your workflow across multiple GPUs and have more data than you can fit in memory on a single GPU, you would want to use cuGraph's multi-GPU features. - -Example -======== - -.. code-block:: python - - import dask_cudf - from dask.distributed import Client - from dask_cuda import LocalCUDACluster - - import cugraph - import cugraph.dask as dask_cugraph - import cugraph.dask.comms.comms as Comms - from cugraph.generators.rmat import rmat - - input_data_path = "input_data.csv" - - # cluster initialization - cluster = LocalCUDACluster() - client = Client(cluster) - Comms.initialize(p2p=True) - - # helper function to generate random input data - input_data = rmat( - scale=5, - num_edges=400, - a=0.30, - b=0.65, - c=0.05, - seed=456, - clip_and_flip=False, - scramble_vertex_ids=False, - create_using=None, - ) - input_data.to_csv(input_data_path, index=False) - - # helper function to set the reader chunk size to automatically get one partition per GPU - chunksize = dask_cugraph.get_chunksize(input_data_path) - - # multi-GPU CSV reader - e_list = dask_cudf.read_csv( - input_data_path, - blocksize=chunksize, - names=['src', 'dst'], - dtype=['int32', 'int32'], - ) - - # create graph from input data - G = cugraph.Graph(directed=True) - G.from_dask_cudf_edgelist(e_list, source='src', destination='dst') - - # run PageRank - pr_df = dask_cugraph.pagerank(G, tol=1e-4) - - # need to call compute to generate results - pr_df.compute() - - # cluster clean up - Comms.destroy() - client.close() - cluster.close() - - -| diff --git a/docs/cugraph/source/api_docs/cugraph/generators.rst b/docs/cugraph/source/api_docs/cugraph/generators.rst deleted file mode 100644 index f5180a172..000000000 --- a/docs/cugraph/source/api_docs/cugraph/generators.rst +++ /dev/null @@ -1,13 +0,0 @@ -========== -Generators -========== -.. currentmodule:: cugraph - - - -RMAT ----- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.generators.rmat diff --git a/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst b/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst deleted file mode 100644 index ae14306ce..000000000 --- a/docs/cugraph/source/api_docs/cugraph/graph_implementation.rst +++ /dev/null @@ -1,34 +0,0 @@ -==================== -Graph Implementation -==================== -.. currentmodule:: cugraph.structure.graph_implementation.simpleGraphImpl - - -Graph Implementation --------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - view_edge_list - delete_edge_list - view_adj_list - view_transposed_adj_list - delete_adj_list - - enable_batch - - get_two_hop_neighbors - number_of_vertices - number_of_nodes - number_of_edges - in_degree - out_degree - degree - degrees - has_edge - has_node - has_self_loop - edges - nodes - neighbors - vertex_column_size diff --git a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst b/docs/cugraph/source/api_docs/cugraph/helper_functions.rst deleted file mode 100644 index e7091c50c..000000000 --- a/docs/cugraph/source/api_docs/cugraph/helper_functions.rst +++ /dev/null @@ -1,22 +0,0 @@ -======================== -DASK MG Helper functions -======================== -.. currentmodule:: cugraph - - -Methods -------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.comms.comms.initialize - cugraph.dask.comms.comms.destroy - cugraph.dask.comms.comms.is_initialized - cugraph.dask.comms.comms.get_comms - cugraph.dask.comms.comms.get_workers - cugraph.dask.comms.comms.get_session_id - cugraph.dask.comms.comms.get_2D_partition - cugraph.dask.comms.comms.get_default_handle - cugraph.dask.comms.comms.get_handle - cugraph.dask.comms.comms.get_worker_id - cugraph.dask.common.read_utils.get_chunksize diff --git a/docs/cugraph/source/api_docs/cugraph/index.rst b/docs/cugraph/source/api_docs/cugraph/index.rst deleted file mode 100644 index 20b63d50a..000000000 --- a/docs/cugraph/source/api_docs/cugraph/index.rst +++ /dev/null @@ -1,25 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~ -cugraph API Reference -~~~~~~~~~~~~~~~~~~~~~ - -.. toctree:: - :maxdepth: 2 - :caption: API Documentation - - structure - graph_implementation - property_graph - centrality - community - components - cores - layout - linear_assignment - link_analysis - link_prediction - sampling - traversal - tree - generators - helper_functions - dask-cugraph.rst diff --git a/docs/cugraph/source/api_docs/cugraph/layout.rst b/docs/cugraph/source/api_docs/cugraph/layout.rst deleted file mode 100644 index d416676a6..000000000 --- a/docs/cugraph/source/api_docs/cugraph/layout.rst +++ /dev/null @@ -1,12 +0,0 @@ -====== -Layout -====== -.. currentmodule:: cugraph - - -Force Atlas 2 -------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.force_atlas2 diff --git a/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst b/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst deleted file mode 100644 index e0b0b4d11..000000000 --- a/docs/cugraph/source/api_docs/cugraph/linear_assignment.rst +++ /dev/null @@ -1,13 +0,0 @@ -================= -Linear Assignment -================= -.. currentmodule:: cugraph - - -Hungarian ---------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.hungarian - cugraph.dense_hungarian diff --git a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst b/docs/cugraph/source/api_docs/cugraph/link_analysis.rst deleted file mode 100644 index 698880c1b..000000000 --- a/docs/cugraph/source/api_docs/cugraph/link_analysis.rst +++ /dev/null @@ -1,34 +0,0 @@ -============= -Link Analysis -============= -.. currentmodule:: cugraph - - -HITS ----- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.hits - -HITS (MG) ---------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.link_analysis.hits.hits - - -Pagerank --------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.pagerank - -Pagerank (MG) -------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.link_analysis.pagerank.pagerank diff --git a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst b/docs/cugraph/source/api_docs/cugraph/link_prediction.rst deleted file mode 100644 index 3d2f9562e..000000000 --- a/docs/cugraph/source/api_docs/cugraph/link_prediction.rst +++ /dev/null @@ -1,31 +0,0 @@ -=============== -Link Prediction -=============== -.. currentmodule:: cugraph - - -Jaccard Coefficient -------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.jaccard - cugraph.jaccard_coefficient - - -Overlap Coefficient -------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.overlap - cugraph.overlap_coefficient - - -Sorensen Coefficient --------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.sorensen - cugraph.sorensen_coefficient diff --git a/docs/cugraph/source/api_docs/cugraph/property_graph.rst b/docs/cugraph/source/api_docs/cugraph/property_graph.rst deleted file mode 100644 index 672aa7dae..000000000 --- a/docs/cugraph/source/api_docs/cugraph/property_graph.rst +++ /dev/null @@ -1,29 +0,0 @@ -==================== -Property Graph -==================== -.. currentmodule:: cugraph.experimental - - -Property Graph -------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - PropertySelection - PropertyGraph - PropertyGraph.add_edge_data - PropertyGraph.add_vertex_data - PropertyGraph.annotate_dataframe - PropertyGraph.edge_props_to_graph - PropertyGraph.extract_subgraph - PropertyGraph.get_edge_data - PropertyGraph.get_num_edges - PropertyGraph.get_num_vertices - PropertyGraph.get_vertex_data - PropertyGraph.get_vertices - PropertyGraph.has_duplicate_edges - PropertyGraph.is_multigraph - PropertyGraph.renumber_edges_by_type - PropertyGraph.renumber_vertices_by_type - PropertyGraph.select_edges - PropertyGraph.select_vertices diff --git a/docs/cugraph/source/api_docs/cugraph/sampling.rst b/docs/cugraph/source/api_docs/cugraph/sampling.rst deleted file mode 100644 index 52004a5b1..000000000 --- a/docs/cugraph/source/api_docs/cugraph/sampling.rst +++ /dev/null @@ -1,22 +0,0 @@ -======== -Sampling -======== -.. currentmodule:: cugraph - - - -Random Walks ------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.random_walks - cugraph.ego_graph - cugraph.uniform_neighbor_sample - -Node2Vec ---------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.node2vec diff --git a/docs/cugraph/source/api_docs/cugraph/structure.rst b/docs/cugraph/source/api_docs/cugraph/structure.rst deleted file mode 100644 index 6369e1bb3..000000000 --- a/docs/cugraph/source/api_docs/cugraph/structure.rst +++ /dev/null @@ -1,99 +0,0 @@ -============= -Graph Classes -============= -.. currentmodule:: cugraph - -Constructors ------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - Graph - MultiGraph - - -Adding Data ------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - Graph.from_cudf_adjlist - Graph.from_cudf_edgelist - Graph.from_dask_cudf_edgelist - Graph.from_pandas_adjacency - Graph.from_pandas_edgelist - Graph.from_numpy_array - Graph.from_numpy_matrix - Graph.add_internal_vertex_id - Graph.add_nodes_from - Graph.clear - Graph.unrenumber - -Checks ------- -.. autosummary:: - :toctree: ../api/cugraph/ - - Graph.has_isolated_vertices - Graph.is_bipartite - Graph.is_directed - Graph.is_multigraph - Graph.is_multipartite - Graph.is_renumbered - Graph.is_weighted - Graph.lookup_internal_vertex_id - Graph.to_directed - Graph.to_undirected - - -Symmetrize ----------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.symmetrize - cugraph.symmetrize_ddf - cugraph.symmetrize_df - - -Conversion from Other Formats ------------------------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.from_adjlist - cugraph.from_cudf_edgelist - cugraph.from_edgelist - cugraph.from_numpy_array - cugraph.from_numpy_matrix - cugraph.from_pandas_adjacency - cugraph.from_pandas_edgelist - cugraph.to_numpy_array - cugraph.to_numpy_matrix - cugraph.to_pandas_adjacency - cugraph.to_pandas_edgelist - -NumberMap ------------------------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.structure.NumberMap - cugraph.structure.NumberMap.from_internal_vertex_id - cugraph.structure.NumberMap.to_internal_vertex_id - cugraph.structure.NumberMap.add_internal_vertex_id - cugraph.structure.NumberMap.compute_vals - cugraph.structure.NumberMap.compute_vals_types - cugraph.structure.NumberMap.generate_unused_column_name - cugraph.structure.NumberMap.renumber - cugraph.structure.NumberMap.renumber_and_segment - cugraph.structure.NumberMap.set_renumbered_col_names - cugraph.structure.NumberMap.unrenumber - cugraph.structure.NumberMap.vertex_column_size - -Other ------------------------------ -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.hypergraph diff --git a/docs/cugraph/source/api_docs/cugraph/traversal.rst b/docs/cugraph/source/api_docs/cugraph/traversal.rst deleted file mode 100644 index 31296f3b8..000000000 --- a/docs/cugraph/source/api_docs/cugraph/traversal.rst +++ /dev/null @@ -1,37 +0,0 @@ -========= -Traversal -========= -.. currentmodule:: cugraph - - -Breadth-first-search --------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.bfs - cugraph.bfs_edges - -Breadth-first-search (MG) -------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.traversal.bfs.bfs - -Single-source-shortest-path ---------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.filter_unreachable - cugraph.shortest_path - cugraph.shortest_path_length - cugraph.sssp - -Single-source-shortest-path (MG) --------------------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.dask.traversal.sssp.sssp diff --git a/docs/cugraph/source/api_docs/cugraph/tree.rst b/docs/cugraph/source/api_docs/cugraph/tree.rst deleted file mode 100644 index d8a89046a..000000000 --- a/docs/cugraph/source/api_docs/cugraph/tree.rst +++ /dev/null @@ -1,20 +0,0 @@ -==== -Tree -==== -.. currentmodule:: cugraph - - -Minimum Spanning Tree ---------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.tree.minimum_spanning_tree.minimum_spanning_tree - - -Maximum Spanning Tree ---------------------- -.. autosummary:: - :toctree: ../api/cugraph/ - - cugraph.tree.minimum_spanning_tree.maximum_spanning_tree diff --git a/docs/cugraph/source/api_docs/cugraph_c/centrality.rst b/docs/cugraph/source/api_docs/cugraph_c/centrality.rst deleted file mode 100644 index 3bea608fd..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/centrality.rst +++ /dev/null @@ -1,50 +0,0 @@ -Centrality -========== - -PageRank --------- -.. doxygenfunction:: cugraph_pagerank - :project: libcugraph - -.. doxygenfunction:: cugraph_pagerank_allow_nonconvergence - :project: libcugraph - -Personalized PageRank ---------------------- -.. doxygenfunction:: cugraph_personalized_pagerank - :project: libcugraph - -.. doxygenfunction:: cugraph_personalized_pagerank_allow_nonconvergence - :project: libcugraph - -Eigenvector Centrality ----------------------- -.. doxygenfunction:: cugraph_eigenvector_centrality - :project: libcugraph - -Katz Centrality ---------------- -.. doxygenfunction:: cugraph_katz_centrality - :project: libcugraph - -Betweenness Centrality ----------------------- -.. doxygenfunction:: cugraph_betweenness_centrality - :project: libcugraph - -Edge Betweenness Centrality ---------------------------- -.. doxygenfunction:: cugraph_edge_betweenness_centrality - :project: libcugraph - -HITS Centrality ---------------- -.. doxygenfunction:: cugraph_hits - :project: libcugraph - -Centrality Support Functions ----------------------------- - .. doxygengroup:: centrality - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/community.rst b/docs/cugraph/source/api_docs/cugraph_c/community.rst deleted file mode 100644 index 6b500a972..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/community.rst +++ /dev/null @@ -1,56 +0,0 @@ -Community -========= - -Triangle Counting ------------------ -.. doxygenfunction:: cugraph_triangle_count - :project: libcugraph - -Louvain -------- -.. doxygenfunction:: cugraph_louvain - :project: libcugraph - -Leiden ------- -.. doxygenfunction:: cugraph_leiden - :project: libcugraph - -ECG ---- -.. doxygenfunction:: cugraph_ecg - :project: libcugraph - -Extract Egonet --------------- -.. doxygenfunction:: cugraph_extract_ego - :project: libcugraph - -Balanced Cut ------------- -.. doxygenfunction:: cugraph_balanced_cut_clustering - :project: libcugraph - -Spectral Clustering - Modularity Maximization ---------------------------------------------- -.. doxygenfunction:: cugraph_spectral_modularity_maximization - :project: libcugraph - -.. doxygenfunction:: cugraph_analyze_clustering_modularity - :project: libcugraph - -Spectral Clustering - Edge Cut ------------------------------- -.. doxygenfunction:: cugraph_analyze_clustering_edge_cut - :project: libcugraph - -.. doxygenfunction:: cugraph_analyze_clustering_ratio_cut - :project: libcugraph - - -Community Support Functions ---------------------------- - .. doxygengroup:: community - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/core.rst b/docs/cugraph/source/api_docs/cugraph_c/core.rst deleted file mode 100644 index 34456c65e..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/core.rst +++ /dev/null @@ -1,21 +0,0 @@ -Core -==== - - -Core Number ------------ -.. doxygenfunction:: cugraph_core_number - :project: libcugraph - -K-Core ------- -.. doxygenfunction:: cugraph_k_core - :project: libcugraph - - -Core Support Functions ----------------------- - .. doxygengroup:: core - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/index.rst b/docs/cugraph/source/api_docs/cugraph_c/index.rst deleted file mode 100644 index 3dd37dbc3..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/index.rst +++ /dev/null @@ -1,16 +0,0 @@ -=========================== -cuGraph C API documentation -=========================== - - -.. toctree:: - :maxdepth: 3 - :caption: API Documentation - - centrality.rst - community.rst - core.rst - labeling.rst - sampling.rst - similarity.rst - traversal.rst diff --git a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst b/docs/cugraph/source/api_docs/cugraph_c/labeling.rst deleted file mode 100644 index 2b709ebd3..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/labeling.rst +++ /dev/null @@ -1,20 +0,0 @@ -Components -========== - - -Weakly Connected Components ---------------------------- -.. doxygenfunction:: cugraph_weakly_connected_components - :project: libcugraph - -Strongly Connected Components ------------------------------ -.. doxygenfunction:: cugraph_strongly_connected_components - :project: libcugraph - -Labeling Support Functions --------------------------- - .. doxygengroup:: labeling - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/sampling.rst b/docs/cugraph/source/api_docs/cugraph_c/sampling.rst deleted file mode 100644 index 3d5af713c..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/sampling.rst +++ /dev/null @@ -1,34 +0,0 @@ -Sampling -======== - -Uniform Random Walks --------------------- -.. doxygenfunction:: cugraph_uniform_random_walks - :project: libcugraph - -Biased Random Walks -------------------- -.. doxygenfunction:: cugraph_biased_random_walks - :project: libcugraph - -Random Walks via Node2Vec -------------------------- -.. doxygenfunction:: cugraph_node2vec_random_walks - :project: libcugraph - -Node2Vec --------- -.. doxygenfunction:: cugraph_node2vec - :project: libcugraph - -Uniform Neighbor Sampling -------------------------- -.. doxygenfunction:: cugraph_uniform_neighbor_sample - :project: libcugraph - -Sampling Support Functions --------------------------- -.. doxygengroup:: samplingC - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst b/docs/cugraph/source/api_docs/cugraph_c/similarity.rst deleted file mode 100644 index 75735925e..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/similarity.rst +++ /dev/null @@ -1,25 +0,0 @@ -Similarity -========== - - -Jaccard -------- -.. doxygenfunction:: cugraph_jaccard_coefficients - :project: libcugraph - -Sorensen --------- -.. doxygenfunction:: cugraph_sorensen_coefficients - :project: libcugraph - -Overlap -------- -.. doxygenfunction:: cugraph_overlap_coefficients - :project: libcugraph - -Similarty Support Functions ---------------------------- -.. doxygengroup:: similarity - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst b/docs/cugraph/source/api_docs/cugraph_c/traversal.rst deleted file mode 100644 index bde30f4fa..000000000 --- a/docs/cugraph/source/api_docs/cugraph_c/traversal.rst +++ /dev/null @@ -1,30 +0,0 @@ -Traversal -========== - - -Breadth First Search (BFS) --------------------------- -.. doxygenfunction:: cugraph_bfs - :project: libcugraph - -Single-Source Shortest-Path (SSSP) ----------------------------------- -.. doxygenfunction:: cugraph_sssp - :project: libcugraph - -Path Extraction ---------------- -.. doxygenfunction:: cugraph_extract_paths - :project: libcugraph - -Extract Max Path Length ------------------------ -.. doxygenfunction:: cugraph_extract_paths_result_get_max_path_length - :project: libcugraph - -Traversal Support Functions ---------------------------- -.. doxygengroup:: traversal - :project: libcugraph - :members: - :content-only: diff --git a/docs/cugraph/source/api_docs/plc/pylibcugraph.rst b/docs/cugraph/source/api_docs/plc/pylibcugraph.rst deleted file mode 100644 index 7ebdd67e9..000000000 --- a/docs/cugraph/source/api_docs/plc/pylibcugraph.rst +++ /dev/null @@ -1,22 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~ -pylibcugraph API reference -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -pylibcugraph - -.. currentmodule:: pylibcugraph - -Methods -------- -.. autosummary:: - :toctree: ../api/plc/ - - pylibcugraph.eigenvector_centrality - pylibcugraph.katz_centrality - pylibcugraph.strongly_connected_components - pylibcugraph.weakly_connected_components - pylibcugraph.pagerank - pylibcugraph.hits - pylibcugraph.node2vec - pylibcugraph.bfs - pylibcugraph.sssp diff --git a/docs/cugraph/source/api_docs/service/cugraph_service_client.rst b/docs/cugraph/source/api_docs/service/cugraph_service_client.rst deleted file mode 100644 index 7e344d326..000000000 --- a/docs/cugraph/source/api_docs/service/cugraph_service_client.rst +++ /dev/null @@ -1,20 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-service-client API Reference -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -cugraph-service - -.. currentmodule:: cugraph-service - -.. autosummary:: - :toctree: ../api/service/ - -.. cugraph_service_client.client.RunAsyncioThread - cugraph_service_client.client.run_async - cugraph_service_client.client.DeviceArrayAllocator - cugraph_service_client.client.CugraphServiceClient - cugraph_service_client.remote_graph_utils - cugraph_service_client.remote_graph.RemoteGraph - cugraph_service_client.types.UnionWrapper - cugraph_service_client.types.ValueWrapper - cugraph_service_client.types.GraphVertexEdgeIDWrapper diff --git a/docs/cugraph/source/api_docs/service/cugraph_service_server.rst b/docs/cugraph/source/api_docs/service/cugraph_service_server.rst deleted file mode 100644 index 09ca8360b..000000000 --- a/docs/cugraph/source/api_docs/service/cugraph_service_server.rst +++ /dev/null @@ -1,14 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-service-server API Reference -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -cugraph-service - -.. currentmodule:: cugraph-service - -.. autosummary:: - :toctree: ../api/service/ - -.. cugraph_service_server.cugraph_handler.call_algo - cugraph_service_server.cugraph_handler.ExtensionServerFacade - cugraph_service_server.cugraph_handler.CugraphHandler diff --git a/docs/cugraph/source/api_docs/service/index.rst b/docs/cugraph/source/api_docs/service/index.rst deleted file mode 100644 index ca251e475..000000000 --- a/docs/cugraph/source/api_docs/service/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -cugraph-service API Reference -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. toctree:: - :maxdepth: 2 - :caption: cugraph-service API Documentation - - cugraph_service_client - cugraph_service_server diff --git a/docs/cugraph/source/api_docs/wholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/index.rst deleted file mode 100644 index 80e231d46..000000000 --- a/docs/cugraph/source/api_docs/wholegraph/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -WholeGraph API reference -======================== - -This page provides WholeGraph API reference - -.. toctree:: - :maxdepth: 2 - :caption: WholeGraph API Documentation - - libwholegraph/index.rst - pylibwholegraph/index.rst diff --git a/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst deleted file mode 100644 index 4ef68abef..000000000 --- a/docs/cugraph/source/api_docs/wholegraph/libwholegraph/index.rst +++ /dev/null @@ -1,228 +0,0 @@ -===================== -libwholegraph API doc -===================== - -Doxygen WholeGraph C API documentation --------------------------------------- -For doxygen documentation, please refer to `Doxygen Documentation <../../doxygen_docs/libwholegraph/html/index.html>`_ - -WholeGraph C API documentation ------------------------------- - -Library Level APIs -++++++++++++++++++ - -.. doxygenenum:: wholememory_error_code_t - :project: libwholegraph -.. doxygenfunction:: wholememory_init - :project: libwholegraph -.. doxygenfunction:: wholememory_finalize - :project: libwholegraph -.. doxygenfunction:: fork_get_device_count - :project: libwholegraph - -WholeMemory Communicator APIs -+++++++++++++++++++++++++++++ - -.. doxygentypedef:: wholememory_comm_t - :project: libwholegraph -.. doxygenstruct:: wholememory_unique_id_t - :project: libwholegraph -.. doxygenfunction:: wholememory_create_unique_id - :project: libwholegraph -.. doxygenfunction:: wholememory_create_communicator - :project: libwholegraph -.. doxygenfunction:: wholememory_destroy_communicator - :project: libwholegraph -.. doxygenfunction:: wholememory_communicator_get_rank - :project: libwholegraph -.. doxygenfunction:: wholememory_communicator_get_size - :project: libwholegraph -.. doxygenfunction:: wholememory_communicator_barrier - :project: libwholegraph - -WholeMemoryHandle APIs -++++++++++++++++++++++ - -.. doxygenenum:: wholememory_memory_type_t - :project: libwholegraph -.. doxygenenum:: wholememory_memory_location_t - :project: libwholegraph -.. doxygentypedef:: wholememory_handle_t - :project: libwholegraph -.. doxygenstruct:: wholememory_gref_t - :project: libwholegraph -.. doxygenfunction:: wholememory_malloc - :project: libwholegraph -.. doxygenfunction:: wholememory_free - :project: libwholegraph -.. doxygenfunction:: wholememory_get_communicator - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_type - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_location - :project: libwholegraph -.. doxygenfunction:: wholememory_get_total_size - :project: libwholegraph -.. doxygenfunction:: wholememory_get_data_granularity - :project: libwholegraph -.. doxygenfunction:: wholememory_get_local_memory - :project: libwholegraph -.. doxygenfunction:: wholememory_get_rank_memory - :project: libwholegraph -.. doxygenfunction:: wholememory_get_global_pointer - :project: libwholegraph -.. doxygenfunction:: wholememory_get_global_reference - :project: libwholegraph -.. doxygenfunction:: wholememory_determine_partition_plan - :project: libwholegraph -.. doxygenfunction:: wholememory_determine_entry_partition_plan - :project: libwholegraph -.. doxygenfunction:: wholememory_get_partition_plan - :project: libwholegraph -.. doxygenfunction:: wholememory_load_from_file - :project: libwholegraph -.. doxygenfunction:: wholememory_store_to_file - :project: libwholegraph - -WholeMemoryTensor APIs -++++++++++++++++++++++ - -.. doxygenenum:: wholememory_dtype_t - :project: libwholegraph -.. doxygenstruct:: wholememory_array_description_t - :project: libwholegraph -.. doxygenstruct:: wholememory_matrix_description_t - :project: libwholegraph -.. doxygenstruct:: wholememory_tensor_description_t - :project: libwholegraph -.. doxygentypedef:: wholememory_tensor_t - :project: libwholegraph -.. doxygenfunction:: wholememory_dtype_get_element_size - :project: libwholegraph -.. doxygenfunction:: wholememory_dtype_is_floating_number - :project: libwholegraph -.. doxygenfunction:: wholememory_dtype_is_integer_number - :project: libwholegraph -.. doxygenfunction:: wholememory_create_array_desc - :project: libwholegraph -.. doxygenfunction:: wholememory_create_matrix_desc - :project: libwholegraph -.. doxygenfunction:: wholememory_initialize_tensor_desc - :project: libwholegraph -.. doxygenfunction:: wholememory_copy_array_desc_to_matrix - :project: libwholegraph -.. doxygenfunction:: wholememory_copy_array_desc_to_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_copy_matrix_desc_to_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_convert_tensor_desc_to_array - :project: libwholegraph -.. doxygenfunction:: wholememory_convert_tensor_desc_to_matrix - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_element_count_from_array - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_size_from_array - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_element_count_from_matrix - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_size_from_matrix - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_element_count_from_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_get_memory_size_from_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_unsqueeze_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_create_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_destroy_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_make_tensor_from_pointer - :project: libwholegraph -.. doxygenfunction:: wholememory_make_tensor_from_handle - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_has_handle - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_memory_handle - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_tensor_description - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_global_reference - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_map_local_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_data_pointer - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_entry_per_partition - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_subtensor - :project: libwholegraph -.. doxygenfunction:: wholememory_tensor_get_root - :project: libwholegraph - -Ops on WholeMemory Tensors -++++++++++++++++++++++++++ - -.. doxygenfunction:: wholememory_gather - :project: libwholegraph -.. doxygenfunction:: wholememory_scatter - :project: libwholegraph - -WholeTensorEmbedding APIs -+++++++++++++++++++++++++ - -.. doxygentypedef:: wholememory_embedding_cache_policy_t - :project: libwholegraph -.. doxygentypedef:: wholememory_embedding_optimizer_t - :project: libwholegraph -.. doxygentypedef:: wholememory_embedding_t - :project: libwholegraph -.. doxygenenum:: wholememory_access_type_t - :project: libwholegraph -.. doxygenenum:: wholememory_optimizer_type_t - :project: libwholegraph -.. doxygenfunction:: wholememory_create_embedding_optimizer - :project: libwholegraph -.. doxygenfunction:: wholememory_optimizer_set_parameter - :project: libwholegraph -.. doxygenfunction:: wholememory_destroy_embedding_optimizer - :project: libwholegraph -.. doxygenfunction:: wholememory_create_embedding_cache_policy - :project: libwholegraph -.. doxygenfunction:: wholememory_destroy_embedding_cache_policy - :project: libwholegraph -.. doxygenfunction:: wholememory_create_embedding - :project: libwholegraph -.. doxygenfunction:: wholememory_destroy_embedding - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_get_embedding_tensor - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_gather - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_gather_gradient_apply - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_get_optimizer_state_names - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_get_optimizer_state - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_writeback_cache - :project: libwholegraph -.. doxygenfunction:: wholememory_embedding_drop_all_cache - :project: libwholegraph - -Ops on graphs stored in WholeMemory -+++++++++++++++++++++++++++++++++++ - -.. doxygenfunction:: wholegraph_csr_unweighted_sample_without_replacement - :project: libwholegraph -.. doxygenfunction:: wholegraph_csr_weighted_sample_without_replacement - :project: libwholegraph - -Miscellaneous Ops for graph -+++++++++++++++++++++++++++ - -.. doxygenfunction:: graph_append_unique - :project: libwholegraph -.. doxygenfunction:: csr_add_self_loop - :project: libwholegraph diff --git a/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst b/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst deleted file mode 100644 index 67aab00ac..000000000 --- a/docs/cugraph/source/api_docs/wholegraph/pylibwholegraph/index.rst +++ /dev/null @@ -1,38 +0,0 @@ -======================= -pylibwholegraph API doc -======================= - -.. currentmodule:: pylibwholegraph - -APIs ----- -.. autosummary:: - :toctree: ../../api/wg - - torch.initialize.init_torch_env - torch.initialize.init_torch_env_and_create_wm_comm - torch.initialize.finalize - torch.comm.WholeMemoryCommunicator - torch.comm.set_world_info - torch.comm.create_group_communicator - torch.comm.destroy_communicator - torch.comm.get_global_communicator - torch.comm.get_local_node_communicator - torch.comm.get_local_device_communicator - torch.tensor.WholeMemoryTensor - torch.tensor.create_wholememory_tensor - torch.tensor.create_wholememory_tensor_from_filelist - torch.tensor.destroy_wholememory_tensor - torch.embedding.WholeMemoryOptimizer - torch.embedding.create_wholememory_optimizer - torch.embedding.destroy_wholememory_optimizer - torch.embedding.WholeMemoryCachePolicy - torch.embedding.create_wholememory_cache_policy - torch.embedding.create_builtin_cache_policy - torch.embedding.destroy_wholememory_cache_policy - torch.embedding.WholeMemoryEmbedding - torch.embedding.create_embedding - torch.embedding.create_embedding_from_filelist - torch.embedding.destroy_embedding - torch.embedding.WholeMemoryEmbeddingModule - torch.graph_structure.GraphStructure diff --git a/docs/cugraph/source/wholegraph/basics/index.rst b/docs/cugraph/source/wholegraph/basics/index.rst deleted file mode 100644 index 429fe35d6..000000000 --- a/docs/cugraph/source/wholegraph/basics/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -====== -Basics -====== - - -.. toctree:: - :maxdepth: 2 - - wholegraph_intro - wholememory_intro - wholememory_implementation_details diff --git a/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md b/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md deleted file mode 100644 index 360f8e0e3..000000000 --- a/docs/cugraph/source/wholegraph/basics/wholegraph_intro.md +++ /dev/null @@ -1,135 +0,0 @@ -# WholeGraph Introduction -WholeGraph helps train large-scale Graph Neural Networks(GNN). -WholeGraph provides underlying storage structure called WholeMemory. -WholeMemory is a Tensor like storage and provides multi-GPU support. -It is optimized for NVLink systems like DGX A100 servers. -By working together with cuGraph, cuGraph-Ops, cuGraph-DGL, cuGraph-PyG, and upstream DGL and PyG, -it will be easy to build GNN applications. - -## WholeMemory -WholeMemory can be regarded as a whole view of GPU memory. -WholeMemory exposes a handle of the memory instance no matter how the underlying data is stored across multiple GPUs. -WholeMemory assumes that separate process is used to control each GPU. - -### WholeMemory Basics -To define WholeMemory, we need to specify the following: - -#### 1. Specify the set of GPU to handle the Memory - -Since WholeMemory is owned by a set of GPUs, you must specify the set of GPUs. -This is done by creating [WholeMemory Communicator](#wholememory-communicator) and specifying the WholeMemory Communicator when creating WholeMemory. - -#### 2. Specify the location of the memory - -Although WholeMemory is owned by a set of GPUs, the memory itself can be located in host memory or in device memory. -The location of the memory need to be specified, two types of locations can be specified. - -- **Host memory**: will use pinned host memory as underlying storage. -- **Device memory**: will use GPU device memory as underlying storage. - -#### 3. Specify the address mapping mode of the memory - -As WholeMemory is owned by multiple GPUs, each GPU will access the whole memory space, so we need address mapping. -There are three types of address mapping modes (also known as WholeMemory types), they are: - -- **Continuous**: All memory from each GPU will be mapped into a single continuous memory address space for each GPU. - In this mode, each GPU can directly access the whole memory using a single pointer and offset, just like using normal - device memory. Software will see no difference. Hardware peer to peer access will handle the underlying communication. - -- **Chunked**: Memory from each GPU will be mapped into different memory chunks, one chunk for each GPU. - In this mode, direct access is also supported, but not using a single pointer. Software will see the chunked memory. - However, an abstract layer may help to hide this. - -- **Distributed**: Memory from other GPUs are not mapped into current GPU, so no direct access is supported. - To access memory of other GPU, explicit communication is needed. - -To learn more details about WholeMemory locations and WholeMemory types, please refer to -[WholeMemory Implementation Details](wholememory_implementation_details.md) - -### WholeMemory Communicator -WholeMemory Communicator has two main purpose: - -- **Defines a set of GPUs which works together on WholeMemory.** WholeMemory Communicator is created by all GPUs that - wants to work together. A WholeMemory Communicator can be reused as long as the GPU set needed is the same. -- **Provides underlying communication channel needed by WholeMemory.** WholeMemory may need commuincator between GPUs - during the WholeMemory creation and some OPs on some types of WholeMemory. - -To Create WholeMemory Communicator, a WholeMemory Unique ID needs to be created first, it is usually created by the first GPU in the set of GPUs, and then broadcasted to all GPUs that want to work together. Then all GPUs in this communicator -will call WholeMemory Communicator creation function using this WholeMemory Unique ID, and the rank of current GPU as -well as all GPU count. - -### WholeMemory Granularity -As underlying storage may be partitioned into multiple GPUs physically, this is usually not wanted inside one single -user data block. To help on this, when creating WholeMemory, the granularity of data can be specified. Then the -WholeMemory is considered as multiple block of the same granularity and will not get split inside the granularity. - -### WholeMemory Mapping -As WholeMemory provides a whole view of memory to GPU, to access WholeMemory, mapping is usually needed. -Different types of WholeMemory have different mapping methods supported as their names. -Some mappings supported include -- All the WholeMemory types support mapping the memory range that local GPU is responsible for. - That is, each rank can directly access "Local" memory in all types of WholeMemory. - Here "Local" memory doesn't have to be on current GPU's memory, it can be on host memory or even maybe on other GPU, - but it is guaranteed to be directly accessed by current GPU. -- Chunked and Continuous WholeMemory also support Chunked mapping. That is, memory of all GPUs can be mapped into - current GPU, one continuous chunk for one GPU. Each chunk can be directly accessed by current GPU. But the memory of - different chunks are not guaranteed to be continuous. -- Continuous WholeMemory can be mapped into continuous memory space. That is, memory of all GPUs are mapped into a - single range of virtual memory, accessing to different position of this memory will physically access to different - GPUs. This mapping will be handled by hardware (CPU pagetable or GPU pagetable). - -### Operations on WholeMemory -There are some operations that can be performed on WholeMemory. They are based on the mapping of WholeMemory. -#### Local Operation -As all WholeMemory supports mapping of local memory, so operation on local memory is supported. The operation can be -either read or write. Just use it as GPU memory of current device is OK. -#### Load and Store -To facilitate file operation, Load / Store WholeMemory from file or to file is supported. WholeMemory uses raw binary -file format for disk operation. For Load, the input file can be a single file or a list of files, if it is a list, they -will be logically concatenated together and then loaded. For store, each GPU stores its local memory to file, producing -a list of files. -#### Gather and Scatter -WholeMemory also supports Gather / Scatter operation, usually they operate on a -[WholeMemory Tensor](#wholememory-tensor). - -### WholeMemory Tensor -Compared to PyTorch, WholeMemory is like PyTorch Storage while a WholeMemory Tensor is like a PyTorch Tensor. -For now, WholeMemory supports only 1D and 2D tensors, or arrays and matrices. Only first dimension is partitioned. - -### WholeMemory Embedding -WholeMemory Embedding is just like a 2D WholeMemory Tensor, with two features added. They support cache and sparse -optimizers. -#### Cache Support -To create WholeMemory Embedding with a cache, WholeMemory CachePolicy needs to be be created first. WholeMemoryCachePolicy can be created with following fields: -- **WholeMemory Communicator**: WholeMemory CachePolicy also needs WholeMemory Communicator. - WholeMemory Communicator defines the set of GPUs that cache all the Embedding. - It can be the same as the WholeMemory Communicator used to create WholeMemory Embedding. -- **WholeMemory type**: WholeMemory CachePolicy uses WholeMemory type to specify the WholeMemory type of cache. -- **WholeMemory location**: WholeMemory CachePolicy use WholeMemory location to specify the location of the cache. -- **Access type**: Access type can be readonly or readwrite. -- **Cache ratio**: Specify how much memory the cache will use. This ratio is computed for each GPU set that caches the - whole embedding. - -The two most commonly used caches are: -- **Device cached host memory**: When the WholeMemory Communicator for Cache Policy is the same as the WholeMemory - Communicator used to create WholeMemory Embedding, it means that the cache has same GPU set as WholeMemory Embedding. - So each GPU just caches its own part of raw Embedding. - Most commonly, when raw WholeMemory Embedding is located on host memory, and the cache is on device - memory, each GPU just caches its own part of host memory. -- **Local cached global memory**: The WholeMemory Communicator of WholeMemory CachePolicy can also be a subset of the - WholeMemory Communicator of WholeMemory Embedding. In this case, the subset of GPUs together cache all the embeddings. - Normally, when raw WholeMemory Embedding is partitioned on different machine nodes, and we - want to cache some embeddings in local machine or local GPU, then the subset of GPU can be all the GPUs in the local - machine. For local cached global memory, only readonly is supported. - -#### WholeMemory Embedding Sparse Optimizer -Another feature of WholeMemory Embedding is that WholeMemory Embedding supports embedding training. -To efficiently train large embedding tables, a sparse optimizer is needed. -WholeMemory Embedding Sparse Optimizer can run on a cached or noncached WholeMemory Embedding. -Currently supported optimizers include SGD, Adam, RMSProp and AdaGrad. - -## Graph Structure -Graph structure in WholeGraph is also based on WholeMemory. -In WholeGraph, graph is stored in [CSR format](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)). -Both ROW_INDEX (noted as `csr_row_ptr`) and COL_INDEX (notated as `csr_col_ind`) are stored in a -WholeMemory Tensor. So loading Graph Structure can use [WholeMemory Tensor Loading mechanism](#load-and-store). diff --git a/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md b/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md deleted file mode 100644 index 634539cd2..000000000 --- a/docs/cugraph/source/wholegraph/basics/wholememory_implementation_details.md +++ /dev/null @@ -1,58 +0,0 @@ -# WholeMemory Implementation Details -As described in [WholeMemory Introduction](wholegraph_intro.md), there are two WholeMemory location and three -WholeMemory types. So there will be total six WholeMemory. - -| Type | CONTINUOUS | CONTINUOUS | CHUNKED | CHUNKED | DISTRIBUTED | DISTRIBUTED | -|:-------------:|:-----------:|:----------:|:---------:|:---------:|:-----------:|:-----------:| -| Location | DEVICE | HOST | DEVICE | HOST | DEVICE | HOST | -| Allocated by | EACH | FIRST | EACH | FIRST | EACH | EACH | -| Allocate API | Driver | Host | Runtime | Host | Runtime | Runtime | -| IPC Mapping | Unix fd | mmap | cudaIpc | mmap | No IPC map | No IPC map | - -For "Continuous" and "Chunked" types of WholeMemory, all memory is mapped to each GPU, -so these two types are all "Mapped" WholeMemory, in contrast to "Distributed" WholeMemory where all are not mapped. - -## WholeMemory Layout -Since the underlying memory of a single WholeMemory object may be on multiple GPU devices, the WholeGraph library will -partition data into these GPU devices. -The partition method guarantees that each GPU can access one continuous part of the entire memory. -Here "can access" means can directly access from CUDA kernels, but the memory doesn't have to be physically on that GPU. -For example,it can be on host memory or other GPU's device memory that can be access using P2P. -In that case the stored data has its own granularity that shouldn't be split. Data granularity can be specified while -creating WholeMemory. Then each data granularity can be considered as a block of data. - -The follow figure shows the layout of 15 data block over 4 GPUs. -![WholeMemory Layout](../imgs/general_wholememory.png) - -For WholeMemory Tensors, they can be 1D or 2D tensors. -For 1D tensor, data granularity is one element. For 2D tensor, data granularity is its 1D tensor. -The layout will be like this: -![WholeMemory Tensor Layout](../imgs/wholememory_tensor.png) - -## WholeMemory Allocation -As there are six types of WholeMemory, the allocation process of each type are as follows: - -### Device Continuous WholeMemory -For Device Continuous WholeMemory, first a range of virtual address space is reserved in each GPU, which covers the -entire memory range. Then a part of pyhsical memory is allocated in each GPU, as shown in the following figure. -![Device Continuous WholeMemory Allocation Step 1](../imgs/device_continuous_wholememory_step1.png) -After that, each GPU gathers all the memory handles from all GPUs, and maps them to the reserved address space. -![Device Continuous WholeMemory Allocation Step 2](../imgs/device_continuous_wholememory_step2.png) - -### Device Chunked WholeMemory -For Device Chunked WholeMemory, first each GPU allocates its own part of memory using CUDA runtime API, this will create -both a virtual address space and physical memory for its own memory. -![Device Chunked WholeMemory Allocation Step 1](../imgs/device_chunked_wholememory_step1.png) -Each GPU gathers the Ipc handle of memory from all other GPUs, and maps that into its own virtual address space. -![Device Chunked WholeMemory Allocation Step 2](../imgs/device_chunked_wholememory_step2.png) - -### Host Mapped WholeMemory -For Host, Continuous and Chunked are using the same method. First, rank and allocate the host physical and share that to all -ranks. -![Host Mapped WholeMemory Allocation Step 1](../imgs/host_mapped_wholememory_step1.png) -Then each rank registers that host memory to GPU address space. -![Host Mapped WholeMemory Allocation Step 2](../imgs/host_mapped_wholememory_step2.png) - -### Distributed WholeMemory -For Distributed WholeMemory, each GPU just malloc its own part of memory, no need to share to other GPUs. -![Distributed WholeMemory Allocation](../imgs/distributed_wholememory.png) diff --git a/docs/cugraph/source/wholegraph/basics/wholememory_intro.md b/docs/cugraph/source/wholegraph/basics/wholememory_intro.md deleted file mode 100644 index 7209da947..000000000 --- a/docs/cugraph/source/wholegraph/basics/wholememory_intro.md +++ /dev/null @@ -1,123 +0,0 @@ -## WholeMemory -WholeMemory can be regarded as a whole view of GPU memory. -WholeMemory exposes a handle to the memory instance no matter how the underlying data is stored across multiple GPUs. -WholeMemory assumes that a separate process is used to control each GPU. - -### WholeMemory Basics -To define WholeMemory, we need to specify the following: - -#### 1. Specify the set of GPU to handle the Memory - -As WholeMemory is owned by a set of GPUs, so the set of GPUs need to be specified. -This is done by creating [WholeMemory Communicator](#wholememory-communicator) and specify the WholeMemory Communicator -when creating WholeMemory. - -#### 2. Specify the location of the memory - -Although WholeMemory is owned by a set of GPUs, the memory itself can be located on host memory or on device memory. -So the location of the memory needs to be specified. Two types of location can be specified. - -- **Host memory**: will use pinned host memory as underlying storage. -- **Device memory**: will use GPU device memory as underlying storage. - -#### 3. Specify the address mapping mode of the memory - -As WholeMemory is owned by multiple GPUs, each GPU will access the whole memory space, so we need address mapping. -There are three types of address mapping modes (also known as WholeMemory types), they are: - -- **Continuous**: All memory from each GPU will be mapped into a single continuous memory address space for each GPU. - In this mode, each GPU can directly access the whole memory using a single pointer and offset, just like using normal - device memory. Software will see no difference. Hardware peer-to-peer access will handle the underlying communication. - -- **Chunked**: Memory from each GPU will be mapped into different memory chunks, one chunk for each GPU. - In this mode, direct access is also supported, but not using a single pointer. Software will see the chunked memory. - However, an abstract layer can hide this. - -- **Distributed**: Memory from other GPUs is not mapped into current GPU, so no direct access is supported. - To access memory of another GPU, explicit communication is needed. - -If you would like to know more details about WholeMemory locations and WholeMemory types, please refer to -[WholeMemory Implementation Details](wholememory_implementation_details.md) - -### WholeMemory Communicator -WholeMemory Communicator has two main purpose: - -- **Defines a set of GPUs which works together on WholeMemory.** WholeMemory Communicator is created by all GPUs that - wants to work together. A WholeMemory Communicator can be reused as long as the GPU set needed is the same. -- **Provides underlying communication channel needed by WholeMemory.** WholeMemory may need commuincator between GPUs - during the WholeMemory creation and some OPs on some types of WholeMemory. - -To Create WholeMemory Communicator, a WholeMemory Unique ID need to be created first, it is usually created by the first -GPU in the set of GPUs, and then broadcasted to all GPUs that want to work together. Then all GPUs in this communicator -will call WholeMemory Communicator creation function using this WholeMemory Unique ID, and the rank of current GPU as -well as all GPU count. - -### WholeMemory Granularity -As underlying storage may be physically partitioned into multiple GPUs, it is usually not wanted inside one single -user data block. To help with this, when creating WholeMemory, the granularity of data can be specified. Therefore -WholeMemory is considered as multiple blocks of the same granularity and will not get split inside the granularity. - -### WholeMemory Mapping -Since WholeMemory provides a whole view of memory to GPU, mapping is usually needed to access WholeMemory. -Different types of WholeMemory have different mapping methods supported as their names. -Some mappings supported include: -- All the WholeMemory types support mapping the memory range that local GPU is responsible for. - That is, each rank can directly access "Local" memory in all types of WholeMemory. - Here "Local" memory doesn't have to be on current GPU's memory, it can be on host memory or even maybe on other GPU, - but it is guaranteed to be directly accessed by current GPU. -- Chunked and Continuous WholeMemory also support Chunked mapping. That is, memory of all GPUs can be mapped into - current GPU, one continuous chunk for one GPU. Each chunk can be directly accessed by current GPU. But the memory of - different chunks are not guaranteed to be continuous. -- Continuous WholeMemory can be mapped into continuous memory space. That is, memory of all GPUs are mapped into a - single range of virtual memory, accessing different positions of this memory will physically access different - GPUs. This mapping will be handled by hardware (CPU pagetable or GPU pagetable). - -### Operations on WholeMemory -There are some operations that can be performed on WholeMemory. They are based on the mapping of WholeMemory. -#### Local Operation -As all WholeMemory supports mapping of local memory, so operation on local memory is supported. The operation can be -either read or write. Just use it as GPU memory of current device is OK. -#### Load / Store -To facilitate file operation, Load / Store WholeMemory from file or to file is supported. WholeMemory use raw binary -file format for disk operation. For Load, the input file can be single file or a list of files, if it is a list, they -will be logically concatenated together and then loaded. For store, each GPU stores its local memory to file, producing -a list of files. -#### Gather / Scatter -WholeMemory also supports Gather / Scatter operations, usually they operate on a -[WholeMemory Tensor](#wholememory-tensor). - -### WholeMemory Tensor -Compared to PyTorch, WholeMemory is like PyTorch Storage while WholeMemory Tensor is like PyTorch Tensor. -For now, WholeMemory supports only 1D and 2D tensor, or array and matrix. Only first dimension is partitioned. - -### WholeMemory Embedding -WholeMemory Embedding is just like 2D WholeMemory Tensor, with cache support and sparse optimizer support added. -#### Cache Support -WholeMemory Embedding supports cache. To create WholeMemory Embedding with cache, WholeMemory CachePolicy need first be -created. WholeMemoryCachePolicy can be created with following fields: -- **WholeMemory Communicator**: WholeMemory CachePolicy also need WholeMemory Communicator. - This WholeMemory Communicator defines the set of GPUs that cache the all the Embedding. - It can be the same as the WholeMemory Communicator used to create WholeMemory Embedding. -- **WholeMemory type**: WholeMemory CachePolicy uses WholeMemory type to specify the WholeMemory type of the cache. -- **WholeMemory location**: WholeMemory CachePolicy uses WholeMemory location to specify the location of the cache. -- **Access type**: Access type can be readonly or readwrite. -- **Cache ratio**: Specify how much memory the cache will use. This ratio is computed for each GPU set that caches the - whole embedding. - -There are two most commonly used caches. They are: -- **Device cached host memory**: When the WholeMemory Communicator for Cache Policy is the same as the WholeMemory - Communicator used to create WholeMemory Embedding, it means that cache has the same GPU set as WholeMemory Embedding. - So each GPU just cache its own part of raw Embedding. - Normally, when raw WholeMemory Embedding is located on host memory, and the cache is on device - memory, each GPU just caches its own part of host memory. -- **Local cached global memory**: The WholeMemory Communicator of WholeMemory CachePolicy can also be a subset of the - WholeMemory Communicator of WholeMemory Embedding. In this case, the subset of GPUs together cache all the embeddings. - Typically, raw WholeMemory Embedding is partitioned on different machine nodes, and we - want to cache some embeddings in local machine or local GPU, then the subset of GPUs can be all the GPUs on the local - machine. For local cached global memory supports just readonly. - -#### WholeMemory Embedding Sparse Optimizer -Another feature of WholeMemory Embedding is that WholeMemory Embedding supports embedding training. -To efficiently train large embedding tables, a sparse optimizer is needed. -The WholeMemory Embedding Sparse Optimizer can run on cached or non-cached WholeMemory Embedding. -Currently supported optimizers include SGD, Adam, RMSProp and AdaGrad. diff --git a/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png b/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step1.png deleted file mode 100644 index b8a0447e6fb9dde5691c987aa734a6ba4ae24663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23136 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 A_5c6? diff --git a/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/device_chunked_wholememory_step2.png deleted file mode 100644 index 8b203ce22467786b4b8f7fca87a6cfe9d5798027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28201 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 VzTd9vQIZ42tEa1<%Q~loCIE!7SJMCh diff --git a/docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/device_continuous_wholememory_step2.png deleted file mode 100644 index b773b1ef6e9872e8622c808de28510acb5033cb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26434 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 diff --git a/docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png b/docs/cugraph/source/wholegraph/imgs/distributed_wholememory.png deleted file mode 100644 index e6bbe9f13e9e0b38f5b3459c513ab0992c177c62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23138 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 diff --git a/docs/cugraph/source/wholegraph/imgs/general_wholememory.png b/docs/cugraph/source/wholegraph/imgs/general_wholememory.png deleted file mode 100644 index 3ece02b007b6f4b0ad6e97b868dedb2fb0996d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14073 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%0DGW|X>s#JLfvm7t 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 diff --git a/docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png b/docs/cugraph/source/wholegraph/imgs/host_mapped_wholememory_step2.png deleted file mode 100644 index 20597f3e5154c7608d9113822b70567797530dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32110 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 diff --git a/docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png b/docs/cugraph/source/wholegraph/imgs/wholememory_tensor.png deleted file mode 100644 index e725d6c28edffbfa9879e42cb9b36fb6a15e2516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40367 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 DoB#6Y diff --git a/docs/cugraph/source/wholegraph/index.rst b/docs/cugraph/source/wholegraph/index.rst deleted file mode 100644 index bb2281b13..000000000 --- a/docs/cugraph/source/wholegraph/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -WholeGraph -========== -RAPIDS WholeGraph has following package: - -* pylibwholegraph: shared memory-based GPU-accelerated GNN training - - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - basics/index - installation/index diff --git a/docs/cugraph/source/wholegraph/installation/container.md b/docs/cugraph/source/wholegraph/installation/container.md deleted file mode 100644 index 3a2c627c5..000000000 --- a/docs/cugraph/source/wholegraph/installation/container.md +++ /dev/null @@ -1,29 +0,0 @@ -# Build Container for WholeGraph -To run WholeGraph or build WholeGraph from source, set up the environment first. -We recommend using Docker images. -For example, to build the WholeGraph base image from the NGC pytorch 22.10 image, you can follow `Dockerfile`: -```dockerfile -FROM nvcr.io/nvidia/pytorch:22.10-py3 - -RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y lsb-core software-properties-common wget libspdlog-dev - -#RUN remove old cmake to update -RUN conda remove --force -y cmake -RUN rm -rf /usr/local/bin/cmake && rm -rf /usr/local/lib/cmake && rm -rf /usr/lib/cmake - -RUN apt-key adv --fetch-keys https://apt.kitware.com/keys/kitware-archive-latest.asc && \ - export LSB_CODENAME=$(lsb_release -cs) && \ - apt-add-repository -y "deb https://apt.kitware.com/ubuntu/ ${LSB_CODENAME} main" && \ - apt update && apt install -y cmake - -# update py for pytest -RUN pip3 install -U py -RUN pip3 install Cython setuputils3 scikit-build nanobind pytest-forked pytest -``` - -To run GNN applications, you may also need cuGraphOps, DGL and/or PyG libraries to run the GNN layers. -You may refer to [DGL](https://www.dgl.ai/pages/start.html) or [PyG](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html) -For example, to install DGL, you may need to add: -```dockerfile -RUN pip3 install dgl -f https://data.dgl.ai/wheels/cu118/repo.html -``` diff --git a/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md b/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md deleted file mode 100644 index 57314dcd4..000000000 --- a/docs/cugraph/source/wholegraph/installation/getting_wholegraph.md +++ /dev/null @@ -1,48 +0,0 @@ - -# Getting the WholeGraph 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 WholeGraph 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 (as of Release 23.10) contain all RAPIDS packages, including WholeGraph, as well as all required supporting packages. To download a container, please see the [Docker Repository](https://hub.docker.com/r/rapidsai/rapidsai/), choosing a tag based on the NVIDIA CUDA version you’re running. This provides a ready to run Docker container with example notebooks and data, showcasing how you can utilize all of the RAPIDS libraries. - -
- - -## Conda -It is easy to install WholeGraph using conda. You can get a minimal conda installation with [Miniconda](https://conda.io/miniconda.html) or get the full installation with [Anaconda](https://www.anaconda.com/download). - -WholeGraph conda packages - * libwholegraph - * pylibwholegraph - -Replace the package name in the example below to the one you want to install. - - -Install and update WholeGraph using the conda command: - -```bash -conda install -c rapidsai -c conda-forge -c nvidia wholegraph cudatoolkit=11.8 -``` - -
- -## PIP -wholegraph, and all of RAPIDS, is available via pip. - -``` -pip install wholegraph-cu11 --extra-index-url=https://pypi.nvidia.com -``` - -
diff --git a/docs/cugraph/source/wholegraph/installation/index.rst b/docs/cugraph/source/wholegraph/installation/index.rst deleted file mode 100644 index 09f1cb44a..000000000 --- a/docs/cugraph/source/wholegraph/installation/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -Installation -============ - -.. toctree:: - :maxdepth: 2 - - getting_wholegraph - container - source_build diff --git a/docs/cugraph/source/wholegraph/installation/source_build.md b/docs/cugraph/source/wholegraph/installation/source_build.md deleted file mode 100644 index a7727ac40..000000000 --- a/docs/cugraph/source/wholegraph/installation/source_build.md +++ /dev/null @@ -1,187 +0,0 @@ -# Building from Source - -The following instructions are for users wishing to build wholegraph from source code. These instructions are tested on supported distributions of Linux,CUDA, -and Python - See [RAPIDS Getting Started](https://rapids.ai/start.html) for a list of supported environments. -Other operating systems _might be_ compatible, but are not currently tested. - -The wholegraph package includes both a C/C++ CUDA portion and a python portion. Both libraries need to be installed in order for cuGraph to operate correctly. -The C/C++ CUDA library is `libwholegraph` and the python library is `pylibwholegraph`. - -## Prerequisites - -__Compiler__: -* `gcc` version 11.0+ -* `nvcc` version 11.0+ -* `cmake` version 3.26.4+ - -__CUDA__: -* CUDA 11.8+ -* NVIDIA driver 450.80.02+ -* Pascal architecture or better - -You can obtain CUDA from [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). - -__Other Packages__: -* ninja -* nccl -* cython -* setuputils3 -* scikit-learn -* scikit-build-core -* nanobind>=0.2.0 - -## Building wholegraph -To install wholegraph from source, ensure the dependencies are met. - -### Clone Repo and Configure Conda Environment -__GIT clone a version of the repository__ - - ```bash - # Set the location to wholegraph in an environment variable WHOLEGRAPH_HOME - export WHOLEGRAPH_HOME=$(pwd)/wholegraph - - # Download the wholegraph repo - if you have a forked version, use that path here instead - git clone https://github.com/rapidsai/wholegraph.git $WHOLEGRAPH_HOME - - cd $WHOLEGRAPH_HOME - ``` - -__Create the conda development environment__ - -```bash -# create the conda environment (assuming in base `wholegraph` directory) - -# for CUDA 11.x -conda env create --name wholegraph_dev --file conda/environments/all_cuda-118_arch-x86_64.yaml - -# activate the environment -conda activate wholegraph_dev - -# to deactivate an environment -conda deactivate -``` - - - The environment can be updated as development includes/changes the dependencies. To do so, run: - - -```bash - -# Where XXX is the CUDA version -conda env update --name wholegraph_dev --file conda/environments/all_cuda-XXX_arch-x86_64.yaml - -conda activate wholegraph_dev -``` - - -### Build and Install Using the `build.sh` Script -Using the `build.sh` script make compiling and installing wholegraph a -breeze. To build and install, simply do: - -```bash -$ cd $WHOLEGRAPH_HOME -$ ./build.sh clean -$ ./build.sh libwholegraph -$ ./build.sh pylibwholegraph -``` - -There are several other options available on the build script for advanced users. -`build.sh` options: -```bash -build.sh [ ...] [ ...] - where is: - clean - remove all existing build artifacts and configuration (start over). - uninstall - uninstall libwholegraph and pylibwholegraph from a prior build/install (see also -n) - libwholegraph - build the libwholegraph C++ library. - pylibwholegraph - build the pylibwholegraph Python package. - tests - build the C++ (OPG) tests. - benchmarks - build benchmarks. - docs - build the docs - and is: - -v - verbose build mode - -g - build for debug - -n - no install step - --allgpuarch - build for all supported GPU architectures - --cmake-args=\\\"\\\" - add arbitrary CMake arguments to any cmake call - --compile-cmd - only output compile commands (invoke CMake without build) - --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) - -h | --h[elp] - print this text - - default action (no args) is to build and install 'libwholegraph' then 'pylibwholegraph' targets - -examples: -$ ./build.sh clean # remove prior build artifacts (start over) -$ ./build.sh - -# make parallelism options can also be defined: Example build jobs using 4 threads (make -j4) -$ PARALLEL_LEVEL=4 ./build.sh libwholegraph - -Note that the libraries will be installed to the location set in `$PREFIX` if set (i.e. `export PREFIX=/install/path`), otherwise to `$CONDA_PREFIX`. -``` - - -## Building each section independently -### Build and Install the C++/CUDA `libwholegraph` Library -CMake depends on the `nvcc` executable being on your path or defined in `$CUDACXX`. - -This project uses cmake for building the C/C++ library. To configure cmake, run: - - ```bash - # Set the location to wholegraph in an environment variable WHOLEGRAPH_HOME - export WHOLEGRAPH_HOME=$(pwd)/wholegraph - - cd $WHOLEGRAPH_HOME - cd cpp # enter cpp directory - mkdir build # create build directory - cd build # enter the build directory - cmake .. -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX - - # now build the code - make -j # "-j" starts multiple threads - make install # install the libraries - ``` -The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/wholegraph` respectively. - -### Building and installing the Python package - -Build and Install the Python packages to your Python path: - -```bash -cd $WHOLEGRAPH_HOME -cd python -cd pylibwholegraph -python setup.py build_ext --inplace -python setup.py install # install pylibwholegraph -``` - -## Run tests - -Run either the C++ or the Python tests with datasets - - - **Python tests with datasets** - - ```bash - cd $WHOLEGRAPH_HOME - cd python - pytest - ``` - - - **C++ stand alone tests** - - From the build directory : - - ```bash - # Run the tests - cd $WHOLEGRAPH_HOME - cd cpp/build - gtests/PARALLEL_UTILS_TESTS # this is an executable file - ``` - - -Note: This conda installation only applies to Linux and Python versions 3.8/3.10. - -## Creating documentation - -Python API documentation can be generated from _./docs/wholegraph directory_. Or through using "./build.sh docs" - -## Attribution -Portions adopted from https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md diff --git a/docs/cugraph/Makefile b/docs/nx-cugraph/Makefile similarity index 100% rename from docs/cugraph/Makefile rename to docs/nx-cugraph/Makefile diff --git a/docs/cugraph/README.md b/docs/nx-cugraph/README.md similarity index 100% rename from docs/cugraph/README.md rename to docs/nx-cugraph/README.md diff --git a/docs/cugraph/make.bat b/docs/nx-cugraph/make.bat similarity index 100% rename from docs/cugraph/make.bat rename to docs/nx-cugraph/make.bat diff --git a/docs/cugraph/source/_static/EMPTY b/docs/nx-cugraph/source/_static/EMPTY similarity index 100% rename from docs/cugraph/source/_static/EMPTY rename to docs/nx-cugraph/source/_static/EMPTY diff --git a/docs/cugraph/source/_static/references.css b/docs/nx-cugraph/source/_static/references.css similarity index 100% rename from docs/cugraph/source/_static/references.css rename to docs/nx-cugraph/source/_static/references.css diff --git a/docs/cugraph/source/api_docs/index.rst b/docs/nx-cugraph/source/api_docs/index.rst similarity index 100% rename from docs/cugraph/source/api_docs/index.rst rename to docs/nx-cugraph/source/api_docs/index.rst diff --git a/docs/cugraph/source/basics/cugraph_cascading.md b/docs/nx-cugraph/source/basics/cugraph_cascading.md similarity index 100% rename from docs/cugraph/source/basics/cugraph_cascading.md rename to docs/nx-cugraph/source/basics/cugraph_cascading.md diff --git a/docs/cugraph/source/basics/cugraph_intro.md b/docs/nx-cugraph/source/basics/cugraph_intro.md similarity index 100% rename from docs/cugraph/source/basics/cugraph_intro.md rename to docs/nx-cugraph/source/basics/cugraph_intro.md diff --git a/docs/cugraph/source/basics/index.rst b/docs/nx-cugraph/source/basics/index.rst similarity index 100% rename from docs/cugraph/source/basics/index.rst rename to docs/nx-cugraph/source/basics/index.rst diff --git a/docs/cugraph/source/basics/nx_transition.rst b/docs/nx-cugraph/source/basics/nx_transition.rst similarity index 100% rename from docs/cugraph/source/basics/nx_transition.rst rename to docs/nx-cugraph/source/basics/nx_transition.rst diff --git a/docs/cugraph/source/conf.py b/docs/nx-cugraph/source/conf.py similarity index 100% rename from docs/cugraph/source/conf.py rename to docs/nx-cugraph/source/conf.py diff --git a/docs/cugraph/source/dev_resources/API.rst b/docs/nx-cugraph/source/dev_resources/API.rst similarity index 100% rename from docs/cugraph/source/dev_resources/API.rst rename to docs/nx-cugraph/source/dev_resources/API.rst diff --git a/docs/cugraph/source/dev_resources/index.rst b/docs/nx-cugraph/source/dev_resources/index.rst similarity index 100% rename from docs/cugraph/source/dev_resources/index.rst rename to docs/nx-cugraph/source/dev_resources/index.rst diff --git a/docs/cugraph/source/graph_support/DGL_support.md b/docs/nx-cugraph/source/graph_support/DGL_support.md similarity index 100% rename from docs/cugraph/source/graph_support/DGL_support.md rename to docs/nx-cugraph/source/graph_support/DGL_support.md diff --git a/docs/cugraph/source/graph_support/PyG_support.md b/docs/nx-cugraph/source/graph_support/PyG_support.md similarity index 100% rename from docs/cugraph/source/graph_support/PyG_support.md rename to docs/nx-cugraph/source/graph_support/PyG_support.md diff --git a/docs/cugraph/source/graph_support/algorithms.md b/docs/nx-cugraph/source/graph_support/algorithms.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms.md rename to docs/nx-cugraph/source/graph_support/algorithms.md diff --git a/docs/cugraph/source/graph_support/algorithms/Centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/Centrality.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/Centrality.md rename to docs/nx-cugraph/source/graph_support/algorithms/Centrality.md diff --git a/docs/cugraph/source/graph_support/algorithms/Similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/Similarity.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/Similarity.md rename to docs/nx-cugraph/source/graph_support/algorithms/Similarity.md diff --git a/docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/betweenness_centrality.md rename to docs/nx-cugraph/source/graph_support/algorithms/betweenness_centrality.md diff --git a/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md rename to docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/centrality_cpp.md diff --git a/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md rename to docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/linear_cpp.md diff --git a/docs/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md b/docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md rename to docs/nx-cugraph/source/graph_support/algorithms/cpp_algorithms/traversal_cpp.md diff --git a/docs/cugraph/source/graph_support/algorithms/degree_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/degree_centrality.md rename to docs/nx-cugraph/source/graph_support/algorithms/degree_centrality.md diff --git a/docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/eigenvector_centrality.md rename to docs/nx-cugraph/source/graph_support/algorithms/eigenvector_centrality.md diff --git a/docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/jaccard_similarity.md rename to docs/nx-cugraph/source/graph_support/algorithms/jaccard_similarity.md diff --git a/docs/cugraph/source/graph_support/algorithms/katz_centrality.md b/docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/katz_centrality.md rename to docs/nx-cugraph/source/graph_support/algorithms/katz_centrality.md diff --git a/docs/cugraph/source/graph_support/algorithms/overlap_similarity.md b/docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/overlap_similarity.md rename to docs/nx-cugraph/source/graph_support/algorithms/overlap_similarity.md diff --git a/docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md b/docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md similarity index 100% rename from docs/cugraph/source/graph_support/algorithms/sorensen_coefficient.md rename to docs/nx-cugraph/source/graph_support/algorithms/sorensen_coefficient.md diff --git a/docs/cugraph/source/graph_support/compatibility.rst b/docs/nx-cugraph/source/graph_support/compatibility.rst similarity index 100% rename from docs/cugraph/source/graph_support/compatibility.rst rename to docs/nx-cugraph/source/graph_support/compatibility.rst diff --git a/docs/cugraph/source/graph_support/cugraph_service.rst b/docs/nx-cugraph/source/graph_support/cugraph_service.rst similarity index 100% rename from docs/cugraph/source/graph_support/cugraph_service.rst rename to docs/nx-cugraph/source/graph_support/cugraph_service.rst diff --git a/docs/cugraph/source/graph_support/cugraphops_support.rst b/docs/nx-cugraph/source/graph_support/cugraphops_support.rst similarity index 100% rename from docs/cugraph/source/graph_support/cugraphops_support.rst rename to docs/nx-cugraph/source/graph_support/cugraphops_support.rst diff --git a/docs/cugraph/source/graph_support/datastores.rst b/docs/nx-cugraph/source/graph_support/datastores.rst similarity index 100% rename from docs/cugraph/source/graph_support/datastores.rst rename to docs/nx-cugraph/source/graph_support/datastores.rst diff --git a/docs/cugraph/source/graph_support/feature_stores.md b/docs/nx-cugraph/source/graph_support/feature_stores.md similarity index 100% rename from docs/cugraph/source/graph_support/feature_stores.md rename to docs/nx-cugraph/source/graph_support/feature_stores.md diff --git a/docs/cugraph/source/graph_support/gnn_support.rst b/docs/nx-cugraph/source/graph_support/gnn_support.rst similarity index 100% rename from docs/cugraph/source/graph_support/gnn_support.rst rename to docs/nx-cugraph/source/graph_support/gnn_support.rst diff --git a/docs/cugraph/source/graph_support/graph_algorithms.rst b/docs/nx-cugraph/source/graph_support/graph_algorithms.rst similarity index 100% rename from docs/cugraph/source/graph_support/graph_algorithms.rst rename to docs/nx-cugraph/source/graph_support/graph_algorithms.rst diff --git a/docs/cugraph/source/graph_support/index.rst b/docs/nx-cugraph/source/graph_support/index.rst similarity index 100% rename from docs/cugraph/source/graph_support/index.rst rename to docs/nx-cugraph/source/graph_support/index.rst diff --git a/docs/cugraph/source/graph_support/knowledge_stores.md b/docs/nx-cugraph/source/graph_support/knowledge_stores.md similarity index 100% rename from docs/cugraph/source/graph_support/knowledge_stores.md rename to docs/nx-cugraph/source/graph_support/knowledge_stores.md diff --git a/docs/cugraph/source/graph_support/pg_example.png b/docs/nx-cugraph/source/graph_support/pg_example.png similarity index 100% rename from docs/cugraph/source/graph_support/pg_example.png rename to docs/nx-cugraph/source/graph_support/pg_example.png diff --git a/docs/cugraph/source/graph_support/property_graph.md b/docs/nx-cugraph/source/graph_support/property_graph.md similarity index 100% rename from docs/cugraph/source/graph_support/property_graph.md rename to docs/nx-cugraph/source/graph_support/property_graph.md diff --git a/docs/cugraph/source/graph_support/wholegraph_support.md b/docs/nx-cugraph/source/graph_support/wholegraph_support.md similarity index 100% rename from docs/cugraph/source/graph_support/wholegraph_support.md rename to docs/nx-cugraph/source/graph_support/wholegraph_support.md diff --git a/docs/cugraph/source/images/Nx_Cg_1.png b/docs/nx-cugraph/source/images/Nx_Cg_1.png similarity index 100% rename from docs/cugraph/source/images/Nx_Cg_1.png rename to docs/nx-cugraph/source/images/Nx_Cg_1.png diff --git a/docs/cugraph/source/images/Nx_Cg_2.png b/docs/nx-cugraph/source/images/Nx_Cg_2.png similarity index 100% rename from docs/cugraph/source/images/Nx_Cg_2.png rename to docs/nx-cugraph/source/images/Nx_Cg_2.png diff --git a/docs/cugraph/source/images/Stack2.png b/docs/nx-cugraph/source/images/Stack2.png similarity index 100% rename from docs/cugraph/source/images/Stack2.png rename to docs/nx-cugraph/source/images/Stack2.png diff --git a/docs/cugraph/source/images/ancestors.png b/docs/nx-cugraph/source/images/ancestors.png similarity index 100% rename from docs/cugraph/source/images/ancestors.png rename to docs/nx-cugraph/source/images/ancestors.png diff --git a/docs/cugraph/source/images/bfs_tree.png b/docs/nx-cugraph/source/images/bfs_tree.png similarity index 100% rename from docs/cugraph/source/images/bfs_tree.png rename to docs/nx-cugraph/source/images/bfs_tree.png diff --git a/docs/cugraph/source/images/conn_component.png b/docs/nx-cugraph/source/images/conn_component.png similarity index 100% rename from docs/cugraph/source/images/conn_component.png rename to docs/nx-cugraph/source/images/conn_component.png diff --git a/docs/cugraph/source/images/cugraph_logo_2.png b/docs/nx-cugraph/source/images/cugraph_logo_2.png similarity index 100% rename from docs/cugraph/source/images/cugraph_logo_2.png rename to docs/nx-cugraph/source/images/cugraph_logo_2.png diff --git a/docs/cugraph/source/images/descendents.png b/docs/nx-cugraph/source/images/descendents.png similarity index 100% rename from docs/cugraph/source/images/descendents.png rename to docs/nx-cugraph/source/images/descendents.png diff --git a/docs/cugraph/source/images/k_truss.png b/docs/nx-cugraph/source/images/k_truss.png similarity index 100% rename from docs/cugraph/source/images/k_truss.png rename to docs/nx-cugraph/source/images/k_truss.png diff --git a/docs/cugraph/source/images/katz.png b/docs/nx-cugraph/source/images/katz.png similarity index 100% rename from docs/cugraph/source/images/katz.png rename to docs/nx-cugraph/source/images/katz.png diff --git a/docs/cugraph/source/images/pagerank.png b/docs/nx-cugraph/source/images/pagerank.png similarity index 100% rename from docs/cugraph/source/images/pagerank.png rename to docs/nx-cugraph/source/images/pagerank.png diff --git a/docs/cugraph/source/images/pg_example.png b/docs/nx-cugraph/source/images/pg_example.png similarity index 100% rename from docs/cugraph/source/images/pg_example.png rename to docs/nx-cugraph/source/images/pg_example.png diff --git a/docs/cugraph/source/images/sssp.png b/docs/nx-cugraph/source/images/sssp.png similarity index 100% rename from docs/cugraph/source/images/sssp.png rename to docs/nx-cugraph/source/images/sssp.png diff --git a/docs/cugraph/source/images/wcc.png b/docs/nx-cugraph/source/images/wcc.png similarity index 100% rename from docs/cugraph/source/images/wcc.png rename to docs/nx-cugraph/source/images/wcc.png diff --git a/docs/cugraph/source/images/zachary_graph_centrality.png b/docs/nx-cugraph/source/images/zachary_graph_centrality.png similarity index 100% rename from docs/cugraph/source/images/zachary_graph_centrality.png rename to docs/nx-cugraph/source/images/zachary_graph_centrality.png diff --git a/docs/cugraph/source/index.rst b/docs/nx-cugraph/source/index.rst similarity index 100% rename from docs/cugraph/source/index.rst rename to docs/nx-cugraph/source/index.rst diff --git a/docs/cugraph/source/installation/getting_cugraph.md b/docs/nx-cugraph/source/installation/getting_cugraph.md similarity index 100% rename from docs/cugraph/source/installation/getting_cugraph.md rename to docs/nx-cugraph/source/installation/getting_cugraph.md diff --git a/docs/cugraph/source/installation/index.rst b/docs/nx-cugraph/source/installation/index.rst similarity index 100% rename from docs/cugraph/source/installation/index.rst rename to docs/nx-cugraph/source/installation/index.rst diff --git a/docs/cugraph/source/installation/source_build.md b/docs/nx-cugraph/source/installation/source_build.md similarity index 100% rename from docs/cugraph/source/installation/source_build.md rename to docs/nx-cugraph/source/installation/source_build.md diff --git a/docs/cugraph/source/nx_cugraph/index.rst b/docs/nx-cugraph/source/nx_cugraph/index.rst similarity index 100% rename from docs/cugraph/source/nx_cugraph/index.rst rename to docs/nx-cugraph/source/nx_cugraph/index.rst diff --git a/docs/cugraph/source/nx_cugraph/nx_cugraph.md b/docs/nx-cugraph/source/nx_cugraph/nx_cugraph.md similarity index 100% rename from docs/cugraph/source/nx_cugraph/nx_cugraph.md rename to docs/nx-cugraph/source/nx_cugraph/nx_cugraph.md diff --git a/docs/cugraph/source/references/cugraph_ref.md b/docs/nx-cugraph/source/references/cugraph_ref.md similarity index 100% rename from docs/cugraph/source/references/cugraph_ref.md rename to docs/nx-cugraph/source/references/cugraph_ref.md diff --git a/docs/cugraph/source/references/datasets.md b/docs/nx-cugraph/source/references/datasets.md similarity index 100% rename from docs/cugraph/source/references/datasets.md rename to docs/nx-cugraph/source/references/datasets.md diff --git a/docs/cugraph/source/references/index.rst b/docs/nx-cugraph/source/references/index.rst similarity index 100% rename from docs/cugraph/source/references/index.rst rename to docs/nx-cugraph/source/references/index.rst diff --git a/docs/cugraph/source/references/licenses.md b/docs/nx-cugraph/source/references/licenses.md similarity index 100% rename from docs/cugraph/source/references/licenses.md rename to docs/nx-cugraph/source/references/licenses.md diff --git a/docs/cugraph/source/releases/index.rst b/docs/nx-cugraph/source/releases/index.rst similarity index 100% rename from docs/cugraph/source/releases/index.rst rename to docs/nx-cugraph/source/releases/index.rst diff --git a/docs/cugraph/source/sphinxext/github_link.py b/docs/nx-cugraph/source/sphinxext/github_link.py similarity index 100% rename from docs/cugraph/source/sphinxext/github_link.py rename to docs/nx-cugraph/source/sphinxext/github_link.py diff --git a/docs/cugraph/source/tutorials/basic_cugraph.md b/docs/nx-cugraph/source/tutorials/basic_cugraph.md similarity index 100% rename from docs/cugraph/source/tutorials/basic_cugraph.md rename to docs/nx-cugraph/source/tutorials/basic_cugraph.md diff --git a/docs/cugraph/source/tutorials/community_resources.md b/docs/nx-cugraph/source/tutorials/community_resources.md similarity index 100% rename from docs/cugraph/source/tutorials/community_resources.md rename to docs/nx-cugraph/source/tutorials/community_resources.md diff --git a/docs/cugraph/source/tutorials/cugraph_blogs.rst b/docs/nx-cugraph/source/tutorials/cugraph_blogs.rst similarity index 100% rename from docs/cugraph/source/tutorials/cugraph_blogs.rst rename to docs/nx-cugraph/source/tutorials/cugraph_blogs.rst diff --git a/docs/cugraph/source/tutorials/cugraph_notebooks.md b/docs/nx-cugraph/source/tutorials/cugraph_notebooks.md similarity index 100% rename from docs/cugraph/source/tutorials/cugraph_notebooks.md rename to docs/nx-cugraph/source/tutorials/cugraph_notebooks.md diff --git a/docs/cugraph/source/tutorials/how_to_guides.md b/docs/nx-cugraph/source/tutorials/how_to_guides.md similarity index 100% rename from docs/cugraph/source/tutorials/how_to_guides.md rename to docs/nx-cugraph/source/tutorials/how_to_guides.md diff --git a/docs/cugraph/source/tutorials/index.rst b/docs/nx-cugraph/source/tutorials/index.rst similarity index 100% rename from docs/cugraph/source/tutorials/index.rst rename to docs/nx-cugraph/source/tutorials/index.rst From eb74be7499666e06d4e5efbc3dd988ff3ecf1f40 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Mon, 16 Sep 2024 10:44:29 -0700 Subject: [PATCH 383/384] Add initial build file --- build.sh | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..a2eceaa30 --- /dev/null +++ b/build.sh @@ -0,0 +1,165 @@ +#!/bin/bash + +# Copyright (c) 2019-2024, NVIDIA CORPORATION. + +# nx-cugraph build script + +# This script is used to build the component(s) in this repo from +# source, and can be called with various options to customize the +# build as needed (see the help output for details) + +# Abort script on first error +set -e + +NUMARGS=$# +ARGS=$* + +# NOTE: ensure all dir changes are relative to the location of this +# script, and that this script resides in the repo dir! +REPODIR=$(cd $(dirname $0); pwd) + +RAPIDS_VERSION="$(sed -E -e 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2}).*$/\1.\2/' VERSION)" + +# Valid args to this script (all possible targets and options) - only one per line +VALIDARGS=" + clean + uninstall + nx-cugraph + docs + all + -v + -g + -n + --pydevelop + --allgpuarch + --clean + -h + --help +" + +HELP="$0 [ ...] [ ...] + where is: + clean - remove all existing build artifacts and configuration (start over) + uninstall - uninstall libcugraph and cugraph from a prior build/install (see also -n) + nx-cugraph - build the nx-cugraph Python package + docs - build the docs + all - build everything + and is: + -v - verbose build mode + -g - build for debug + -n - do not install after a successful build (does not affect Python packages) + --pydevelop - install the Python packages in editable mode + --allgpuarch - build for all supported GPU architectures + --clean - clean an individual target (note: to do a complete rebuild, use the clean target described above) + -h - print this text + + default action (no args) is to build and install 'nx-cugraph' +" + +# Set defaults for vars modified by flags to this script +VERBOSE_FLAG="" +BUILD_ALL_GPU_ARCH=0 +PYTHON_ARGS_FOR_INSTALL="-m pip install --no-build-isolation --no-deps --config-settings rapidsai.disable-cuda=true" + +function hasArg { + (( ${NUMARGS} != 0 )) && (echo " ${ARGS} " | grep -q " $1 ") +} + +function buildDefault { + (( ${NUMARGS} == 0 )) || !(echo " ${ARGS} " | grep -q " [^-][a-zA-Z0-9\_\-]\+ ") +} + +function cleanPythonDir { + pushd $1 > /dev/null + rm -rf dist dask-worker-space cugraph/raft *.egg-info + find . -type d -name __pycache__ -print | xargs rm -rf + find . -type d -name build -print | xargs rm -rf + find . -type d -name dist -print | xargs rm -rf + find . -type f -name "*.cpp" -delete + find . -type f -name "*.cpython*.so" -delete + find . -type d -name _external_repositories -print | xargs rm -rf + popd > /dev/null +} + +if hasArg -h || hasArg --help; then + echo "${HELP}" + exit 0 +fi + +# Check for valid usage +if (( ${NUMARGS} != 0 )); then + for a in ${ARGS}; do + if ! (echo "${VALIDARGS}" | grep -q "^[[:blank:]]*${a}$"); then + echo "Invalid option: ${a}" + exit 1 + fi + done +fi + +# Process flags +if hasArg -v; then + VERBOSE_FLAG="-v" + CMAKE_VERBOSE_OPTION="--log-level=VERBOSE" +fi +if hasArg -g; then + BUILD_TYPE=Debug +fi +if hasArg -n; then + INSTALL_TARGET="" +fi +if hasArg --allgpuarch; then + BUILD_ALL_GPU_ARCH=1 +fi +if hasArg --pydevelop; then + PYTHON_ARGS_FOR_INSTALL="${PYTHON_ARGS_FOR_INSTALL} -e" +fi + +# If clean or uninstall targets given, run them prior to any other steps +if hasArg uninstall; then + if [[ "$INSTALL_PREFIX" != "" ]]; then + rm -rf ${INSTALL_PREFIX}/include/cugraph + rm -f ${INSTALL_PREFIX}/lib/libcugraph.so + rm -rf ${INSTALL_PREFIX}/include/cugraph_c + rm -f ${INSTALL_PREFIX}/lib/libcugraph_c.so + rm -rf ${INSTALL_PREFIX}/include/cugraph_etl + rm -f ${INSTALL_PREFIX}/lib/libcugraph_etl.so + rm -rf ${INSTALL_PREFIX}/lib/cmake/cugraph + rm -rf ${INSTALL_PREFIX}/lib/cmake/cugraph_etl + fi + # uninstall cugraph and pylibcugraph installed from a prior install + # FIXME: if multiple versions of these packages are installed, this only + # removes the latest one and leaves the others installed. build.sh uninstall + # can be run multiple times to remove all of them, but that is not obvious. + pip uninstall -y nx-cugraph +fi + +if hasArg clean; then + # Ignore errors for clean since missing files, etc. are not failures + set +e + # remove artifacts generated inplace + if [[ -d ${REPODIR}/python ]]; then + cleanPythonDir ${REPODIR}/python + fi + + # If the dirs to clean are mounted dirs in a container, the contents should + # be removed but the mounted dirs will remain. The find removes all + # contents but leaves the dirs, the rmdir attempts to remove the dirs but + # can fail safely. + for bd in ${BUILD_DIRS}; do + if [ -d ${bd} ]; then + find ${bd} -mindepth 1 -delete + rmdir ${bd} || true + fi + done + # Go back to failing on first error for all other operations + set -e +fi + +# Build and install the nx-cugraph Python package +if buildDefault || hasArg nx-cugraph || hasArg all; then + if hasArg --clean; then + cleanPythonDir ${REPODIR}/python/nx-cugraph + else + python ${PYTHON_ARGS_FOR_INSTALL} ${REPODIR}/python/nx-cugraph + fi +fi From 3005b80a77ee1d8af1c8c5be20a4d422ea232a40 Mon Sep 17 00:00:00 2001 From: Ralph Liu Date: Mon, 16 Sep 2024 11:36:30 -0700 Subject: [PATCH 384/384] Add initial GHA scripts --- .github/workflows/add-to-project.yaml | 20 +++++++++ .github/workflows/build.yaml | 62 +++++++++++++++++++++++++++ .github/workflows/labeler.yaml | 11 +++++ .github/workflows/pr.yaml | 59 +++++++++++++++++++++++++ .github/workflows/test.yaml | 33 ++++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 .github/workflows/add-to-project.yaml create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/labeler.yaml create mode 100644 .github/workflows/pr.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/add-to-project.yaml b/.github/workflows/add-to-project.yaml new file mode 100644 index 000000000..6fec09bae --- /dev/null +++ b/.github/workflows/add-to-project.yaml @@ -0,0 +1,20 @@ +name: Add new issue/PR to project + +on: + issues: + types: + - opened + + pull_request_target: + types: + - opened + +jobs: + add-to-project: + name: Add issue or PR to project + runs-on: ubuntu-latest + steps: + - uses: actions/add-to-project@v0.3.0 + with: + project-url: https://github.com/orgs/rapidsai/projects/47 + github-token: ${{ secrets.ADD_TO_PROJECT_GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 000000000..cebd7f515 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,62 @@ +name: build + +on: + push: + branches: + - "branch-*" + tags: + - v[0-9][0-9].[0-9][0-9].[0-9][0-9] + workflow_dispatch: + inputs: + branch: + required: true + type: string + date: + required: true + type: string + sha: + required: true + type: string + build_type: + type: string + default: nightly + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} + cancel-in-progress: true + +jobs: + docs-build: + if: github.ref_type == 'branch' + needs: python-build + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.12 + with: + arch: "amd64" + branch: ${{ inputs.branch }} + build_type: ${{ inputs.build_type || 'branch' }} + container_image: "rapidsai/ci-conda:cuda11.8.0-ubuntu22.04-py3.10" + date: ${{ inputs.date }} + node_type: "gpu-v100-latest-1" + run_script: "ci/build_docs.sh" + sha: ${{ inputs.sha }} + wheel-build-nx-cugraph: + needs: wheel-publish-pylibcugraph + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.12 + with: + build_type: ${{ inputs.build_type || 'branch' }} + branch: ${{ inputs.branch }} + sha: ${{ inputs.sha }} + date: ${{ inputs.date }} + script: ci/build_wheel_nx-cugraph.sh + wheel-publish-nx-cugraph: + needs: wheel-build-nx-cugraph + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.12 + with: + build_type: ${{ inputs.build_type || 'branch' }} + branch: ${{ inputs.branch }} + sha: ${{ inputs.sha }} + date: ${{ inputs.date }} + package-name: nx-cugraph diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml new file mode 100644 index 000000000..15569e01d --- /dev/null +++ b/.github/workflows/labeler.yaml @@ -0,0 +1,11 @@ +name: "Pull Request Labeler" +on: +- pull_request_target + +jobs: + triage: + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v4 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 000000000..05d8ab765 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,59 @@ +name: pr + +on: + push: + branches: + - "pull-request/[0-9]+" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + pr-builder: + needs: + - checks + - docs-build + - wheel-build-nx-cugraph + - wheel-tests-nx-cugraph + 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 + with: + enable_check_generated_files: false + conda-notebook-tests: + 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/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 + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.12 + with: + build_type: pull-request + script: ci/build_wheel_nx-cugraph.sh + wheel-tests-nx-cugraph: + needs: wheel-build-nx-cugraph + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.12 + with: + build_type: pull-request + script: ci/test_wheel_nx-cugraph.sh \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 000000000..38c42296f --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,33 @@ +name: test + +on: + workflow_dispatch: + inputs: + branch: + required: true + type: string + date: + required: true + type: string + sha: + required: true + type: string + +jobs: + conda-python-tests: + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.12 + with: + build_type: nightly + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + wheel-tests-nx-cugraph: + secrets: inherit + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.12 + with: + build_type: nightly + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + script: ci/test_wheel_nx-cugraph.sh

+bipartite
+ ├─ basic
+ │   └─ is_bipartite
+ └─ generators
+     └─ complete_bipartite_graph
+centrality
+ ├─ betweenness
+ │   ├─ betweenness_centrality
+ │   └─ edge_betweenness_centrality
+ ├─ degree_alg
+ │   ├─ degree_centrality
+ │   ├─ in_degree_centrality
+ │   └─ out_degree_centrality
+ ├─ eigenvector
+ │   └─ eigenvector_centrality
+ └─ katz
+     └─ katz_centrality
+cluster
+ ├─ average_clustering
+ ├─ clustering
+ ├─ transitivity
+ └─ triangles
+community
+ └─ louvain
+     └─ louvain_communities
+components
+ ├─ connected
+ │   ├─ connected_components
+ │   ├─ is_connected
+ │   ├─ node_connected_component
+ │   └─ number_connected_components
+ └─ weakly_connected
+     ├─ is_weakly_connected
+     ├─ number_weakly_connected_components
+     └─ weakly_connected_components
+core
+ ├─ core_number
+ └─ k_truss
+dag
+ ├─ ancestors
+ └─ descendants
+isolate
+ ├─ is_isolate
+ ├─ isolates
+ └─ number_of_isolates
+link_analysis
+ ├─ hits_alg
+ │   └─ hits
+ └─ pagerank_alg
+     └─ pagerank
+operators
+ └─ unary
+     ├─ complement
+     └─ reverse
+reciprocity
+ ├─ overall_reciprocity
+ └─ reciprocity
+shortest_paths
+ └─ unweighted
+     ├─ single_source_shortest_path_length
+     └─ single_target_shortest_path_length
+traversal
+ └─ breadth_first_search
+     ├─ bfs_edges
+     ├─ bfs_layers
+     ├─ bfs_predecessors
+     ├─ bfs_successors
+     ├─ bfs_tree
+     ├─ descendants_at_distance
+     └─ generic_bfs_edges
+tree
+ └─ recognition
+     ├─ is_arborescence
+     ├─ is_branching
+     ├─ is_forest
+     └─ is_tree
+

M^CzZYJ{U(;hM&;D2BzE7^$fiZ5egA%28D)UN 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ʦPmp&t*1A3u+?i%1ql*L)?( zirY_FA>HHMKJ1`RIUCf=ZKU(%x{~ zsAE*F_gL^TunqSLVbPkkYoiLZgQo^pR%;^G5OuDP@(V@x zgk&)!e?mwHa@pkA&^nxL33bC=A5NbV)%oLLJd$nb=p<8W_KLJ41vf-E>rS_F;) zbnMi)94-7KJ#Eu$$nS~Z3dZuU4MByAtsh%&ogF0*kZ6*mj>YYmCU)5$pm^Zd7TZbq zD<&FHEd~~doMScUbWiisHYm13qNMOA+$q6uucuc7tN0@i zed)bZ&7UuYE>NtyWeQk@=q2t zk5i1&vxBnR7SLl_Y<*pT%QhgQFWQOputg)CRxYFlJ&~0v1XCT7(v)Yf2$4yL*Ti3?HF3h`@!0g%>3R z?0aR?%0^q1sw)N#urhb6!|eQBDGG( z_6fq0x&2mB)@ux?rd#fDD7n<)NN6oS_w91YNzGDvo~UhqKpUQQr}?G>0YOYU!BpLL zt8UAwEzH_FL&2A*hOsErb3LG&E#xA@vFQsR*GzMgW;4f}{h}?3b1Fvo_w+q7BoiK) zD4U$)!d-RYydCr1{k~}5UR^VQ>a`O}CSMw2*hU+0%iN<76k-cc|lOu71>3IOZ zP0sKaHa}-(8FF5H2syrVGmMBUPSd`Q+bAAZuTo80rJELMR%vrFGkVIrV;>+N_wO8K zqW@Ue;ILch)z3XR>5%9)!36%-GOE1U982xZqHXgnF|3Dn^jX%X$ejB}2ji?lT$5f* zaYKUcrn2~@^oy||k6^;Vc%K2gLju0uK%utc*D{dp`i*kBVZq8K?>Csuassyd39PEk zwLxEWc}XF-B%yJn>aJI0#29{?%y6P9?WOPgPJK@-*oO0bqUq?70))x&Kyv~Dq^NYu zC#nuUvGgg|tKS0Db&X(ca8}b)`A0tt+fXr4@Zi!+OK}fOAj?n^#dPLM=KCVyJwXu0 zHKG*A&$x8d?-qWHnR9@9_UV;^#PGbzQ(MrtHQ(+*`r(u7V zNOtY9KA@cSbw>T2vKm5fh09z=-K3^>Lx-$fc(`Q1eE_D=(-$f#93rG$eSuG_i8^nJ z(&Q0(U6oy&aU)610;sIEa+ixxUOy(m0W!*;+rDNK*Fv3nedLU5{+$1I;A{drBzWGF z)*~-zc+O}>z59z1S0HdV-E=z75XxT(C${S%UZ&(QR4!X!Ayha2AX8ne+LRhJ@w0>) zIoyQ=YE--_3LV*}Xq}OpuZmZOzf29udN#zmyF|~i(}dMkwG5^A4=dbud^ktWQI6$& zJ(=EpvxKL=w(X(OX6%r*AGTRd68k44rptjg(_AwhgCQ(Pp12ig*)-QH_6~4_sVX7sN1ERT0K(cD_lAjg2|h63lc__g9Q-PC*xm zcJOmbXYAvz7S``?gQ9^-P@~z8am~qH$>ajV$d=(O-$Ua0<&$Gh$}fL1tru+iv3X?j zv-FyS+E&G-Tg_>s!K(h4%+o5QOHW>>vkq0APn&QjaM;K9kD8-ILa8lm@f$<8s9zwv zYKc7ktZeZ^tE9NrUv;62x-Bg^proJ4xxI}eeDgfIzkg!G8TRt7Stq>;C~=U`!{>wc z8amNcAF(h=^}!<;Tk|gy4D2S?Z6SR^Lfs--&2^Rc%7Wf5v6hQEz;ia=k=@oVjNJbt zwn7(>7}|iX@7h@nr^hvCxliQ68hfrhH0Ixy&D`$Nl}$zBgf$5N_M?#B!+-6yu87`U zBPzf?Ne|B&MiS{|MN(2OAVA)iI#66;S4@&=GZo}@=Hyq03_E+dLR^>k9jbFo3V&WI!Cq>q+Mo7cxj2-SXiUPntQWdCdv7KlCF-E_bOiNFd&AUZ>(L z(G`|jTO#E^GBPI`o&m|sg))-lkfK7ZHx-vZGI%rK5^6!+!@d@hPp@7P`?_}KYs|)G zj(|;YkOYxy(d-`|GnPkst-L_5tdHi5DAO7(2K>(nB;1@eVkg|Tw^T| zFU1plf_1F)iAEwJ4if%OEX*7fLVcpXd}a#&tmQkqU^)kttet+c>c<8fuYMv*1G#I; zUoimH)D>;FRAXgwh-F!%xgn!vQKhIb>|3JVlU?;eBxmrZnvD7?6++*8g`c`AvBSZh zXCd&NWzDNen79cs5J@B+FS^H0f{Y&07R-1VPLV3RrRf97B-}3wsWAK4_oX_aEr*XN)%h3Nw;Fr@ zHRh%9@0J65u${JV3FX5E+dmRsS?nmdK91@Ahfl@U5PKwQXHd+LW==NvcTF?BYoReyA~- z`6YTO!$hoerQXrW_>6M_VF@m2hJ$3}@PRjXtcL-86Ba0~Fh4ttgWm~Ru4-)TrN7gE zy8J0S1uZ`uNuAv)U1oo8H~+j={Q67(4}dP3?ZFfC66=aW&NZ*xU7FgIYQ=BCOvra> z>9*d}BAiYMJwx6-ro3*u*=c5US!`YZ&98CkdCVJa#`|zIucH9ee$*rAw3!2iBBV)! zs?0tjuH*mA`XZAiN-OH@k145OKw{~S`34c8jgtfNSLti>_znU)*6lk*v4w-{v!n#m zK2%ecyLMhCowg->;Vnix3NNa?rM%vQFhJ%Y*)AZR<6ob^cuq3iNia6XEuF*s)(ruF z`gsh5cO=_Py$*Pqqdrs8`7-QOtE<0qI-Lxo_Ba;lMt7u}63;)s2wMTQ^f%08Pg&Ip z8@&C*dL11>b(oeDl8q)~AzCHVFyj)_>t$0wa`GG$pN+k7i? z`$8gK7=m%XvJGRoAQX#sin?2UnQw0v*0SlNl1d-U ziRMz<{oxCTKn||B6bfDQ_ipdJ)Q?hnf#f48?=$}6T5ANWiKa+PR25jYcg4MgMI*ok zM5IB7PrsaLebizmv(^~B>B#SaOy)lnE)I=HPVSFZd%w5Nq z`llehFU4{jPElqXBb>-&59$X1X`-m5zn7``hO?A}ea`}cmXV|jh5!#q+`h!aeoCF~ zVCy+S)Nd6!yIvLZG5M|1%`=?oo)wyVl?rE9!?dqVJF%9j>6;2%LJY5>+Fr53lH(LM zc*`b~B}zT9Aj2E%4JQ+LO9-1t`lN8&&c8znAF^D}q-ID}$=syrXw6IT1e9_T6#~Bl zs?olVUBtzro$$=`^daG7XqDHOX@ZLlJGgEs&CrJBz_10Y+9i&l-tP^k)n2ta2J zm66V^>V8wbr=>zZ( z#XZLkP)ln?W+vDV)$H_(Wa{t0Pu&+JS#?I?}(n+(Gsg_$3XS1kX9&nMfe=w<>?uyjb(B{}* ztUtA{?m(0dC=_$sEo3qwE@<-1I~7!nuB3`OZm>56$ycaj^R{Y2dJyRSZ69f>n9+p- z)hwPJ(^p$V#;Q!ms;|XxI{KtPw<}jQ-sutev>WiLLG##dcGsUPFAZ5M{TcXXv5eXr6b0PyELt7TB|b_U zps4?>htwo}?GQRPvtc^yxrKM!Y=GHa1RN7M7#-VU@zy|_EQdP7U`>auajtsywhxLL zjHUXlVJ?m67XYwt&!qvGl%apAJx%{0BEC5rrsY|j z^#ae|kj3rU!6fu)<9tg8XZ(DOJ{P!srG=>xvGGzvn~h{wncq}L?;i{6>{Ds}t)T9-n!hL*SNu#B(qN6(}bv0m!D zVbUuP1^*;)b{eb)JscR_qm`don7dL{3109gQk%3*?_|$h4!4b_X3}Ny)Dol&ouq71j|55H%WP;ewnW%+@+iP2FYPi{s^9n zryNQ(hfZp;`Wg^0)kecc92unI7_Cm_klb;SZDN~;&LoF(S?atsO6}|sr3kjrl-JIr z-=-++eEG4IPUY5d&Jno|0v6aDCukD%R=P6}FO;>QR`te7Yg>D9AsVt=+0#iq|68%7 z{><&~4lvnCa{psk{%=+Hf4<*GP_PKsUs4Fx4l{q#3+-6-!02NX4+V&GtYEctXlr6I zYwVpQ^hR`js5|v`ZqJ31BhLMv5+a3PrxI=_NOqyeh*jk?MjBFksf>SfB zcTa@mM?rIYrk+QXW4Lb-IQASB8-eFg)~(4D;Ps=r1HZ~|TOC|c_`&n7UJXF^)R2Q4 zAg$5E1l7GqP!XbC8m>0FRdi<=BP9%m$GSMc_N@54rs|EUvhr@ICNBT_#oFq#s&~>* zO~D5~#bn7cDZ7ApZMj86lznri-jX5!eCcIO*LfaIFGRc<@Dc%KPnI?#n8x^{Z-%N$! zqqfDDVbPc2fM5J+trnT(96}?sd4)(@5-*f};z(xC=Ee(Y^IF-mGjtE_UE7^6^;5fr zJKMQqc;4YXpC?X1e7dD)K>zAmxNnBMMB4@NaHtf-?zni#6OZTku& zOYCe;dByN)*`BGyqNU8I$MqkF#fE_Vzi4sMWfNQ*9ar!B5wh)@3Hu@Yv`L6n%LBgQ zYtg~Bb)8*epdYvXT+sl><9t$R_(1S`Lb&HN~rWPXZEFbtvFSX`{#>7*xQ#wsfOw+)Zatg+nIx%yCNHX@#a3!Xr zDg*3bm6wP9h_!yfJ_b|YMjE~;3UX3`!9s}57>Xh0y6dTI<#FS76Q8bvI-MJy3XJ34 z35M@jyCt{&5$+7@mQzC}*I`L0wv<=|YRH9H7qh|A+VC9FWEWrC*{pRtUy5W7gWUm~ z;$o(W#v9@tG^afNKEa5)a>) z&OU~%5t&bs@!Eg~M6#d9q}ZqVyR~v4ck)Qbi5E6Cjx`q*o9J*&td2vT0nr?N%cyPNX^&9B;21K!S!y(j=u^Y z6pJB4PXLQIlxJnJ`~CnHKIN@8yoPQ#aodPkrM5Bgw!G<jqt{KGRKkXI#SGhb_33eYPZlT!YIU4;%&tZd@9^@wZqw+m9*f>r)?Wp$jf z_CXHYwxyD5H)ufiJ=!IB^LDoDqM3bdlS%wga$TJ1iaYiu(*Ep84Q$vR-731QQp!e# zrSZ0NR-KQsOk}rYQt+xQ30%lb&4!?r3uH3oc|g~rGbOh!T7-t$m)?5Zc%Wb@0F`n4 z2L^4&LCP)8f!(lOiz;1tBTS!Yt0=DLjkYo6={c70;Q9>FzvM!W#Hy_yf&#B{D40Vm zXFL5FG(g1z;n2tXMnA0T8C1c1)*-sDBo9l}RQcmW%Hm6@%tcb?LV(<=sJOT@Fs?Bp ziU*r=O>ZWov_cx@`1nY&Ex8Sk@(JMe_Fi#;!1v1w;3&)O6|!Q2p^C0zh`9VC#O4Cr zH8N~FBrGaWsOwr@lN`w>?C}9yhKkL;gZyuPJ4u+gh%KHC19i992RYwAc~`BB$PZBZQS8w zCzRf_x*|T2#A#jg^TEp5R6|~8paBujL(YHMXt38e+A6rbf0a44d&s3v2ZqFYIeIB3 z7{O~bdj{&{8DkEFZK21{_meFcJMCcFtG;3^x)`u_RT_b_-nHn2+M#efozZW^y&lb$ZE=xQHvCsI7W3uuC z-wWD+3=TY5eOE6$EK7JP&SO6&$!0#PAL}Eb_5wXr+Jfc^{)ufL1Pa+O*A^@E`;`}` zd2to-rs}>d0ByV)UqL!J()gb2x52F`t{=w1-AS}`%%wKd73&eu(pr6DnR)+x1&=7S zdtu6UaT&(i{`o|SHj^{;dE?7C{dp6sKlS<8oHOkc4#sVRqt4Ic zJH3N;{UM=!oEJ&R&nI&8zNCLO<@2$$v2vA`bGyp@QJgQuS7_C;k6L|> zJyT&oG{Jn#@%ElLx*ra-B_zGK^724DdRAUqSuoP>tlylO8viN^&3T@CWH9SW{`bVZ zbI~6N@1=r!TZ{y+fJA^Zb5|DiWU=RHA8HxuV;KYmpRkATF_`Y4xjIm1Zf&NMejh(r zhv+$KadTEfI2pzCC6&Jw7w56eBHP7=_|2H=m+8_Zw2>K?k7DO5z3TP3dmvJpQjyYZ zVBEz68$;d08cT^i80@OI6?|H&JQ!Kx3mMJJpq*QN zG0Ix?$^O3v?Y*6Rd%}@V8SMYBzMx>A1-FooeX5Rbz`w#(zy$?-e^n2Lh%n6^+VD^Q z#<3eTJz>D`ZmzD0?qpufAG(zu$O^j(aa+n?j~XR8OvigqYp z3Gz2p+zW<0y4#$n>ShV+Ys8IF0Gfjvq0O{P^@$=|PWG`s(rKNVX9Z!)v^-Y0N@Pi! z=0XfSBx#NGPY`nM4#&DDgWC_O{{%`MzXtRKFA@EKU931kAb^LDxUgt7~Ce8qY9xFNWzZOD@6{N1cBZ`vqBV z!@JC4_aIq8kUoaNx`Q`pf&>sgllk1V+|tuoni8Yq7Q=6-HZW0xYXX~qSo#Gw12F?I z(yiE+)^!H{&ry>=8ku9)y-Hjiy;6S73Rl6@!EO9ZU8i=H1~QmH158i)?jx;2+kTN1 zdd9;wcbFxH$@i4bigI6YV+wvIWygSa@aWC(^d1hr+F)nnna>p{hol#U z9LRW{Vg6I-RjKv5kyQ*s7Du~KfCjyn5;W)N%#QQ zzv0;zt&c0YelSf1vw+6agN0vu{oTrVz+OU}-`rJ(yQ9JD$UWW`(-FGfs)bEogGrY! zQ#oB<9ph>idQMrAG4#RdlGZaK8bEzfLg*WL!Cs;_)~n zLNg|DC8;V}co-F2j=Y(k$ zP3kmMdCVl8?*N>_skXbP`@=0L=)tPikOc?N%yl)C+1tGLcGbPMV0!?dR!jjFz8IgQ zq{AG+MF9X0hjGg$H6VRDUAQ*b@j_hxMd%Xa&8VUa8{OuCmTPX;O4}w=FVul#c%%hJ z&8G+gym$e+w6A(=fw+tGZE~WCH^QpSx3GSpdhDza(ssU8D14^tGG%SbTjkrdMB4bV zO8+r@!AP~0H{j@zh`i|K+jvESm~=^?pd#5xsfSj$T>JIhuva9%-?&b;W$Mr3!gowH zi13aE+OaQ>oz_jBG8pBx8Y@sq{!@1Ro~rx#txy&TNSu%RVw`27Wn{$&{0)eD+%wPp zTMF$TSi0St4FOeUsNZ`7gTLn2WGA~5_0NYk6C6ntVLm9Z&r?i;4zH6A-zuUbXrS&oG`!ardeZ5h3k0<3AZTc0jU$} zn8czJ)p*lKDix=+F;b5spC}6^m4F@-fZJS_wRH6HW8-e6e{yf-67{nx{%;}InAU5J zfh9K+Vv5>LQANr|hZoL6pZ2gSUULpJzLegn(ymdnjQ9&)TQ;YN_)k5JZjcf9I!gWb z^Cbl4(asEW;H`7CSOzqu``+8b!Q={k#BwU3gzeFL_-Awrfqn7qU-?&y_d>A@m4)U@ zedg{CL0DeKW>g-1a9)rFdXvjMGn(9T8N6VlS2a5gOt&pgItNdvdhFD-Y0n=~j1EpU zTJdp@gD*LN<}DV=4#Phe7=yFWx2HE_fx|r~c}Lfm8ohOj(4uJ=5fk!VQN+KtQM^XM zua7v~;RmqqWOv7_Z#~KMHm`|&aK&%o6xRN>si{F14Mq`Jzms|ECJ z77~abX1Wj?57c!lQ7?*%1Bp|LfTyTyv{G>3fZpR`EU`BI99p-Q-(25fEg>{r`0RC9 z-q`R)f}GQ3!z!^ab1zG{nY$7}31nym4oVn6u_CsyhZbY;2k%S$=w-PseUn$ng{B5r;kdGqa{{IMjtDw5V zZd(x7ph1H}u#H241a}W^!5xCTvvIfJ?iys{8+UgJ?y_-rr#apA-*awP-R}Ax)_hto zYgK(?jycB|O{WVUMWbTz@l8D=n?HYfT!$Vm3b|d=Mu_cccse2lyO2@eJF{?*1 znMa(YBURG;4HK2JKiXTO?0Q#E@FfDAP{3_$vg1JGn;3feH7}SRBOA6OL_he&v@_{* z7A=-LE{3w|-lP25uj{H83VctFi9kZyPMR#3< z&z#SAuxJH%{Z*6Q9DUO_#qCH_NZe5KH9`npnI#6vL4GACN!Lu7AWXSfdjJ2Na}k)I z;rkratp6Y90$#K=9k^K3G~h8;$s@W?Qkh?^b>vXYAQo|cmof2cw+$OS5xkxi&)r4U^iR@rFvXSf zI+&SUfG10FiI6;mf_8*Nd;1$sPpxciWjhDsWREj-2a|AECD{hV6XHV`sXW4~V-0~P z=U1N^fx^Nk2#v2JZv8b+R;Z^o%m=w7Ps!$&gCCphg?usIKlCK6INpYkchQvfcJ49H zp@$eGyG8cH68nFJm%lH|$)pnTk3H+LCRNI0d51^y!480NhHEmk8IPKU$H(#3s}loZ z#|BkV_`6YS%@qnk0m_!G7yB@F2li~~KXNHU)k&9PEmZa*0#@U>OR>TkrHwNNt`E1h zs-Bn#fP=;`Afu!G6@`^pm4l1>v4Qt5d$9&y(WXztdvo{9vEWfrrFB#J1?@W)hy&4k zC3jB2KDS;k5czDUX_o(geD(`|*)9)}kO4v>psbA5zhh8u#uxd%;I-zyr^GCM|5OZa za|b8j9`KTpxZyAkE!0{y8ap@wVRd!?)6<89No$W%M>n= zvCR^|ReTPrMb>}lGZiUhJZcTNCO8QsJ*8&g0*erm?$cFELT5qsvad-$P52a=r1qW> z&o4C?0=~F=P0luO9io|HzGUa9rMg{ztux}RL4A(G4#}XsxBl6&+`9CHZR&ZF3UD$( zfiK|YBIqr5VoN%+vORs7p8M(kA1{FA@rD_BZud-G>G-$rgJ0^m&w&IiEWi!-9@V|x zZuq?Kp@YF|I8O?R@UIAew@&$(ox1M3IrEHgpBDs5cD(7c^fQ(UkJL{F!rAIxJH;t5neroAFSs+mz@855cX|G3x~$AC*^+4T zp8^RhjmP?k&<8V=Oe<4pnkJ-p-WKL2u^V*=F$WF!#Qi|;J|arHl+~ge$-I(ZrE|(h z$_to|X**=kZ2U76UQW*!D}yn=vMLazEKRQzhe6SC^qV10FE917{zH(AwI1bLi7<6I{7u(P zp6MMo6`l3q*x|IFsyZr|raIcDOp27*G=KH`NU3J98zyU)O^*bJ+2^3Iw0$}D_M3(`L zk1{HnJ&g0WLxQB+)IC?^b*ymF*m7hBESR&!y1~rLw#NzIq$79!(GBgXn+>KFqWT{D z%uxF_2wqWfVkXe~7gW}s)~t=7wG+xB?LVl&jEP3Gzg9Lf(S5x*z;*X2tVx}}u~cbI z9kt<^{mUQ#iIUZuA;V&izlwU`}RodDDNfYj(ST5I9gyj+PSwXuuzllgojJxMi;0r zlrzZ;0j1ho=WlOu+%iMpZ~!rq4kW~YoOAl#zPK~j=%ut9yHXY`yfFg6Nzo(66M_ z#HK}&ErGp1-45#uCF0KdLO}*MFX;zfWDv_JnN#X8~Vc&rZ1XaV9@fCQiZ6 zb+Mh(0uHPpGI#yt^-GJwh8Bs=jG?z`i}CVHyR4c0T8y}pTXu%(;m=}MY@;!}P8cP~AEI_2HLS!QcoYAVyH#~Q| zd$N#d%j@N{5cAURidsW0`lg18O&T4`IhECh<514=y5Ow-D|xM2oK(4>S9CKKe9knS zrhLiH-C*CWa7`v)Gt`Go7&@Chx)mZbfel+ISQW^h`qj20e5$h>y6@f1--Y5yU z#ifu>_DIbQP1MzBYp{WP_@!ySb%1UBKlqH^pG*`+uJZpMp>>@fG6SN|k8TM&)^-YB zuEyJ$OwG0oA8lh9q;4uN25`}T{2l%-`(R2z;cH9?O&lrW&5GO6^18~ZhdWj05gJy- z+MG%ZaZ2`Ig387AxZv_OSE3~>M_|XoTkIO%6 z@|6WMZU6DjLeam}`J}~-{e29}iwat2YYj^8qS;SFRW((XpXsv=GrL|jeedV&B3eTU zTqV7ei+K1Z#vwFd{2zPL#QtjYb2Z$ z*5=?;TbCAk9V_XQKjQK+O)y}mISJ!||8^^WoSvtxTNkt`{q_rk(T&0{6PnG+ch!B% zYON~}cs)iW7qxIRN26|uNz=JS)i3>Y8H0$&!?=$^E5%QPP8V{xkIWyPyW_m+N56ae zAX7KPM{?L+Jn?uE@g0lqhQAMNcZwV(iLByGv=&fG#|4QR*yGmZbRXY5z#!H1F@ z@QZ?I=ef31{1+pxbxuh+8k!jH3-%}39Bi6}}b;Ka;{27-VwBl;rX~AzEYkp&U>kzYF7h*L-$nqa* z#D~N!|HDKn0$Qytq^iY-1BOf)D3@!kann_M;PC05SK`=OVHLZ$tz9VId(@7Zn_ZP_ zLRCg((da(5_zV9C%Cw{b^C=i9sHYFrVQN?#MD=5gf|zac$z z$stg%%P|HU${^rwOaMaRUdQopDGP{)nC`Y*KWsAf->fpD9XFV#XnoiUn*tT;7-$hlhK0U z8O^6TLmH<*cf1AeTr&Q!4QHlvvOYzp&NUYC;ALEl4bfku}HqT zvPGL3Oka@uu$MPNP8$;TeKt*b=IY6_hDoN_*1t<$Z&3ji^VBSlpgG1 zKMiS+3682MC8E#iqk}A?Wziq00afrzF_iX5i%&)9C54r1Vv0_bb4Aw~82{mBO`U6M z2*ksR3abRS%3{bAM<4z846n6}mPAB$aA9+uL%@&`BU4i(C;6ppW2C<^Z${T-BGsX6 z6sjp?*E0>M#C(MSX7?Zj% z(~oe5Qex@Frm2BA1nQ-8?Q{Bz)&a+NzGOd5`zqD8pRY_UH|GzL-%SVNZuoDQyhcXR z#m`@V!W-M2sADyr9BPzm%+oq70ksfYFzlchuM#r zr(rNb=mXC4cE`VM-8&rgyj<@nMv?%G1%AFj4_Aez%%NE-=eDWTp@iDtl_`4C{qPAV zh?2NMUluJ_XF~C*rmfEYyyH#XRmfp4k9uNPXKDp`@0wMkOdYupTs0yjM4`^)8h2t)Y;N)n=B+5>cpL_;6B+ z_7K%7{wc>Dr40r_iW|l)I;DqAdP}y+l8#~2@(9^9wTv63=MI0}2>AIi17n^(XY6qp z^gCy;8zvbaqR>jrDRkEIfZC=V%NYB;F|kxwlN+l*%;Ju!U!a$`-nQKccsyu<`0%Cr z@`%(Dug0#+tqr=8-jPy)&~3lwAAYSU8fqd1Z1gF9)bIMZ?a+EuyL_Fq~~ z&_NCZ3!h({9o>s`F;7lBcKXgA)^Imwwd*-0NB=zck|bmZ4fLyW6~Zf5-TARz%S^59pG#ACrk$|nUu{akNf-@EI{6mv2GZ@UPkcw^v{fkpGWmMjq}FHTb7$b#qVr)DKL-gV zY`^&H5sGSC%CgCG|BhWSpiRmvwKvu}Z~q_%fwP?Q zqFkrCcI)sxlW=iym}rqw+;| z*v5DmPHQxmR-6yK(n3D5507)qeD->=Kc4HPntLF2XTgllH6om>WeY=V$JP4bfcF_P z*BPC^29l#3t`O-`Wu}bKC@IpXZW+MSQS?dQ;=VzmFpU6T)^~;@W%Q|64>7M(zY_=O+G{o|Pxv9|hxO`CL2yy-E2UP2on5YS3;J<=Kw`){0_i&n1r<0^)K|H)qh7JG ztrO=Bl_Tu6fMG%}6RhqWL8R2o3<+WSNnoQEBxzbn)Y|l3R^-D|hG5H1& zN}^*c5mSBgd~v?b2mfm^Iu3O*d87;uDc*K2=lev_I0KCP>%d&B>A%NDNJiPyQVhHO zq*pk*XQJIyYSX5fn1en{#*@LCqr^?b4@DsPpA|0KY5fJ^3JNU@(X=atGv zvSXj_*K3~wS8dBNEMmj>z>ToX23u1=Vk2)C4tDEtc>jf=K(i` zYyZaQrE}vYMg^kr9GB6?^>5SfGDNnWpNo_l=-qe6SM+kq;s)3h$c82*6K_dD&1%<| z=|7O#-DdoH$U++zX}gu5J~`~G&q*fcD4vW$Q^SJ2OEV?TMGFjm6%Vj%Sg6>!lvEf3 zBoEa5OA*eQJ?i#d(yM(_xmj(^+IEt zZkJ%JV)rQypm-IN6B`q%?fQVxmq7}Hb2#svJBRh(JW@;=t^q1!(bS9rw}JZe5=h?` zHyUknW4?a3N5N!Zvk{fx&DR&U-VBfa3ea;chw3xYMX_s3E4yG@XMt^($@EH7Wj2}$1j@oZA*X-o+92Y?<3yU3RE>x; zS`e>)&<9Rv2h_%WTZ0esrvD%fzS`!>T!jV8M2h~X6IVx5=6uzPOX@b!k!k>Q>2vC1 zfkfRcEzNk*zzL}q_L`!8YoEfzyRvasH_qwDq4kI5~-w_%qg4om4ck0t-^eOd+3=^Cl7ML z)+@f_$`#+=0Dl%eD|8)H`7{L{%vbXs1cEZRgN`R)gTaPSJJoU}%+EU4LYh5fEn-buohq?j&sbmK;vmt2MWQl>cE)!6;0a`t9b&4}> zKX^;B*!cII8M$)SgeDO!?p!wz?G!@qy>PGGFuJq{CEsYyr4TuczdHmhHkN-x98_C4 z-BOPn5{^Rc^KGU(3-YbefK=~RrB}Y!c9^|AOZPtlSQMg6cZ21Ej9CBVnE4ixF0FJN zR5>;!BRK{4DdVvkbDiP+BoN+=TBwoGJ8!R;&}uF}n*o5SzGxo=2;NPs`&QI|c`@tY9dKXh5$$dUi-- za_zL#w+_w0iV&<6d2gHZ>NvR%{k$ zvam=?aZCS@q!Dd)b>Qdqays-CC$vpfpQW_1CFBs8nBG3WwwnxPoKuhzI6V8WbORs# zjP6dC6a;mhIGRuni~P=@QStCE1xo~;`6YR5^#kB7e^?BzG6<*O3$D6AGjxk^-CBQneQo@WY4*E9L4&`2wUvk_;~l#3|^^) z!jfaQ5q~waz$$;1&(kYK#D3@7@s8HIzLLnjIP|MA&eW@~DKAcV39(Z7m1IQu3w4`N zI)@ME)+x!xRQrW>9Nz=JQ`D@?5CY6O7ksDTlEC!c;ykO}Wfum<)JUFtqg}^8LJVTf zjw0dkarqfmV4QvjmwV~RRWf#q@fZD-!M46~&!mGb+EATEQcZP}5>1pWU3Ggg;&cW- zv4dZfeXsMeO&xcKo^O)dzAnEcu_(8X76=0GcqZvWgCl=bWNNhYx&=z2JaH=RGEVf%K^FCVz~d)d29X3nry10%I8_T*Xr$iFX{#K z*;u}05)yem9)vXdJKcV*_CXtU?Axvzs7OT7f33YOxkyNkY-@H{2}W69cAsol3XpFx z&lDjma#~|#FONF2Ij9U`Ze+}@ol5E##b;kUX{O6-y+HO(oYLBjngFAcRTZXHWq41m z-*FyP0EGfF&C&ukA;Q@a|8B0D?D6hl{%C@9VJ>UGBn0DByu=RHk0!yhRJJ_2DXm#B zr?*zvDKagmP(=o8w#Ah|sk3X%I&7))VABi7odh`A#kkdcj}$B1(#M(7iq`qyxR*Fk z+xHp!I-o?c`?+d8T?56{DWaPN8WQ=Xfy&QTlnTa{Q^keTgAI^f$ew)_8_?E2)S<-IT)TEF%w zf2M`VY$%_RycOzAZBfSk}WTY_ssYIIrOCc8du{PtA=sW_Pt8izr(%2BzBb0 zch{gkN=4&^uo-(^V1lymG!eA_wWUBPOmZ*4mfK8V%f=Dop4T?ehohsWBM)(Y(_&70DX<(h;{XIbgV=vIu)HnLgCq>$BH(4joUfaF?f zhr9Cv7n~9FooYeOEH}mGS*gz{o=W@*#%5nfrF^Cz{WNTJH4f1xrwjf=^A%ahX_`<^ zlpBu!v{d-qgXWq-d@*-z#T|(4(8J+3LL~ncxQV zBtO6&KUi@AQE2$XZwfIi5Bllhwti;z%y1OK9rgV1Af$C|CcSr?+rYO^!=BroH~CG4 zwhVSYkZz$yNk2Hk31|Ii3bEctPD@!Nu=vLC>Xjiv1KHYlBx(kpyq~J8nl1&DosbR6 z?Qn{vNDamh<{*V<-K|UV%T4yboz}Z$+}IJb7??bcSNNLb%le_E{t)URDidF-CrijETM|?-k zN)QNQ-wwG*)f8#@YN3O-hpp1S<8Ik-l@a~xG+)-j6=<8o)DFI?bd$``li61*Q3i$C z0gcJ_^xc*v$voeSnfBs-yl%mc!3?L zS7O{QXcZ@WX`5D#(NfWUC%+v*S25Y|tiiM+w?#kDo@5o%)nB{D?~yo8)P~U1%8`kNk3^TzLHS|Xj>b!6S9Kz|2!~o343yN5 zKjA<7F5okuqTYE#O3}Ic4yvaq!pp4;jFum-a<>5Tc7Qvhnpon!bdcho;dcL&214gU zX-8d-7)|xSE`c?g^gh}e6&!te*+g8RU_NJKYx%JHpEB0b_+^9tJdPn}s}2PbS2IER zRp$MRuDzhw+L7pcxBA2V`@;S->{ZOH8j4d1oJG}%;3~Q$;RG8$8+r63q4^OypW%2x zY&>OhMBa09n+Lm|UNH}iJqxawwogr175;sk9Xf_8fh~>>V{@xG~ z@VW?-@os#LrE_atcm1iK=jaeBUbf_){V3;tgy`}$;((aWTR1f_wSzs9eNo+Y_!zF3 zSURwYh2YDV!k5z|>sy0NFC=v5C`JVXHl0VD$M}?B8Us%3nQl>C_1Z;MDJ| za#*sE{BshYwdl({{9s!QV<>=w401dAZN7vO%k1Y$W9Ww@V3Ii5J@FnC`htLdDmV%I z2UlJ}&>5c+yfcQ+koeYo#) zh|9qWUEaA8iiT1Gr^Ogc<-VE1GS<;?@F}sgnsy`av%3#|um$dqq;hufDu2N$8N~DD z=01)dVosXEXAMjCTVN#hBD?u8Q09f%77@_~)?fr>XYfN zT6iWjn217_;diwY2L<<V>_K0KmW$^9!fV^$}y_F!6&al7#^TP-GOkKROm;)lUs#8+{lB&G~wCnDFJA zKxwWZRbWKhDR0?xOhFlin!1`u=ZC>;NnPjrPKh|yTE^6P;F#Mu{gc;==Xx=Fj4SfP)G`qa0HOb25eYD29vLG9Bz)UHU{# z9a$gyL?p%^+0K4`JPNiFgZ|$<`-ua-%6zds`;llvbBNjm#O)Okc6N~(_w zig7D7lUWQV9deqaC1eal$m#MRdMyI#@*%kcC-(cEeBFE)km=DSwyV8_A zuqW#Ww9CTkHUegro~P35Y_gqGr=&|6cfiJ(D7;YKgB1MQeCK`>x&O_woeROJAiwes z1xfe(&oS8lUcaLwKU}{2L%dP(WrSs1FXxYhjeOrP+zSZlGF7jS(TSXHA0l6W^D>*Y z#rr%!DWUi;otPK8Yk>;@jsgS?}7=aFDdky2|= z&taPGeESe8g#n3?oB)iJLmO3u`5em@MZ!(;;Q);C9sH|fqHTZU9qJzs!sbS!1A_T2 zSj9;&N(L>$8o@#M?n6us7kO#p z&oYQ#R6`6{SguXE_|7AIXCb`78L5xZ)Eg{*7^gcLf=eTNvSBuv@WGvwL$DMAUpydn ztjKfVCip#6py%6N@Fr}t(V>qQD2~!hmj4P) zE+bDE-y-%C@=RtMtws?9D4moB3fN+H3Rw^x zVdgtbv$4l1`Y<+ScqwS9Gq~v05e(g_GW$vBv7$nK8?l6Uxker+m2unLAJ_NLR`fZc6VQLL`X|p$ zbc`ULRJ^U@Zp~zVN*@VN+RxKr(*WaXTeZsziZ}w)pFCndJ_t4Wz&lzcF@dwAUgnwFx{SS_O z;zHZMU#9Y{%w&%saP9~wa0{S_+t`3{j$pl?!=6#h2_8y^eO+F^!7*oeU2!LAynW`l z>(RI(a^@tIw4l;}Ftoohm@~chVMw+Clx<%@da z^(f>iEH~~@eCVmj2~CTRJ<^h2eS_I((25@NCLysTJC({0En5TAp4!N-M+m|6INiU| zN^#4gv}?n*Id3K5wHCbeh>fRNlG&|qW7iig`LER|rrAXA_K~t&u`ED!NisUnZu|deNg9%VA<6c-Q4gH^yU=Y7-lwJ2xQKjNXZu_^;p_ zgZvD~`ri@?8lK$xlhC>Bd!DpXeOb1lxij13 zM=rI{#ck2e@wO5dp<7QV47CnrEAOp-Lt>eVfaJA3-Ad>VYZCo^hR9p?^-_hNBiZ}eQ4Cw`xxSjEGqLj>q@D=iD)@ z&)=T^sEcfriya8h?Mg^BRK#4RLu>CVPt#_?Wz7l-NF3~eA+T+20O}t(WggLxmXW`j zRiPhr2>!k=Aa_GlA3a$57ZKYZxg#71_cdVTe(l!hNu!Ef(5s{P-KG6A^l);ac1o4f z)2hc6ii-xbPR=*}XYb$e>{~(v0~62qd#Rc^1wk=UigNd^&ZZV*IxZPMf?4Z2p>d2_+#BeTaL5HR>wf1@?C4&-@pvSf(PbSIhHInN6RKpLr3tuzSEtV=wrnXzOGF1=+vr?O&Q){iQ2&AV@Ko5tNa5 z3fKo;D&{a|)W0{jCa2Nmmb5M6L&c*|TTj^Dco+UEuxlvR!bQBjv@MEH*&dg=8bJb?11BVMQUN=H&rXfnpn zN4xhHN$A(vCBgUo`#Rv83iXYGdFQ*U+g-SwAt~{tls44xg|tWqx-%u_;ox|Js~88m zFXyLEVL^EAk8sNfv{=yeXTUjK2l_3RziSwck#nAb2VOQANF0wV_0S*BSR+G76kHo!i}J>s^4tFFT3=3Z{j{b>Y1UuGm(@ zZNcwi+w_t>(iC7^M{p`VuZIK4&zCt^Dv1%fZH_FkwIv_R$SDZ3C5OWyt@wH#uXhcD zQxy-F+(r2796;8tLx2n;>SZ`Bh0Lb9=iLWDSEjUS{BiM{b~TEl3XYm^h7^?xx6WcX zfSL$@q8%AJTa6jm{g%0gQ>dmV+;DR7M`7k_avYOcY`)kGPjl_SKj*N;-hII61U0hT z9hNGsA?&HgOqR>h#9#6kG6#BNoVFQ~eiNhZEr%-i>8&bHf3`^VHfudT0g*sWVDUCc z6D8$=A^2(SD=fPQS)Q2nx9&Wypb7`cmj|vhPKLP%@BqF3k;X0&R%8oA?>4ZE&(kT9d1_@J*F{b7^$mx z$1BF4is7_i%eZsWb^D*Bt(K?5{XSRA7nH`Bf>KGp>2KNER!x5;j%h!#g!z4UCbo)E zU8E@VT}dT!Lr&VX;l7Jo@cps8Ud;WIKZN!wyldcEy-8^uk09{gf@*4<;(fkD&W}qnvVhSp88o_Kf-^8*zYfCQq9Q|@n6qW&-#k#{^79_7}h&Y?$I zxc|?EUqG2tJ?)+iU|Ntz!)^9^z({3^weKX?r_MlbhcE2kOgSdu5Vnsezr2t^1WB7S4dh(XfN^O+>#1c}l?K86!-eKfZWwu*OVVx6N8P2ulp zT(>jq`?8DFT;t7J-us4ViKxffGAyxxygG^(qtG6r1YbLv)+p?j#ni#)GOHoj5oO7O zOxxF_hRfdvVOlY@pG%HZDK5d6)FT*g1#%HeV@gnn&ytyF8)11Ane@hX!pl(c(a>5Q zIY^N@mb|KF)oYPPfn-b8bq^2uMo}_~$~ty z$jh$(4D2*njrn;$VuVrF<;I+n+e%sgV0Z+K&eYy;1}`HfG(oQbj#e>os{JvRbA9lK z`SPC95#aH1Q2p#(A^>?=UGf8K~8_k_f0-?L*R4 zP$K7gue_#aw98Y220ag?e)uhi(3{>so=II^mBaxSx0r#bC&?M{bsHDflHBzHJv&?m zkEH?x43CRGT3}#amo@fJy~pXBmG;JeUQ7FjXCoI^GEqU)eA%$>m-0jQXx>fgQ%o-u z9RWudoJ4HZ^qZ-_c5GfkX4hlyDqCMW|47I0H7Jz4ec?EC)16Cqn<_Nqmo9u$Q-8Y6 zA$C61tI_Zz$=6cIVAvgyz!pKEVgD*OxK|ly?mw(K;izJxvK=ILNEPEFqh~)*AG2-u zWhcq**oNAo0D<`^3?&s{zV6#3UKV{HvSMx5hPB4&&j~}#wqXCF=`->4bJ<@>(Mg-x zWxki>WaX%FLT#zqwyh!ipFbL)TtJd=?QPm~hMnP8ksFqur6O%*FCcfH9BT#ew5^Rp z0%~G%af|HXdA**v%r@p<&h^4E&B-}e605V>_d`0WKUa2}wJYdrpv&i&=w~^Fx}jr* zWGwuROfeQ)={He%m9iKHTSG9pV=sDJ63fu1i68MmN(dqR63Y4xYH??GvxDF4Llwv6 zQy<$r4(E^>nTR)gaYmo4w?Wy!p~eezG>}y!9pY*C`k_qLT_vI4f}o#TGeRq5O><;v zZ>EL)P1*Kff9!cz&@Xuo@d>$VZ_m~72|G-U@bwSpv%mBNzfH@?oKhFfBnNXfhMc~X zI20nk-aJoH9;CvhNVodW;MAau()_(D%L)Ea=QXj1KwP~BC6Y1fy->i_ro0$%Pu09mp=jzC`MV@r;2SI?u71& z4>v+AJ7%vKG=-y#?q+W#wQuVaS)NI-2Ago-hlV7A7rc(YA13AheTj&CsI}}+9E9ww zH^L_T%UvOz&RCl4?LT%JTB0P>aXIKlP|L0$e;@=Z#rBB%`0+nB641VH-b06 ze9q+n-Y1G$0y=FHev=;Ss6RT5Nn8|zB=^3$xL%9>-~t3M>uIXTl|txPyiG{fbim(I z{7f1izWI=9P5IG{>W6&}p?&NH-OO_f4JqOM+8h|Rin?Wc;5Nxc%i<52VyXWVW=Sk~ zX$dq$5Q?V_rZg^0w7+bMu`Gf~&z-_fSipN!iP&e4QS4?4g=!Fg<+2R-bX%M9MryNeI$z*`imft;tEAR@(;6lpl1%Lr) z@>ch5(%+(!yVZUGtYLvM(Q+#{IJ4au)K!%77`&5^2P2BRW#e}ANAr#CpDjlBnZV-= z`#He9*I-dx0maxd$q$v2_r3v|$=`rlM3Dw-lupMg&+R;=L!key5H0S66F2$YS;~0M zLo8o>scJ(#C|djQ*H8PBF`OJ}g`XExEB>YIUlr~|mM{!oOJ0X<_9H*C5}4A1b^GFWWeBVoaPRjF15G~+&@t+>lu(zMalwQwu;@$ znX8YB=-ZV|_c&)CwwsAW@Q@Dmqw)H`)RBxs{x%B4Xp3}7V|11JR3c#rNKO?CDWzYb z0Uw!N+W$o>ikSoV!;KRJ4V!v6WGE@Sy0vjvN$)LKPQ0=&Xf881qBfo9Rdjc3$=e5J z`n;|D+Xw`{k|lVfERb1ZuWK7%!?*^|a2Q25)f1_+kP#_66wM&__fE#cUlOP?_Z_AA zMK{C6*XEttHn|d&wy%}9-^~yd>JRpM-l)o1+7L@Z&HfLBN%DUq%+NG;>Gc0I!n8{i zqCdYwyy4u~{&!Ks&1!82%mxxkvdCKF)1qMHTs2%I2&$9SZnf(~@*l&*Z~saIS-B{2 z4<6baEc;w`UeGvmvNxs1$%`8LJ1@d1f<7p@e8lW_p%a8%(>xA$C1vvz#4t^AXy$Y< zMI+u?tpG9>q~8wjv2hen8Z#&Zv7<+{AH}{IF^c;Ezl41zc?I%`l!2WY$utj6i|LBs zAzoB$V)>^D5}sczefROmT3dkJhyRHkhO52%zs}*2f_F5KbzBk=qmH7hArDb=l({D( zad_Zn3x!`(F_F*fa!w8!iD6(h-%KI3AVlr0y!`<|OpDslf3PEb!B9AQb=fA70+6PK zMLUfvJfF*%XR6!Fa0q`)u9aRW*@SiyP%_KVguph5(z5eyHH@wsxreMynWUNmhfJfV zcmD!Wk=sG?5?0lSNzj0)&kQqdyI75@rKaGci%@c;Vvt=+Jg3XcxHp1n#K)5*42pK9 z8Dt1Q85foea4vw`D#kw%YZxI&Z4g5hrZm{x@W`Xr%zy=CU$WS@Umv)=NXhV*i12=L z8eW|=wB<{;+1TW%PWRm5MIwkvYEj7x_03Yx2+b3Wu}ZwQ6TkStkSJT)?j7o9C7WQ# zmg+-zJ>(o!SfTGt1_aa=(U)FG@#iIdc-p@B?s74DkgE6}>QDvd-4fa4~ceQBU`T{<-DYY9@-CohJ;p-p$J>`km4_*oV^{0cXgm;&Z$D}pGO*wZE zHqN({t5UNimRw!apyLc>DeQ^I`opr9eXdA+bR;j&5VO6bE68)Mn+Y z^;E{S8NwDe4oW)#$+sZ8Qx6E}gr9*4;{`kSQA1$H^F=D|EnWXQGe84D|Is>u=4zoY z_9bQai_$eWD+zf8>u5^G1=?TymP+!L7mY`M9xvPcuYx%_XHHN(KjFWRq~B6O1b98N zLN#>5ujrlLmBm1{#mXv2q}(hYGT55yz2+A9R}^@Pk3aUT>TgVVD8L}_7uo4k%sHGe z0+H?sl=Rslg7jP$ZOx^Y!Mgai~7d?%S4);_pU<6esJzjSxa3sm6qMBP9 zz%Dy%0rms%S}u3bEGs;cT<~-GYY&DZRYb0m(RIex(|xsNExuP*StBLBeIn-dM2BP1 z_O%qg*_e;Zc|~QnR2kKjcO&!_Z-8M89a6^+&Ya0oyz3TzRXRNR68t5JgRf24)Xwy_ zg8dVUj9X5H^pdDhqg5k%6Sb`6TAAM;yz@Z~Mn@uq)Egvs@fwI5Hpnzb?&^?p)OXJna6N9{5G ztv#$JfU2+jyY7N|q&!Ea?Ej+ct-|68w`Eb>CAc&a+?}9}yL9jX!5xCTySuwP1PK;A zXmFR{(71-+($K(V-+j(q>*c=9Z#+)>Yt*P3rA{(G7aIoxNPFKVffog*C~Aleqw!^J zkQH=D{6QP7k?1beVNNtlUdobn>r0;;CExnkYA98mx*(S(T9R^CJWp!1n?*>7_T_1M z7Kv^OGlTTCzPk^z8;r8mycx@bq%8|HyZ>@$H7KJp?cr!jMpf2aw}vluGY{h0Fw>w&7% zkdAD`&D}|23R_c}KM7j7QLS&UXOE=U{Lr%6ljx?&TvGG<f#k<77igi0 zHJUyxv5>edty3;)QyI&)&ot-H(h8+(?CqbuB#k^n9C zH}S5UN3YZ;t5r9@?We19#hc5oZAikF#Qep2nPb{VO>}ZLE}K}jX|D3@7FrHUe8oh^ zn%P^+eEOU@X>n{GE%v)@@to(C0IUjX>^S0$?K_oR=nW3@hZLLU6n7`8x{C}cLBJTq@*GzMQLZR zO&=awt{F{W4`BojMr8kv-)y1%6Ha^J(iaYAql?5ynz72GQ7ZRhw>ogje5}gxQ!9Gf!XjeN>MU5$qqVnwnGe?Zsayp4ZM{eT zn!M_etBhyA^zXUtf)UNlZE)6orkaywKy64f*!-)YK^G)l>Y18!q1vNjsV*H>fQ!&( zo49Ath+p*DT=-khc(o=aEQ`&A9o3t#=D|ffA^TEFa!AuBhBbN#zH5} z1~!xx`icm||EIy!Qb_NZNohlT&0F|nurFqC7sz!2KT@(Lkw>WY6#a zPsI1X^;b4rClkx(#mc+azG;3a$Z1th2ddpZT&xnFt*$+W?P`CsEORVhwFnyHvqPUbc5Vt7VU&@UpMro)`7j|Av*q{CAP#rcRm zc56{5rZaubpcJo)toYC@Z*hDdgDCf#7yyeFwMXdEwunobkvU;<2O4UqGhWsZCET}E z-MM@y;`ly?(_gR6zfOnYD6EU3RHc{UJmR|gA!d-o?#o1@IaZyh8EhSR8h!wh`>@rc z4a^bv8iuEvIF$@Tp_&cGV$qJo)_CGqQ4AV|@Q(`Ip|k~qxldV0j=v2ALy#OwtWujTWSkZN72Q_NDdI2kY2s`Qo5f;1zduy(z^h0As$osPCd7SH zcX+LmMqCq>yu^SWTrTVEk$gO7eV@7#JMAl;$^|Syrf8kG9eYUbdtv5Su>*ru8OHyk z7GMe%qYZ9DRwwz^OWs|U(HMa37?sA=Q~bN`SdSKtFV6Mb$T8MjKDJQgn1|;_j4E$w zzT&M?&VGk~=ngpG;-sy}JQ?RC%t>bc_SLQUhOK~g0j-eHIv+cf`p~A|Clz}vd>u`? z_iBj2J`Y)2F1BRiMTlR^C49<91nZ$!401%XHIn4|RY$?PNdu3;MfgNlTEWp%b3}Gz zJ;tAZN(FP?HlGN^1a4_&F2{G3fBX>cI@_MD^PJ9aG7ws|T7%)hfAVjoJ(e2z5EJb- zXJ#g|dt(%tO@$(k!QPsg@Wno2WfmZaS|KydYr2QL6%;q&h93DjD67pvbl6b@QIHH= zc*Qnmo3Ybmeo5j%qi3?ruwN_IUlw+@D!JR$r;CJHvwZzG!uMv7b|X(u5r?r4dG&z}5tX=TI7gC@XcTUerpzfleN z`GhfAM+o{5J20Lhp5D{?T}Fx>T_+sjGV+ZnKx|?dhQ$nOig5vQLx)p8gE2AXc=H2O zi7gx^Cm!wyqG>(vGyUX8E6hp*tk*1_NF!EOB)(eI7%d1~t{~-vwtBpOevDQifAWF}1CNF^zjc&gZL0QqF!xGmrlo=4O(D6-J=OfCdLv6~PD`zUB(>tUR= z`$zeM?m$SStaWF(qNwc~I`Usl3fIk38+z|^yVbTdoD&1sBw;zPcRAA-AESX+k$?L% zy*0B+F3Y!Bb)@PW0W%|En4vwRhGIK+Zv$4$Qheq`#-wSjyQwhYu&WpG^YcqUd`O6y~hG@R{3~R*2clC7=uqJO|Os~!4>3`;e zg|80z(==iWPV+JOCBhC*FE*~6`qkmA@<91|S$g3Jlg`ai^naija|!s>4bMUgn|YkA zMiW0>g@thOKIYvw`Gs+c@uv-zj8r=21U4S6n)q@{VM~FI7aa@T*DfrO zZI%1-UCOSAKaYRicp|e~zLCbVb(^88z{3^avQ@f4@v@vydS>LHCV8g(s|`Q!k~+q7 zcFoWH(GqBQVC#+Y>9x=4RR1qx>Xjja-p(rp5Z(htOd@|lC_^YO2`ORkcOq&$zfFvd z0#Je_!c4F0(|Q1PG-9DwY-hw5z6p)~L8jk)PQhzBTj<~j_iwpX{hP0YEz0sq7L7p!S#F38^hgs4vX^kw6Pp>#b6!dgy)2dLlElvFNC-DKRI*C?+XQ7lWL#?4KGD zPpy)F6Hs-_uMWAdVrz&@FjVf9@dy!Fc^rr~vuI(X8jTSmWpw!MHc)Mz>=io^yFBP~ z;qi{1KfnurP6WDk{3kcKYq&J=$QQqpQYIExD5g5joiZu&WdXuwkD{2wTs*Nr$ITsZ z>U>&hpMRGsMOr{n>O?_j2Q5fl*(T|bvq|9vX~Qyx5=!rc`kIr_InCcRz|dy3Xo&|J z|NCxgAx%xNpH1CUhTS_*631>|O3b_{ArKm9p4^i5T{2Sbjhh|@3=dV3Pn$I;-TOo- z;zVQSp610aih59T0~;oq@u#uX~k}M&h%wkvrSn-5?YQn z^MOIer6!lCdHv`y{BR|Vu^pBrPauT8_Yam9I_*|WCdTKDD>H*;ri zDFAvJQ;WnkWCLVDalyr3-bvgiT7KWkfK9naq%>ku$wfBI7jEC};W@s}X}0@$3tRZ# z@-3ik7hov}8dG>_Nw|+KL#ZJW8$^y8Jqxy4}t(bS#( zX$RnL1z!u_aifDw|73gG7u-llnxxNx-p^md)orNhNLMyXGq_EUbd*M1U}autadzXZ zdPeMUJOXxbWX*bUYVezcO0$>A8}^(tT4;z-@~V_wo~^iDrIci<7-(Y{U(bx!Ltp26 z4`B~Gx~(9AajM%MPcSr7Zm&*BkaRTaokP*7jc|Wl>Um->Vqhh|k)FN%4?FhwkB&2a zw)dGe2jM?%iT^}D{O=X?5m$Bf6FL`U7F_se#D%R!{KYwNqFQy`Js1n!ju7$~g)QCy z1MDXK>))&(5FsS*B%sge+RuX?T2_%S)9lK}*AC%)WwreBSR^-|8O}H`Ack|5h|7^n zygACqPS9eDNikg(yBy9sXh3VCOUhqh1`jVx2B+zV-fU4qCYhCycppL~OLky`d#Lcb z&*cyh$G7GBrT5p^NPOQqq5^+=f8vI|n+M+4v{^xtZj~|iU1SjlpCpKk2kshFHzlp`M3HS2 zuWbGCfL-RiKk%B%cyC0&rH7r!}BD8WgL1#VbBMQOzyxc4^{H~31mi;H-Z!{LV z7hdIT7vz$CrH=#^-DPn&j?%0Yza_lPIS|8rb(-461lW_pGNI-DBU6IRC1!hI5WXFC zQ%{36xb3@z8H|nj9+`I`-U=Ih{+#qw1wqZ!$I6MKeOWb0m@R6fB3eV7+xtVZ z1_KE+Py)L*0vq0G%S#?N4hs)-xeeLoyMp`w23Sn6w5qP59AviLDOr1vdpo7v10z@R zBNH>f9`Y<0<`$EQJbAICdwp?~g-h`!bb?&l5sxVb?ta<+zWAE0&N!xq%W1K%up<1{ zjaPRksC3tpu`Bzr>Q5fJ%F1%0>E!k`2XVwm8`Lv4Ydcq2-w$hoqvsod1yxbTwKKl8p2n9G*&)&T(Osrj zRpz6J%@T67JpKuwBYykJ=--G#Tl_gnHF2;j`St|5a4@XeiJC?EWavmYbVv$3iB5pZ zeMh}97RW;#2$c7_G%XO|Uv%V=GcSRJz=eSkLpW!npNycTtQJ4aH4{wUFqWggB*SNW zvr3+?Xz>#+%hNO>9ll4=%o?^3bAYiYHLt0`&hOp+rKt150V03pp>f}p{{(kBcbH8! zPq^#&7#$9sO6OPIwo|m%#V!$knYmsY#;6;=YX6=$2A1 zbN#a%G=ouer*#EKAuW>IaXlC{A+@sBktBSX*e+lEf2y;Wvhy2W-+HZv5dL+iqiN+V zV9&%Lt85w8P&0#H3S1Z&$ry~7mt$sjE4`R344);Rh3lgc89sR&o#$=&oC-VWX$9;J zNq%>NtBtv4?#odAF=08EM$i!$jIE%2US}x7)yHu^MYL%;ttxKhuq?D)j6wGt_>kZ)ufhA z(Ezat1}~3WPv&CZuE+Q6Pcf&O^G`A1%yylGCJ5O0Ydpi65IL!Vn9h~}dr@c(k9)cS4YX8eJ>5$HAM!#U8rGL{5;Gunpg&f8 z`jPlJd1RXTkRVb2R?GvPGPPng9s_y_-U#G6KM#_V%u&(%_M8O$F zN?Tzh8y~}q&5d9V1$N*Wo${0V)+RJYc9evaY`Cp&+|sgQ0~w9&dpnV-C zT20!9qip1|yOoM@|0@SFl;%zVnO8i~ne~Ina7(=y4}S;sM}PbV{|_?C>+px43IOnm zNfny(Y!kevy;jU6EWs_TwyU;A`=g%m&LZATqi@Zcm>m z>P{CmLnf3j7(<_Pl6z0iaAq2mv%JlGVcFN?8Rm<_Vx1o8EiCS7sXck|NvB zGGIlc`T^!LDm=qkTMjzCXS>TXI7|qx9?ny$AeYyfDlx4@&-aZJfnScvTY*LAs;wVA z68=gc&f5v&L5d%B?bFW*JT@rID{P$vrindcU% zB81s+$Hq63mKlR%`v;reEZ#lc0Lp^Maa^KD0pXW{+lByu?3x7ZA05+?d>v?+y&2gV zET@fYTq=^z%JGaKI#kL}+j40%)9y_8s~_|2Qu1qj!CESXLC;zcGE^e2et^Y_+1 zHm8RTxDFVs7_B#}-#1&{)4zhg=X5~MsJVGa!@Ed@g2kn08H<8o=BfQ2Be0*Ez#EvA1_cUg7(4I!dcIyyv69jf04H zPe!4@Uo^s#-qEC<<_p%7BqUVImXR?PI`;A`)i{gCZ~IeaY(FB}CXv7uJT^{*fjx9d zReSBsMH8vuQfR%U@6{FkZOsH=Jn8}Cy7Wk~kVf*^`1#%NaT8D?cGJLy{nzVWm2ypc zOKqM7H559g@jTo=(PG*LH2;=1FJGfV3%@E)qgBW~F1Y~xGD^}Dk>_E*0D8!*5Q)D6 zdS+^ zkMQ|_s>Ydp?7;?b|0!&H(gzP>Ke-0qY}dSuC->``^fkJ3d|(9-_bR-WQ=aoHOqLO+ zB2P;>87ES$Q_gVO^s?F{7g z(+ytSzbaUJg0)-5>?FuHb_*?&d7XAl#C0fMy_>xV-N)#1#ix{4Sk=GP0F7Qjl%xzU z#&l}9l9?p%nqp;m)AJlA(3;!Hl5QfWyyk7jIGoj6QzYPU*Gg7=L|;c$EVd5Mhp(Lc za&X6o)|YwBJN+Om1qMZ9P$6Ok?uR#4?C8@FOA`>aWwR=UQ=SpJ3|Trz9B!48DY9kNjIV&$J4VBWEINj_)8g>W;oyM!Y!kZ_K{TD^Af4pck2a==h3`Si3nWSM^FqoWKuN#bZ|jx-})f7&%-ivS}@!30(qz&GFO^ zgWbtvp#I$nsT@X!k$?K5kR&&OL5<*^ap7s{@j{>_1>&?r*{48;X~yDGGS>60up`WX zWyYM|2EjE@2X3`pp7ue7INyQKppnD!weaAI(|H*xgTTgY?Jg{TkywpI6hfAsQ7Heo z8gm|xrN^ENpHXRZ^3<>SaQ)4V?2ZCxT%&t?5|R@n{xC&u-McH%yNg`&bNT=jba?f4 z74Tt!b6nwQ{3Q;OCbAx7QRBPxW=yTDkrnN^7EO9Nx*;Sk2yZ(SvTE9zm z(>31Ttsk@zd@R1|LR1|WSPq7#aV))FmFIozrtmY*8L*-2^iZ-@t8~y7sG|Abd}4*e zdSXPzVKJG%`=n>MnlTIm8aI%68Kf&#qO(JV#cb)tQysIzTx0Y-ZouqK$q}8rOrm4> zzBIYb%1eT+v|F;j8BOqVyG>puxvA!H{_q*Aw&Y^s6DNNw52IAk3@0=UPX82ptdKgQ`5^fy2?%bd21b;e4X2q1Wa&bz_%6?5|l~&LtzXF9$pB& zUceLfhsIR7a}>V{&Pw&leARgw?`S?_U-{eygX4QX#{sRZ7EHk{dBGIbYi{W#Qr$K$ zTp|Z4{71yJe-ed+_KQB>a%(~kF%?b7Dh5h%h0?JHi5G;(E!5%vQkv2gE}D%LA$(t{ z!+q*D*?7wLtTY=wiBKJJoyeMIEwh>ZhWaV=14?|W)H5c<+A5u!!aBi)9XxL*qI3TF&C^qM&q0SjS`%KOvs#eWmr+nEDLkdk!-{S%m%e%g+lDEI=IqLi z0S*bE03W?9Xpc+TGl+1aC@xk-ngK8f-j?4+!3rS&{}vM`<+|1%_$=7!=CF&owYw;G z*7~AqjdwUPNku1tb-(%rJUFMBfh=OTMLBL1etsL5k$)GKum-R!^_$*-?@^k!teVY8 zz1vUL>(LVJm79B#;Kzd{_~akCs-my2U+I4-^=oj3_#)*Kg>LJpuo#TtS3f(NCW*2y zL8d=NWF_K$XEY8bG8V0~Tcdkh(W;#lxNqL(pT+q&>VbU8F92&HZaUBTp$7(WVi(fu ztnbpbX$p>ZMIAaf>?i7%sXI?A%KE|vMpIn7nwy_<{dK?p_BZ<8#&|8e*63Za@HptQ z<>icFB30f3v?micl?XIEx0>&5iQAXy`O5(`-+QI#DMKb!P&7>Yam%7|6x+5j|4#xj zF>x_=M2X_4N0iLi(vnuQTJ-D}Z5=HW_M7FqNTC%T5vDt%izG`tK7^)=-(_ez7g>x9*aTe;x3=f+`{+@s#)apLtyl=Z?peHk|k({(3hA+S+K<@IM_ikPFGQcAUrY0$9-s(&|n`BbMB zUSn-euSsk2Jg_z`=n<6U)=uu5J6v+HLw;%UHugZ=JErg2-lKQ~esS`@7m3{Rd;C0P zHv&w!O8;zgKu{3ycTdhy;@u!S66gnfRw;Pfo_pbGD;3-D?4~+961+@`E9Ozph@f&k z;o|g=r1=h6kPk=%K|WnE*1%vq;4X4ED4nw1j)PlwFfVSIyxlxmGq3U@cP|Y~GAHs5 z{BBu9fKoE9*gZwq;~I2sy?1x(1l+BFl;Q(jZyvj)W@)9aB1vpvnGC00^(=HAMBr2Y zSVBneYS%1sMBQ^P&Z{0?K}N#nVP@`v~Nz<3)ecSv@9lK8p0!Fze$dZF!W zMRRh3dAjSFtSVh;w1%nuAT;Lzh3|IO4$pp*CC$e2=~GMn!$9JW$J>8!)gzmdv9{zJ zTjuoV_5W1=2bBHSA^jKkQA*J`z|a#twD6{Po)$u%&O%%-?^kRBDauYrPo$$uXg`{n z8;=t7s4G!AVKoVgj_ebySjL1S>d`;DH<`OgN3@{iC;ruxG=>AcYR3K$8RjV!oSWTL z4A+ZJMPwJHPox9mCXo}wsu;Vz50$PK^y;IftYG7(rnDUGQqGck)d?}!nEx^0%@6k> zK^PFzf4&4OlZxEy5ipg>;6{w_HeaO+Sr2IXLtWDvSd)h3J?>mRBZrCdeK>{vqKA*K>LPH`YnDEill zkzK4ShO8nAHJ7nyyIJbMXsUt&BJ1izK`5LQ+7Ga;QB~M)4a=D|uR5n&UB2|FC?C<@!DV zDbEYZt8TD`#-g??do;v}rBagO&7nVWuV<@wh;OsYz*`3BL>@!||P-(h$}RzsbVn_Rd$Dn^<9w;hu-FB`zccX{}$J$tZSP1h%{ zttxLHbN}!p;zp)80g}*W+Ihu44xE(gBEc<(>qSo55^TyX#g3#fMtd8DA*SS4vofp~ zzy%e>L{bNHSWP)p^oT2n#L)h|t(*5OuW@m9JeQ`Q{;4Ht4F3a+wGovM;E`ZUWH$7w zS?n&>F2C8@LfvGxDayOlDNgz1$GG?5JHr0R4>X)at{59{V}2KI)?wOMt1$niHTw5< z+Ip!F1et=l*l#S~Pi=4WbJ#3YzI9J-E~v*XAh8dZ^6#@X_|}{Ze>4{=aYp``-&?!h zOS!;NW0B(sT-`jmrzYO}E@Rr+d6#gNr$5&`r@ee~SEAG5iQ*1Nl_#RpOf%Co=IVvw zSmjPWgd~@PJ9xj?A6=+hVzzxQPbB`k$oz{2B?p~ycMRNOA`fT|fUkOMg96sTG@Rj# zQb70ywmMX3#@x0HH+*XGc-*DhQozD|8LA!0*8Kvm}=Yzr%0OduP% zqIGfQKIlo7Z|v+w?BFo#X{Pd-H|!C~yD@cwFX(Y!LFcrpsUZ>I|B84oh_=GqyyB=` zELk4I+;U5(zByiT$LGF&9kZbgH~A$C7*MJ#I;FjvQ*yreetybRI_i}qPO%+Zm+H?m z)XdzF(KX&bOWKC;Afg9wr&N+r48$TE6~LuXk{mYH`L>q|BP&R;AOSAWw-OU!oWQQ@ zYNx6QG!f!ZOxsZuD?KDCr8#IRw@E4E89NdwXy6A>_TqsQi9e*PRC`FcQxn5ymQ z6h=r1)^*o#B`E2RV7Dk=+~4F3Q!3y>jr{VuFHV#UVS}N%4pq~Sj}3(x1pV>a{Ir5- z7%Gc_qm(Aihxqu^Ypl~p6q!T=ru*BnH&N93_@&JTyMrHl&;JWvBhz|3G|l8JS^^!k51qA(<%y4!@8B#zZ?*r+0U#fOIyb>C;tm%(*o|0Tc22 zlsy^>XM?NA4$Kb~y6JOuwwB)jPTdtv^LQ8E8_jcI5a%n^dqr0$zf?7&1` z7BP^kP6w}V=j+{in6MQT%R8X{7}Oa=#&36j*3;15mksjRk-Kdm^dd)QL^q17bDdIn z;8i-MSp?{!O)hBi9Gvo$wM?}~KZk)lbaU6GKM`maC>#D|DCHAqovskTT79YnP{_TU zNXy61jYSPVH$N7Mze|JV^0Kv~yqQ6?&lF=vejwTG!t287Fmk_c6cZA*bANa;3Zc z@?OuKpv)fWh}Z~_x4xkwSJ{sWT|@%kv`3FfN)%FZv{?{6g?9jqUN(x zNt;j-fcV2j=fvoSi?w|G8B~zo9J8{_Y+JhhW4`sgkM#al*~tAZ`Jre}Z0n9A4$m5o zVyP_qe5{kOHY4)Dv_E)b`+duFAO$o{>LYRBbqB3Q$_r6wOOd=tfeRVm72=iW5^-Km z&<6*p%>4dXpuRVrz|CGRb|#6D*9s_YHn3adId}w~`g<5w<-K4_P33cQ^K+t#mDpR$ zJ8%6A87ZV_ht2PKo^Jh1911-~NKf&%FzkPv=f~`%wRid;;D7U+_K|dg`atvIP}?v* z6fDTzqArKKq(s4epY-9mMhUCX13(FnxtL3D)GyHqZo3qJYkj@7-gfb zPF{=-bLT_VLB3B|+qoP4SEYVY&OH}jqbIl{f>k{8qmNjx+$zfXSNUrxr?9Hi$isQ5 zKJ(1qs;7Iijb0WiMdUY-{usk&OJ?U-oGdX{t=btp70SJN1HZ;WiCK-Tis1LL6ZQ}fP z01HFNJEH^azBD%^M0CaLh%K`FI2uwETe3yJZ5kuYpg)3Fh;GZSyf+0G8|#AGp^L-H zQRd1e6L5-FWRt>OV>KR?p6i6gYr_6HW&%XJo9*EoCt!Tona4S{#(0D7VXq-CaW6(E zo0IyB7cUtEau`L?FUvw%W?j8WnnKsjb8nX6bHD&BI`nBS{b02ey>Xvt^7ROnUyaQN z={un1VmAdy^nc_Z4#y{ARDcP%!8jl93un8Mw;Si-DkrfrH|HJBvPm&Vv83l`|A)%! zhx2A4{gJsJ(JR^2iY2~qT z2pX1~#AYVV@$3h7-j*7emoe0BhGq4PJg2d|*#fe(dY#3nZ*lqc;>w)!Pud@;08}}M zf5ON+cx$5F@rVTi1~7JzKUOB$%@?>O@HRWMbF$R86JG4Su#kSP@Ptp z*iQP!KV2Il7N>W*=6rcc=}@40%QNDM+YNx$oorDg%hX(w4{<}^3$=?Y}b>pF3nN~^=BMCNFzKXKdH;*R}4f}9aPOv)cU&Qv2-s2P~->+Gm{pL$GBSTeD5E;cNu)Cu=yCZY2 z;#KA}>_pE(%uEE~BN*SD8=J8GgUKhSHtZ<(*D$YXsxRJfwS{2tfqkBRvV zBVzM_-+0gRKh2v266S^qpAZtNkBMKgRqYlWH(|G+e8(y~6ya{CDS*k!CYe!&d{>`zSVN=I zO*Hq9*@-bgKG~pOKLsssSNfzy zQTBH3nt^}uLTzX&SgiVx-+qcOoD4EdAj3ndlisNHdYxMZID{M$gmZ>}{@PuohX^>t-Eq<@kK zhf61YiO`X8J4q(qr4o&-kGlxHPJvdt?Ub)Z5;~_>BzuSxe_Q-EleR!8{&0&t-$%c8 zn>uDT{-ptwSDiZFfQVSk)E2y1l^y@cRTBtc3Zdx}$GfNhhGcD4#K9hr@t|&Ytyh~? z1Xg96&=j6m#S(3WtQsxxDd!C=wqj;Qmm*BeN%{C`rWK&ktZAZBjAvcNBF{hZ6Uh5f z>LgCvXn!lz4eVxHT<>{zqiRE-k(7bJ=c|#6b}mgBxAZK(H+f2Ljb2T4pLQvxvjjbf zM)F8+nhxil5Z0KbKXX_SWGGl{uug1nq@`YCY~@>u%;c(H>C}x&$zqD=!7YaSk@K0M z^wAQQ^%9R;?_<&UPO)Vs&8F{goj@gx^`Z-Pf}wIQ3mL!{rj`TQ)fJ*y63|e+dma(( z$8Y`(8wJNwC1Ld?OuRalem<3n3<-Ss7q=OW3iye8-DoAPnqlqGMG#-)Fm74^X0MQV zmYWbNiuC0*p19;KM>fb)YHi7xA>Nr-EfI#Rg0nH1^!k*?Rqqnc@eKzxl~y-|(f_sS zv#|iz?!!@^e5EtJLtgJdc<(F^E(*6R%qZ}M=5aQup%^dq1KvZ}Qm?Vn-)awG9LM#F z6Uk!8WGC+yo~+Et#sl`h2ALxFcZ6{qOR0H#^NWE#tR_ywXs0b^Ea4(c?t@gFWWQeB zRFAM^Te^adMMaTficUoHh0)0^SY6XFruinmb-4$83xdcd)1A@Qm7IW9!S`BN3~t&!88y|q0cZb(Fi>189 zvsBql+39ieJaqxrbN2PHU;61)VSj(H$zYArWlVt6B!XdZJjCzDs`$(hx{K7>=-kG^ zmE>nVyTisMLx6-U1c!clvF)24n-a};ky=me)IZ@MGUUG7QiKMCOw$ENE0OAj8_j<=HbJZZr zL9ohx!kU4P+CE_GmQMMiq}YeScArcnVqC_#e9&79C?_CmqOvtH5{RAl(rwbe<*69O zJm&wwSXjtYuycQN;W*tRcd`MP?cEy#9fxfOTxK{u6CAtdO%|j)7fw(A3-A$oKA~hR zeq-P-zJWrq9YW+FK(~cUyLG?C*9 zBRlZuhiW?3?%fzTA%B@ChAn~smP^&nOQ?ajk%Rb=2m#tWJz1`5g&JR^;|TjYLnK5% z?wZ_Wi#8p0vR0|HPM9rrEVuaD60RVeN{~Yib!3w<5I_W^-ztmtl-?JS3-ZD`>s6(N z{}Kv;;};I~Y_IT3xG_XTw>?v#0+W%fHFsCg7XFPvSa2kJ2f7^wbaM3Vw%q z?$MNR4!)5-fId3bU;-r#$o7#7YtN(kKTKqRFYZeEY@n}2lSa#bs{cDhzVuD&yV%j2 zU7q(k&0V=@wDZXMAGYdoN}*_Tg5%iy8Z#guF7g+RrYbe#dSS z;Ba~m^7iT9Ygb-SvGVaZ%L}-F`tsZ=;nW5W zPFc_-R})F#?3%1>(5{Ynd=$dcYrk=o*36Cxvrs0z`&z1} zc(D+r97tz(x$YIHVE1IAZdr{y_R)KiJ3n?1k>9|C861(poIKUO*6c9lCu*NLFO@~Y zcmBx(m8-@pBZwRZii1_S%_M++TotPYL1#n#X-G%w4-SL+1{Z`|( zar6H{U2rr4+4|#nK8NmxKfF?)oI+zJ)d+E=aCTgFE5(SyPrOe7zfBu@NwhHaQLQle z`5`rFx5o&JoQEOP8XFB>f$!gdy7zbo!wv2c!|K~{p3DIy@W)ovXG!qQru;wIonpV~ z!&N1|+X*{|25JDmpcS4A-(Sh?eS@lpK--~qumzo>E#Hru^1#ioDt!5c7Bw@YZy!SO>yi>!~QE=eoL z9PWSd8udnw{utsch~s$=$AeF#tB}-%{fhPrXLg=gR$u{HVPTT-ybp&m>HU|O+u7Xb zV3M%0)W+o|7DELEA?YRIC65K7-!QcuJR15%s|z_!K1Xi_krqLPU-g}T9oWXB`a;V7v=?1ZS&ubme|^bj z2wXxf;NxQ@@U30d;$xnYR1Ci>>@HbZcv97^^Q*P^nxh~q6uoq}KpJ$~9okg&_PF+Od zSq|7lV#BJC=-y%bsu>P)D0=(J_U|YRaqzYFdTkG|v{hV_Pdpt98`lIG(&_c^tIufE z^{4)bA62-zQ~}jT!$tWE1P-iSto`^-`@JbVrbNxSoV8#UD-~%_3wq!6gL@1V?6!`N zS-6rTH$HzI<_MMwz|(jgkW09(E{uFLxh>ld%Dxhy_3`Vv`G6zlz>-P?#_qz+$Vwy(svE{+m0{(+9gCV&K8QDny1kZibkg)p39ax)GHn*uqjb~ z@+D(8=^|_$!p4MX%eH1F%-BV!(U;o$eE4ymzhR?irYyJa5?{s|<}+X4GId`OlCamb z9s2K{U}a!_4VqpsilWz!U-spi*J!Hc>_(e}_|(x1vbiY5dBae!Cb^Wh^~Wgl8in=} z5wXxAzG|^B2Af;T$PNp{5#qp)4&w8JNCZDmKYPH+EJ?goQ z*{qB+Z}Fdi75|sTVw;xvM(@5?A*xZaWv6r% z=GMrG_J8v0ewI00Ai7{e8L@waXgy{PnWd z%uVUiu(|>^q$st4F*_hQR?+$D=3qr2^W3tY&H2!S= zHmQj5gu8^5`Cx_}Aynd4Mr^(-=T99=2gVwG^!&TL1`VdD!GPwFT&~$=vQ8a>sd(H* z`8~=Z>l5_q3idhp-X$2DB!RYVz`EpJ)Rz zjyLfpCUircf_W+M(aHTjzpa-B{y8fkwgk99VNKH#PoX%}#@H)&uoHw~H<$_UZ!Pf7 zu%-Edb2LZBzA&+?9s|FZ8#sNq7^x@HZf5C-LT67Pw}rOp z7e{2xCB@H+yO*r*XkWlPL`$J6i-qA|&%BH=y;UgCZ-;SC#ZqPc)~)CZZ7KuX{%dCH zs11kV?D=1S_WueX-?>~Og>CJ(!5XM%CE2irnoCBoie;fZVl_pMmSs~12 zd@rW=kU2Wx#_)k~O8SX#jQ@uzm^%#P5ZVD;R86cy_vpN+ zxE-+*4Ls*o&_Byx@4)N@sE-p=@)O-|7rz%`34zz#b~6d@C3d#*6to!~|D@V%PR>2E zA^y>hkTmtPDd@-4|3lYXMzs~U+rBu(-HJQKtvCeN;-$EIad&sOV8x4<;uMGA5`ye}(6x?3U+7sh;qwxFT zJ%oY43J_0}S*D|-FR@w)Q@Y*eGUelpF(2X4xy*SHM3Y>PG-H4wU0+NvMDgUK@fBpt z?fp&Q+~Gbo$*ck5k@7dA`S0p=k9~;_^5`e!&9VY>Dc+A#h`ZpkfMB*DAF;yFyVc|?c6`Ky1GU4 zV8KV-LygwFeV%1d47OnI0< z%8o@I4XG0Q-a3tZ!)f;cT6%JYAiQ(P#+%CF+US4ZChwM6Ks&;|_pZ`C0$=UFox7Va zEHxhJyix}vRXmVKRC=+YkuS%qhrWqdA&vx2Up<}OigR+@8g*Bh)hoUEf#>c#2U+~8 zo|uEIQ4eubcrI?54X<|l{LD<_7&0k;k)h1ix}-<{vw~6k!@@bq32Y=I0Y*E@%0qga+yj+A zmtG%3`Nce`%-&L=!ufOLOp4b2gz`)q<+#zs_>zK^r&0<<;?RIjThr==<9KRxUG*v- zmGRaWL3{N;_EU~2*HLPZ1G_6DjcyN}gZ0V38+~llJq1Zl{I*1HubHEf1b8DN+YT>( zy1QK88JKEThV_O9Zche|rDkCdH#a;}%8oyjgvE`Rp++H6rI{kkrN@*OKiYN(ODqYnN_ixWHY(Qz1*`}3b66hb#m5YV4$A}ADFS>@ zZdf`ol+Nq|-wtRCpTn#G+GI4GU>KF|x(a|p$=3Um##a)rXCctkB)bKx0E8aarjPdb z!~dYU&dVG@o?r(l>z(h(>}7Q_dJ|O;LkC(anOl|_@AOOS9>VGWF(?_0PQg%s^!GQD zicDNQoE|C$%KJ3ZzjeK+d4Z+TfqxM{|r3^cb)vQ`Mzo9PTAO|DY`F+TEs_(1L0}WvDM!aow3WRqS~Q+3I$j z><=2d_0NLOJxMF!B)I?($)j}~<(dEUzMlYcTQ^Od+b)tf2%ZLck3RM)+@bx#-sJKJ z>{5-a&mh30EPf!j@Uuv3ng$tO%;l_MZ287?nd7>$(_uJP!^D*7y(AckX3`;J*d^`_ z+XkZUr?m8Cx-(tdDJtCaL&p9hI78s+LMFwvRTC7Gxg-y>G*0$~RHjzYG1h@R+oR%` zltLwKZvHa`fr(qNva>FKPqgJL$*?nVWJ}S8>(j&OslyO&cUTF1>{_Q(=jAkM!1=K9 z;WG12@78dz<@`|wZEJrwK!gCYN!h&@u)FqLV*%Rl39V&-2lsWa^{E?Q}N~U#|x6tT{#<<~{!LP04 zjlLfmY`1uhRX*`QQ(do(MRT|x*ZfR$rRkR8<-wqTA%RP4-7=uH?rDlq$i|FLv$gt8 z+hR3XROJe3?pA2IxHZL(9+;F{95~i-!C%G~33uYe7kszl$&bm%ziqRHO7-A%_r;mo zDJn~8gU9!(xlRNEr1+*`KHv$UVc_X$7C75F^=j7j3}^6w4SbgQ?8C$=3u-p5^YG$% zqvz7|oNSq4A-Ipfqc>-Bu*nn`8E_)h@P{bWI+LXGlyxP6Z6C?5By+Sbx$HwgsF`zUU;efEUk)pgMmX35|CVi61`HJ= zpE=V$YT~chD0OxK6JErZaiI*Kn@UsWq%)AM)Vy=61Z$LOEP5S|m^x|$^4-|(H+{B! zBtCtsm+t)xu8U6@WbwJyY%9v^?tASMnD(dg{1~yYHIG4T0~mtwc%RI ztX|^6X{8?Xwo4d)OiS`$8qo;})OJIKv|(pf1!-X9ypPz*K4+yc8qntt7}y*1xX{Nc zfRabD+T-$?9XmWmTuwGlHJ)FtB%jLER2)6ek9UvpR&}^&a6hCXAB#VUid^gowQiW( z8@Di-1l_;JhPi(gdvm^B0KNX_<^A1`ao~vZ`!MRLnfc}J+IGf25LGYApG|$T`(z)IN-d`I8MV)w*}$ zzM~4#a2qj?QZe73R_&Q^sN)}aws;jdMVA@!t!Q#y*8)}H^ef5x>@C+_zdwI8(mtMr zgOxn4c0>K8bpSWX;gd_W8z6Ih*AU9M|EpUVnphU{WYhuj!ZZQd6-@ii{^BU@Hb`R1 zH#%)9PVbfq6x+*@7ej0uKK-vG%YTXTfJB5`jB~61cYNi)J~K!0hw}fdmA@w_9NrB` z4|>>qrmyV22wVQN4B|Y>RIBg*PbB7I7}#UVZz=~#cJOW|f?M_=X-vp-&9?n>(3p^O z#%^HkFiMp?sjMZDGajEMP^LUG(u`(TwznbUK{TZs?{6v5uN-v1>f9>GgnG!T*IFmS zPtsMFO`Vh537e;^rb)d<3h8QIQrD)7Zjzn?&i)k3ortZN2->$l*52l{B)QWxw*5@16U<&BRwHjfG|XpO_1?6h zg7C+*i$N~)j833GP{sN&gk1m$*H+;=oXhp&2VNbGAG*-*J`7gkd@lVFxg)3r*e(%U zB#gkbzX>o~6d>Id&Zb_NszR+69^f?CDN>iS< z5hM{>LNwKw3cmp|J*Cjk-g8yDppRUeR{IDH=jmaeU*Lp34F2L}h~~~Z3(6F=QMxt$ zmvP8;vM|FwMS4kpxk~58ns{$*vb)e}MLylK4d>jWm^YaYo{OblcSp9mB~qfQln|M9 zg6fN}3ou;snPE3!JmR&kP^_@GoH*{az6Y$_rye=`8M}`bUcWxFt#Wu!&R((Ii$(1i z5014=cbEUq%CZ|lB|*G9|DUE#vuQhdRMqCRdd7L}Lq*o+^H^JHtf#v71;mwstnJ31 zNwHG=Kv|D}T(~nGtiREUhbPjt^qG_M<;r4#tLKT=E^#IJE$xNH0W>Y%8@~8L074HPxR~Di3N?zhL0FSyoIMJ>a@4%_-YVyMZM21!4th?4E#=&sU%g{&8RVufBbn% zn7f*}TwzfXzqmw<+2g&&jJ^~b*#tTIlj#M{B)Lb;N(8*@l~**uZ&KJN|%65t)x#(ypfV#fGl{wdy!VA>Iz?* zID+EWi+Xj$zAnCyy>V5C63r8k=n6*$B&T6)m6UABrQv~K!xkTOUQKmFi7o$*Qam3nN5EIUFgkkxp{ScIwPUdCCVf}@fr zTn>UTvkGVCgl#E}sw2v`!5COfSm4lp-o1QqUmSck;l9(hC3@*f%LW#g@p!_trQ^B8 zo@DG|sx-Vb@)>NT_+q*tuDA`wlyZ^NtxA5!3N@WxDc5o{-8h>B6-DDaX0e@Pr24$P zPC57UZYo??kj7BDvi4lrB^LHv^9x)eY6e;fm?}{!W}Rg%SA|Z02sBsrre(-;3RXeR zT9enX(=ap^#0xSsMSP@bCPB3UuUul3{&lKji(R1(0zVkduAc zEJ9#Tn4T&G9%6(;J`vnPIapJ#sma2xzdkpym#ja$)=fOHK4@Cal>g~w0YRlo6BG>0816Ossw>cz*uLPNz9a#f2aG{@ZKV}OA(wIWH%a@o zoot^k27P(lH0wWCdvvUnDA2kwdbU?-7Tbw}@5mceezWE(+KSHZYP**7dwrqU3tPFM z@A7bOvLyf=9*F7;gkg3TtvrMyr|yb7{Bub-jc=Gn%cs^7pRa zkXaL622Y6cyM@iZ4pF?~(7UIDJ7JgV<8QvDiG@avHc$_V$*{{6u;(3_6N8pt1Cp{b zJXVy3B^P#LetvWS@)h^lJeV?3Irva>Q8b(t?xJR=;N%V)@3|fLe&d8(OuloEUkG2) zp>@_nqa5RdMvi`No$~A{#Kl(C+hMaTPP^`^P8P}{V1d7?S2Xqb*Vo@yhHJ2sSl+Vb^r*-4 z1XG_KDxwZ6gU`H3hG_;?7NXV@@$7eA@^^Gr?}(1a$2Ct8?F$6I#CX05?_soqhk8OZrkU!NcTI}1Rkox9}!F@#ma()&CvisZHhuWw2#9%(l--&3(zy}9{_~rB_5-zL+ zjdVGd2j)behmcs0Fwr9`#MT6p*@cMpyn4hg1k(m=R#f9|AJoeP(R;usrIn$UsT#|& zplpSdO1h3X*K1Q;SA?|jqj6(?`oJjHX7g15$s=}#zVkb_ zlKhN)hDV=P6S2se;LB)qg}Q{rx~J5ZOk&tg^uj>XS}qSHe+3r}3rHZjSBo>ya4Pdx zd~n}x1~h8WHD7%eii5&i+j354nMQV$pkrO6<)bt&@72G?EV|E6(G7H!eY~fHFW{uMP{WYHc15Hx+P;2$l_Po4?34>< z_wjeQPrcwtOkm|tj&iN|Qd0O?A6e{;;G@;@WeGd4n5F8KE{7iGyW5E#rh0MkGn9FK zb45rlaN?kALpc;tx|8LV{$6!kfVDuX3_!rRtKperQJ~Za`|>w0%A@g6b>_axx|8<* zSxp+k8B>J_Zr{UAV~hy#{qwfO`<%;SG|ZEz@54<|)xi(&6j8F!5KQ`pvgYG*@F6d# zeP%{~pf=mhdu$a7RX*4pwb+E0mnks$aUXprDpHw_l#VFm#ig{*$He{4L6spR8P2K-C^RH zyLMnaUi4o%hI=C%*stKJ@9256nl6|PNJd}7#!j70_D^9uI#c? z#%jaQ>`>C2==B|qKb_ATUZ`DK9hGLNd*Lhm%iEBBE=!;2al9xGtjgVf)?az-8G5La z!{i)+#axYbB!^qSy;AJxlUe7VtE?A%fz6rdb;SOrE+yiKt3uvDk4f)b%N6De=^_2m2VsY5HFe);e+vU1Xg#Iu18fAo(?Peiggg!v zDyB+d?bk|Fr2Y<6V(inWEifsGpqi;I(MbR8Pfnvs(AB&(aFI?1+u{d2Y{fY<_*dN} z80oQ`3G|2USIKTMM5bFca-W8cIjGd`V#iC>G*WGk`bK;CA+23kOi0pBO?|&C_&syXjd54Bt24C$>;sljOHb)OcUj zl+<2G1FwnvK{qcurm0h4ml-(73zoN`C z@FV--cVWg#s)s)(;iO2z+w$ex&MWywZ1*SkY$3CHpgFjh^ORcw9K?rpNao@rZR_ z7~p+h?E2;$(xu-k@UHeg-+Y79GAkM4`CCLTx_XeD!MK6aZNqu1tsO77*U$IE1ntLg z`)Ps0e)gUH{LM)J=Vg{*DGH4u8sGIcrYccCXZUkEO!DJii)%~t$glnZm(KS8h$d)! zDy|>;S~mybGyGk@$2q9cyFZOi78|LFO|hM78GS?$94HE%Zj-9eaH`^!3hws?OCjZl&PK;*m1nCBMOHEGC`Pm2?y`ofbh zC&j`JC@xUFkw>RTsk5x?v3e^AW&AVO9Q#LwK2N?BL-on?Q!jw0pRL`t`Al5$< zgTR(UtKlZO#YHVI>aXB}HpBYJQ_sZQd zykpn^s{rzKoz&2XapI3MPuALn+lOLRfp@=zK7_rLvwvf`x%^L)6?nVxOPOvi!e3>S zLBlNiz-`h9vjX!KC};GX$MDL?<2QQucYXQwM;IX)<8;1UZOtnAn7;NW_D6P1EV|c- z=A#fab;sKt6oU7Y*8W~3HM#AN>^I=TP8DJ7a0tsUoXMxf;rc{m zW*@Z2sPmdO*u0ggx7(Mcjn}ax>!2xU=6i+nOKls<%k3?L$5-F8qqlqk`+obENt!h; zGK-5#Yl3M?h!wfMi24HeYpLNUxQdAOS4r=HWhABdR9sWT(g*wGti2ZWNDvU`HACy^ z+Juesd24eti_84;aO~+F8PBo`tK3S0S?&uiD+K9OlWK))xcPhxW1gwVPhOtlKrRsq ztiH;i@JUTI#q!Gf;E;hmVs0VNLtJJ3jB0;xa!BRq8;yo)+U$(?7QS+NM>maYv-D^6 zgE~-eF@@Q2i&aqhU+kVD>2<*N#KA2xMXGJkO21R=09Wfq^6I&JqC+0I=&K;iFKF;} zTcTa1c=gnLzQyi&h;6GxYbv5Gu0W+Q%!cUyl~Ph=`%g+q)$myu`af6ydmWmMa20Z> zFXXcwNxU>kX`_xhI88~5Vc64|x-l0@$> z^ac9mKHRU(cnxo#XeDs&c%fPK=MTzA+VF-zxL4_cPuT@9!Xfrp%l{czvDiW!G!+Eh&j!_d8~ z!bg3HMjaZIqoKx6(VX)FjS}*JIQBLVLm1n;-lgzuo}SLwsub@Dn~#@h+%Iu#x=fxaT!SeX6iTUt1aY~axD|pGh~BF| z5bpe^Eb+pxS@c4N5!i>+uiq^fx^F^)Vf=uT8)OSh@1;usp}QJ>PxIZSJHilpU4g&%}3 z2>G@;F76Y;6SrW`z{OySKFGhy5b9f7|t5=f( zQMXHOD~7Ol-u@Y_HBtGVP-Fzet#W~Q2ivd)ML`*Fend$wu5f7cS2<+)?Xmob|0La( znOOXLo4&}wk$5(!gX=Q(c;)iBUgMQJ`xVK8>v*6k2qQI6*}zzG%7_glttdSH-yDNL zYuq}ww;N-oyq57cLbvGgDspr3c7hD^S|%|rWOs`DamQ!-k5(ePPa6q$Q}*uovOE4E zB=USK?OS}YisK60UW^H-!j6fjvYV46$_GWdGesjquKdzfSv~v+eEWb)0Vf|<5jo#s zv#C4_3mpc)als-mJ6!nOR7~TYa(0GJV6+-N5e1uG;u@#p$j*=9rnRq1L{T{0c?@3Z ztutOC77-J6$3!Q0<7wVn+KrJy-V&MTAt{|T30;G9dn|zZ%X<}#VZh$sS@bD zN&YVs(doeR5x7-{r-F@S9sev$G@EZlUhI`IpVg(weU-E;T^wQW|~Z>=AXObbA2b~J(@z6Urz6~n|(`~91q zC8YdSe@D^ZlB*99IsbB!NN4gu##=#UFRchFEx_cx}!xb?fG)B=8g+wmew=a+WU z4T~!n$yj|s!x;quYzN^oDu9+t*>jlhN3?MU!AYss{#Ml|*0JZ(NuA=~!bMEH2jnn3 z>qbj=NDVN%5s#aDvI~H@IzzK9#lcK%Whg zQvgS+!nZ*_f-NmQJn!`nOshc6bl4&^?3J%z$w~LVj3|YkZ$7lF9s+$OWJN9-rcam> zv&~m(kIH%<2O-!&0lVb_&;SC}UB!F~8`p_D*BeKhhEf^*Hfh1ccKFVXEyGbps|)yB=?>Ga%;<)c$%%DguTv9+d#_(v)VGVSr1tTfR<#j7RrlE|V6p{vR=ZgqhhV8!6@dT~!P6?r$x8Vw*+ic_EIk&d)jGO^d)8ppK%d1FTvZS2< z919=n?RWT8)L4fFnN#)WwHKI+s-8U(XtI#wy$^$15H-Ke_ouMiRuhe^y!Nj&lS}Ou z71YxB4g;98wB|FCk^;JRBAYYk1k+pXR0Bhu6HT=l0n@E zWz!vt%q4#CZBc2m^*@AktW3Ev1rJg%Y>g>G`!ikU1CFTjO`y${)z?yj>Bf6Y@j<^Q zYYYXtcTCKjB!f1GAk0N~J?V1?7vJ-58>|*KQd}hUzV7h=WxvT=FP?&INj+hTa2^*C z$s#!3|BN^?WH8Y*kZSCfR15&AvI|K)>0z{F3rpQdl#s0Z9&wdN?3D@LSyB5P%OU_? zMe_j2?qhZdY1Rl)Zn_(7xXYT%kB1bL#SAa#z5+7uwv|MV&5-_-v%d5^uiNd+9N$;W zCen?pBc9vigvtTqPP@n1#rbKC#=eC=Lr&)NB0rKqqkr2|SFr?@r=`V#W(EZ)Xd9p4 zmnmL)KQ9+BuL~i&IzS`t)_HEmKmTY_2qpOAF#~uygP02HO+^{N)7b~(F@EZ%^~d@Z z955Whc}pIS1Tq&r_>R?CUf^v-`cqIgTUhasrl|Y7>rQ}oriyJ*fKV9%$c=r2NV9(C z?zHoh2XiSnOwn;2({W{(QLZ;7Ox1*~LWlp_*^)Cg${!A;7Caz!enaRRd_(>vE?%V8 zn`0TU==#;35M-EkEse6)_SajaWFHRETc#+Uyujz_HVVtydZT};_*~&i382`YL1el0 zF~@2y^eZB94^oE2fGb}6duvD1w5i1&^!baRn|a68-KJBP;+hRe^XoRD&(rwP5SHc< zZBcKS^=1}eg?urk?Q@@Ccrj}BB&CYmxvEQcd6VjMF__f>aJ-&zt^txMv`tjT_?Cju zmiXiEXSnw}_XSKvBeBV6Y&)_F5K*t8V6S76g&LLQinglg9I#~+os;szG9AdR!@oN$ z@e$2{(^W8Q?b3v!B47C%dwHmxJ|Oa<$h$K;T7D}bbwl?*DJY~ynrgDX|ITkUWEVH4 zkxNJ5^`JNxT75-7ZUVEP)<&vU8M@tXO0?tmCBn)H`>m%axMjmo24~F)_n-}B?Ln^K zMp(tjairjO(iC;|lZxZD=D2b(5bWKOAGS?s@iO*z&AzE zfp2#}A(VUP@G0c-Ws@av&vNgRDK@YH{KRqTXuR$|)NKE= z16(yW+H1CB%SO8RuFVNE)O-=qLYB&Gm^4q${dGq0!v@QtTflUw1{ykBcJ=8s%~qK)yFUV8!1fVwn|Z4 zKeltuN^n5DbhEJLA9Ep9F%~ggtemmZ8h9= zr;TMS_WRKgG)*t6+Y}3OkB0vpeu1W(u9ltW4o@=Mx)sU$DY;v#zQYCDa&GD)zz2cn zOQXyQhHB2I_9G}5atG$H({)Z1Te2RI!vFsB7j(fr=DJU?I?&_o{V^uaZsKbYf0ugx z$aU^u594wBR*6Dhq0#P8j=i|J#t^hMdxl)VFxtHlIj7KI$!jO!Cd{?N3x0db%i2r( zE@h@F#|4sDO(ZhkHZs*dqhW(0OT2}pA*pnaVeFcajlp~dX2_M$-!s!$OSoA8Di|&y z8|Q_l0jl<0RgaxUDPE(;^|5XZMWSIiF+pWC=nRv{zF` z<&y}4E4N(3khi?8I{_KN6gctd3xc!>hacdEgI4HV^zlijrw+PcU)cmV@cM=QUo+%4 zZ2z|oPiYKy?g1&-&gH^}FI{i)Mfdu+;U5*?=-=LrK(ZmsaZ&m~aaNUVvKNYKD#m$0 z3hm)a#}m4zwcJ0Rlv~mnqtMr+cGpk`e&8txNIw)HtX~ThRq2{ zCR=^b4Ii_s`T$4ff)R)?>6S+HRZuR4onQXy0G)>tcE2Sg+HS@csxnpu_=>3W^zGp|G$x#W*0^w=&LFPcY~Tb}&%e$8MfTT#S67>$WR-3j)Z zza7UUmSnqW?JU{5HwVs!d|xt3$2FgRAIuAa1#|kLqB46K>QOI9@ZI+KLpXy{fGf^S zKu0~r3}%JX0v6NHD&oTJ_>y2Ff8U<*B+7sv){jZzx;ea&IlnySlWm*1vm2Hom0LA$ z!vO?$Qy6gwvV{6A{$=5t-d7?$W}gE|HQIEL26yhbRt^L=FkY~UOIZm7fO(XHuz0-u z-d7WYEBwYsjUr8bx9479CXN{ZWUrKx2QXV6h*14KlJ41M8HEiMVml}k*xj49 z_F&SdO;dK?!Q@u@?XIO8_b8ZZt809ESIG2Np^b|E@gS3DYQtM%^fp(X)U@_Kl+%O< z&YvqHJ{#~&VBmF!{ z8ZvZpW59aCCQ)|`EWYWWMppUt)%os{{k#ww7u9Kubh8=ed&HN(=d(~tzTF>Yn9?xX zq7>|Z0A^9!!D(*b`f8lb0bEBK8k~|R>WL)z$*WyZ1IsT7nqan4$IvF{sl~v+3j(uQ z+F8KvvNtTj?5zmid`4d2G-~S>l?#d07tw-ya*mT+RK{2DN>M{R*d(B33M1&f9nwip z`fBjU$gd}&g=jgm@I9QS0p&8!u2a?vy=4%~hzP*Fnedbod*J&$Vg6WBVz!j=m8oMV zW2qqM(ff855V$|{8qNI(kGjc>_-%CbGWiPf1tm*P1c{gP5@NaZAUd+2!yt`5!Fd** zL)cCZe>>!{EQR0Y19FM3M?GBsCPe8(UK9E=jOQ{eZewJ+Kpj9|vQY(_g@9HqoCLYV z5_YYc`#r@RXyk0uL(uv){%gq8pHB;)Pc*M8$ZB(%iCDWkY>k;iOA~B6hNO-EIvwl^ zAJM%vjW#*h{BT#I@G(QF%bKfKXiZnnc1RFGE7*MR=@6XJWqIy^QT>Ou=Yxr5J3Q?| z0YGU<*L(CI8My5CKP>yVZb5#jx-6bnvK+Z*ElaU1t8mt2ZT~XV^t)wi*6@kVRnztd zxo#D3*vwrVQ2enU zyxl9@Rw+?}1-Kakznmc2uxo87=QfbG$X|}XqPUw3?_c*^UL|RcJUcfRZ;&i^m^7hA zt|xYnj3!rgvd{7>+^`n&Lo5YlmYd=%MQo55QD(ppx;EK|Tjx=-n7bfHIc@eWywo0H z0?Tuq+4iziBd!mZ)Gm*`c8~&>)&Vr~8J=qqKWywPEtR9Fubc0s%H;zD!B|b7SfM}F z4AVUG9w+$2J=Rz#Xff{ zpuJ6GTgzMsSD4xe#HHMlx&lK3Z_Ibbxl2iuYdn{g$}%4yWyKAl@BPpdFwGZAHqOBL zx9R44Xv^d#7Wb3Q#l2Bj`KsfT1nX_px8fkYb}_qb_IPrMk2Tqz0p+F%esRUrJpRjrZt)(G z6q28tKpE!8x#(7Fh*k%}0}oM(6U_6XYOGzZMxs zr6~QR^-LeBvDV!tt7vW~qN=7}cZ}bA1kX2${S)DY6c3qyzMVP&cCD_@L2rqV9*8gd zmK%34%5#*<6{rX6p=Z>>iEh8;CbO%=YssXHmYV~hWY$wOP4QaLnGY&=1mMTcS@a>61S8Xo9WsE1c_Cp44ZVBP|S%`8>l4n`6&oufV(LD8;3> zz2N?L@4_Pe-eNm7;sb+;sklOAJt%s?SXYoc2RjdzaA0oRM$LgHGejIpEZXy-z_hU@ z+M2&0y{GI0riq+x6B)3}m7G3wK`2A2`kk|Sdx1^%w9Z0-<-?`oojy$-*U3qAk=#k~ zUEJ_0nP5d|N`!3SF3a*n*vRj;Z9Y`DxP&Vp74w2aizYA#X{*TN7~ol(JaqDZ8A$*C z$Kng?jGpH+9*aV=hrb)Ie)to$udf>}Z!H^L?qyexO^i}x{$xA^vs$tXF9JXaR{Cst zVVP*X{fR&R?tv&aX!fQG%8)|2FB{5lycc=_a|?49b11dB*7Bct{ka~T?xjP4nVXa9 zWo0DC0AHY|>`EOTZuY2Iqd4c4YnZ}>i!Tw8!S}=cGBo~?nU=P#ZIOlbI00ZUSw7scdF6bQo+-I9(Nu$xigQp_PFmxHufs{fZmFLls1bawJW3$8za5 zBbalh(|XN^rdoLC()i7W7IDeTJel-rRepEhsefxP{kapRET|-;^LB#{_Z={yj#dirr8`mIk8RJv=-X1frf8~~gJId4zJGrF2! zg^0U@a*^yS@)7DML#l*MEC_1Hgk*`*A|a$_tKcH%Fj;hGFr<>~`%{%a4Z`oagb_=s z`ZE$tzh=D5e~lr*?$x*@D!MeJeCHL?GZQlGMjg?omH+G?TiZ;juLuD-eyb5MMyd)R zYpH*#3f5wdOxxdB_{bMC)((G$N{?YaTjVuunZA5_c}R%*ULPi!DFhC`E9yH=(8isbIY5f3%hxbliZ!Ed<>AL z@Kg1aC07Xv+NVVBf3lXde6MVT{iH1!1#0u6m+?B{B_+u`7}Q~%dJ*#J3c=3s!N52t z3->I_*0f~&VVqQ`E)P@?iFI(eC`jbZR!slZZWa5|1hjXP&)U3K=K(?nW!!{gzs0x; z5=dt?m3BKsukLqv@JHcATg{&@HYRrAyE;`*>}ITqi{4@S7Dl zOSoKA^rh&8=Ufh9C(p^7ty}n<9>Bmk5xx`b_55ZMz*tVO-zPWr;N(rjPuyqgug_;n z$^1MymN@$gxsbmhvFjdRNkNyNf^h(F_3y@3O^b{)V2o-uuAo%vx97;}GQoewh6w~` z?s=%c!h~k=i)gOrf`ETNJZl^$Pk#Q(m1j48U|_r~n`nu@lo={;swr)NaRfXEvPP;iOO6`z!c&7BbdU(znB5b@oQp>$O76xLEv5f2r#X z*{4r;4*$C<<=H!Rdugf1U^s7Sa6VN#O66~@WMy7Wcu4b)8H6jCz z`vH`*TNxV^Ba*&F(1b)U1b?NLTKRP1;-+}?8ub&6-oh5^DhCAHxsG+_Q-=l0*(AE4 z?ffVMDca|B4jJ>80a<%fVG(M)V-bJZ>~wC_ARk?YHQw|xF?y~I;{>)hNo_)m8?OwB zK3KHwYpr&F)(9sqyI)th<3~uxAKm$eGobQjiBX*N^bPe`SY%h?4B)S&{Y)V)@aGfN zsE5ps zvistVrOdRx26cH(bVM{P15{PHQf*A1l{CFM2l&=dOK4Gx1tS`&oQUc>dpof}I zR7oEL0-J5qm7hi?sonJ($&lrvE!XOE+~BZ)b&g#PXWPf8BoWq5>nd;T&s0-&k89IzYwa;Y%t&83fyp=Ag6jichHxKIh!qKQLQO8G4}>BU=;{5Hq+TIEvJl@sD+M!pH&Mt#V6=uk)`9-Lt4%lrbNTHlQT6)7pYTn#A25 zf8n4dTf zQB+1_#wf>fH!gYm3~2Wj*_ivk&o@;CB@0W)vjg|=S+@3mzuvOo9n=*O5ME(6)Kuo4 z>sbJ&|6EqtuZL24PC;bjT zK2_p^vMOMuXIi#$SnUTN7_5{YZzAIt%5TmsxqSQK;@1cE zvbrpX&5M;7WI=R#cYGCqzn9x>Ki0+`-=+RDvnUG@R)+JlE? zrzycm{_T{$$qnr>sl__zLElOIo$6MrF8=m9u0IoWezNGGsX28>VA{pKe)ORzEIvc;a)JJ+3Yi3Tv>`ybRiB9Duv(KHO z1!Z%WRptmBH=o6kKI+mw>GPP!X>LgWRF;Vk+EMXkIT^=>v;Jt%AxI57=tXyjQo3sG zLx3($7O79}pmf{8fA;3=Sn*D?I-@rg?1`AWE$3JzyBY`vAZzGk4iP_xaMkXtH{aZL z2m)2${B=uTny!g{&>`^rfKUZ+t1%-Z%%iKuBAtW&$APe^N(ZYg^Z%8(-@Idk1xUWY zrcZ$WsFk@sPQ2X)Aq+;ny}ZSXrq3QE9AUkkziA=f_=_6>%Ge(Eg_rLk%?OxL8*_=E zxsNj5fH|yIQ#Q()mW^#pv2j@M+`q6V)ZPDka(*{DuJjyHom9yJQal=V#CGKA_LF7c z$ZFI*prb3&k=HIoy@;$CD+ZmUNu(YKBaghKo^a!RQE{&Mizf&3zGh69_}Exd7Dt@U#Le7HF0a8~*63Vd(e?r!$P}vgFZnI3@%-RZD~Yj?2nM2@0iNBBJDj*+x~Y9)HCdm6L3;ia z3m(xN>s9=p{^J~^x+6P+SPky|2sDJXmXV(ir5wTDVhDB(qch5`DW}PJaLr7Hjqb&= zKB(TYRDHk=PS(Py@3=C=Itx8p+!m57?YlfXe49gTRt!3DW#(w^#LaUgVOWp?MOqLX z0cQ@DwUA|qpK=6Nl55d!c;BWee6L30Z(dN{(thlf2c8ArXBV{e<|&Mvg4OFSvzMD2 z49hW01=I;r{m#olbXIMC`1OsA0z(nCvS!PbvKzpXo|R+<(wb&Q)h=>?PCHVG{8bX| zy%`>%!KU#nY2$W9d?Y3Q?6|*n3A`0tuzIfk?C$I2Mc<*_Aw!r$-$tIF>$NI_h}mye zhaF_go4>lMA`JN2N=JptxU;SWmW#Y0)jYO?)S`v^|Az&@sr>Kox&(M^3utBrySni?YW;pY-q7}5M+Y`s-fT|u|48yteWyDi);cp$ht z!Gi~PcPF^RLV~-yyK8WFcNQ)SF8?`u@3SB7e65#iZC14!)vJ%Mo94J}7zJ*H+ZB3| zA8XCa4mf9iNwZK8pHyq_{BQPIw<*E|inr@=v85mpWhWd|3{nlv6!JP!A9t}(OwRMT zggC9wUgcN0L;8twb;eJFgVxk=bgkx+0^>T>8I1)GD^Dk0W*B=^H+R}NTpbk`AJ zPa|tCrkr6|fU2J?wuhGSW%xs0R)g9I|5>s$wATphLkf5WSFNsr7ADFyeDwEg*h51{F4)N!0$25H%Lo4Yq6bC3!%(qjwGs zTUYi)f^%?yFQ5?_ao5IhJw?ocSh6$c5D%34EPLO)tu(ae(fi69{eknwXh*zjbi($?mvTnwB=8T zr4dG|FHX|9kd+ru2<`<;Cxtr8*oI@;gZ{Q33Z|zGwWyly0w28Wi)Vdxv|3iE1b?LV zEqT*dp@G#U`fxU{7@bv5jIH~_dB-rDx;MX-I3hRuta{S{#-*sO+OSx4L3%JD;e=RI zO6#muU&}QR-WmNI^9stTTH-8@cj>g@x)Y0odUl?5SCwfMsRWbR>)`1UNlqSs=nehA z=DX7Q8@aG&xlZ>RB($eHoje~fvQ+Z8z`Tmb;Wl(181@YIah(5!_W=7q`z$rdP(n~u zL)}xeH_-k?0$VdXheh?V`YC1M>JyxsJ6+&A+!2U#++?FIA})SE!HzvbOC2|>way#Y zmBrHV6Qy@)1`tr0$EviQ*UP3t1#k#%5KJ5PN0eE+_$yf{)NOp!PQv?z^D}oBG+5{=Hdl7R7(u4fZBdWbLlShM}Ic zHg+1ydx*Ho@_K?@YO@KObco)W!ohrfo0tB2mm}JP&R{GD#2;sR(8_tqhz(uVHzyx(Hx1#ba|ls9r9Q3AIEf;6j~p{?NX<%W+m^4 zI=->2SU14j=PPfh$DU(Subv{LYcB%FE`qAjM21e{_6dUgEG$W%wFCaE@|J4oh=NC1 zrdtSP+Lg9lz3>sR?M)H^oB^fN8o~!BCNfQFB{gf5Gf!BQOe=_?Xko3%QHt-Fhg5L8 zVeU_>-;DI+&o~5`X?uhB_)-7p%I``g?RzvDo0v{@md};3aRStbm_wBEXQncgh$R!X ztBEB$UU)z+INK=4elT;cPqQ?1BNGiYD=IIKG%?Gb*nju+bNUnR1fm-KRogatdOg8= zY5Sk=9skmHXSw#RH^OwJD_642u;<$Zm&edSuemuE7@mPnf_+5R`}L=)hU1{9GT^sA z&77s1;{~qK$tC)*^$()`wJf2>}?eAyVSOi9YJ1a`-w!T(QI+E)x>W{+Nfug_j=dLF1C}jNF7# zrY3Ds|4v8`Tm*&`K62MZrd}CXpH+RIx7&8_^?JbeFvj>V%w>eeFTOKnZNU&o3cQFz z+m42~9ftm^RAr@$IfiVsi56rLsZn^4Gk(2ZBb0K8##kQBa{2aW!+3FxAlvlUcr5HP zu#^tgZ}7~zdxr!6*ij7JUa0xej}&Pn7jj*zM5Ri}G&6E&7H`zI$EK(PX_T?nM+UH2 z9ux{#7O4-3#6&gw!Xs&j{h~;4HxyQQp9KsRl2cEJA@^R6azA;CyBYe4ql-M=#H+eM zUbBQ7s1)3?N_w;8;JLi*r`gX+EFbX+TCYw=)NO|Rb}`O{wB*XjuqD>6SUNHKSAxU_ znyGu2Z$Onhh5UX~c*#Mf+R|x0gyZRU=&;;86)#+vGWJB8t%PA&9)kLuv< zcI>dz#+X}G}JM{FOhrZgQs?8W|xxxVV>c3;R#%lww z2<~H<&*b@;@9e)5O6Rua^m$=Me3cp>b&X$}Zl*`U&2~_Tiv~x4k7Ar~-LgCXBFkO9 zi6Lx&Sg*KH9b(`V)0@*-ZjEJYRp~H&9eyhgA&pu`#h}=1&l<3na&!KppzKG<4mr>G zc`fUBpzF6q2VvUD(jA$=e*ERU%x=ocis&=KDiem!JhNW7iI*K#S^4dHfQdA1`5*|Z zDe=_q3`%Lrs?ttxt36Aq2ij*ZXT;qs7KpnCiS_7d1H0hF?tN>#R6K5BKe!0pE(>EZndq}$OTw!toUms2$k1S%t7!vgGrYV&HaY1JeTpEO_$cCh zfqp(0dRLjezON8(GUnoGeMNV0R4duv6XkXl$Pxv_+3f?}4DmAakOQXPcYdFPH2CR$ zr7ZdHN@We`U=WT{I~t|8j|{&hE)kjG6aGVeq?c6cvu12-J>JRVNhNxc-grcd0>>!2zu?dZ=%#Y<|ZXTv5DsVE|+m^=Jh zO^kwOPd@3X!IVCZN_a{*Ue437AIyGbg-rO1_e$dcJRF$rf!MrTRVNP%f92ddsF(jC zVJDjOcw*SEb1lRR@F;f`oO74#G7$(_d?0c%5Q4$A3Ps%_LGGt34>Eat6Sw+Si@D_v zr5~VLPoMtJOacbc(l?4`gYPALIT#i-Iu#nlFN*ydC1`Vc%d!dVTPq}7QGB~(<2Z#0 zR-eJHaOo1Gk%S^yiM15`j_*%h*{c)upk=d7LGYJ$PJ6%yoe(*hEB+y>UeM zk152@Usad?vrFcw4dFJko)eZ@jjJCcADTN!CAT=8kj8eiexv{R*=1~{=04Ic^cfz$ z^GMbLr!Uyxo*Fc=iFKK)WygJ+RlDo?r1b+~P8~ri!{ra_6=RSB791#0=4WMa_Gs`e z;wEwU)tYT*(GznoQGA4?1@|;N0msp>z=-*#sq!GX3+qePR)>gaA*9gI!Hydps4XdI zf`np9AgQ(Fl&>psEH5m=bTZc0QWAXwY8#OIj8ZArQL9OJ)#4&$8X=oRUB&n2GZof7 zrSzf_%V=%PpmUq^2(mW`_ZG{f6^Pj~nI=^_ZDN+`Z*>e0FhDtXeAT%uBsK)64TYus za$q?W;Ms!mb0j%<@xAR-j-^Pwr9{(#++Mp+{>H+RsmU@DrEq z%o9`h@R9u}Rtfc~z29iF0LSt&NUv9UBnSTZ`n6@upfP3i8?BM~vtg0U+R5K?B&FkP zZfESRGVHcvIbD<$U`%CicV0fL4XWw6FkwHav?~{yq}g~4;6&+yzsO#h}5;)WbOJpQMaO76q8KxLMZI0X$4eFs;p!5q!3zXHbGS7WsiVsBWJoR0xP2Z|)y!G=H1Sz^BjKP{W)MLh* zhNs9;0Cfk-{I9I{y@s>35zCJtTH(P&&LrZGKaN~#c8xc`|HL$&G%a7FU20iVy)v&Q z${5lW*CUD_hW$|czGZEj<&}qhW^>dGXf)kKyohQYVJF@3{{Wn&`NL+PAHBr)UVkQ= zBThR;utgqJN3>_Y7gZBc6)H=#Z;a{XND1`b4_~j?@h(u)2q@zm6|^oKmc~MHs#~sd zEN1^9J-?24`)eG#V@z)tYUZ0za9=AUrRCJNZLy6Rcz#5pX|GB(AxHfn;%7IG#bwIU z!f>6xHB{12yscLB)henrFq(5eewe#ZWY*wkObSz7{Z_>z((rrPM}klO_XZojX?x7< zCi?Gj`_PZs-i71&TyhDA!)@U*JjNy6Am^d%I3M`T{nEBHRGv8Bi+1(O(N}z%UOUv( zQr8{-bCTbmOq+ceCne$e&!FV?46v#Yz}OtEsDRdwa;qQ_ShdsNC8E7d`h;%vS{!+{ zKI+>?aKImXkN$oK61d*E?tr5E%5f&Vw--dJL>^u4gZUTI zS(lT@u-z;EF&WA5^Z8nQ*u=_Y(5vfmx*wiuYp>yEShOV3c;hL`YsLJZjA1m1zQ>hV z7ZjtFKB*|~j*yjIC+Goo&EENVq2ZRc0IOz*(GF_s9t=gdmn!k}?-T~xS+>-_@EK$e zjPwk33of<%WG)w&)pn~LM!5nB64gjzFxq%-*ioL?ioLNyI*Q~H*pbAx8vX#s#uLmr z*bbU?gO0?k(mncDx0-6CAw5I+f{FWcjKY|CnOjkJ#$O!;>Ie9R5oERdv*cqsERTHR zL5jdWMXq9!*Dfumcx`lWWa~%@>(RgzR8k`;?c*MAPsuH}7`BRyF}^T!S z-TnUSc0p6Xp!>^%K;%hPDet2^VMw-(IQ8v(`jX3;hmiiZK;S*0u*n>0cr9{h*!70M z+^>UfywqnwW0DD#)GTcPX-tcG^_K#8|6%wPOq6!a=gDE)xO-PX_7WU^D8@G*)Jdw_ zwu!Bz954*R%Ve~Uke2&+nCC1GASc6bhWlL76WPCu)uVvuKpd7{XR_0kBihO}bW13f zZI9D;xcco$2cJ>1b@0R-B4-w_;f`gL>-4v9g2;fg5{s%|ueBF5Lw;(FYJJ3!`){wu z&VI?}TfMU+bKw`gIp4=nw*Z|@1W-J}YSgXXl88^(U5~nt7F^7^^Lf3C>&nk~9PiW2 zqxNVjzbp1p2lA8i62zK-Kva=H&HDdW+zK%uv~aX!{P)?eMP2jXV>unr9Vc(QsUN40 zWzO&CgU!GrgSVKYwGqkYB5+$yCm_vslD*<4r2FOFs#5Uw^tGDi<1BT!KYGc%&7eDT zPcGiCKcdXz5CMspXr!W1vFT%I(1pg8|3<}bR1PM=H78IzMFIO@U~oV z)RBrn^SrM|EpteZpvi~OF!=_ue7kfO3>DMOc(!UrmzxipWWKPLIG&E-hqq-P`*VV* zpZ3krPeEA1{3E?M&+om>roF)QJ!0~!63J;EO z?EG}^@a!ejqbK*8O5rj$zCv1kXdR8pSg2^nmm-BOSTg>H>gM4f^7;U7oTT*zD0pre ziW8cK^)D|*dtM|jt`sTsAiEMFlz3Xezt z6#lb?|1)(Lry$v`Xzj?1DkD{jK!L6_RDj7G!Ox?0Dd(}!W`m3BSnO@)?{q94$`8ev z8Mi4VGq8CVLmKQ~V_fLi=WPy0<%rQjgpU`HX<86GtqIy{Qu`>sdoX;^Y#XH4C1;sM zYHU7hLfO0I=3A@^v#Wi zM`p<4C!z!)CG6tM#0SSrC#~wklTx-~)zQDZt9*NNiBV)65!=G3tN9AH$p_bu*$;Rc zqd=*mIlW|c#}DWdrjB^Va?g0j#3{P?Y39r@{n&OwuA+tuDi)EcIeAxC6(;c_=roDf z5AqI#BI|TA{}_y>ckG;qr~ak1P+y5U;n&!AGrdDz1Z5_(JLa%2Cs5MJ#C#|`VF|St`)#N}?&kS$I6weR+XiJK_?5h@kuJmxz28Qk zp)(GTYHiFt&0=sG36-^h{sPo5o-be&8;rTyVuPsLmP2;45-@qoZXo+e!QoFi4pXvs zzpQ&7(68M6bZ<89*IM#y^}!nUc{t1O_K`if z0-S_2SUmWyg*WAAULhny7_iMwiPa8%IN^mvcQ|F}(~%}Ql02?PJIIeeI&6trp%{Hj z#FRYB-;@-*_(b@TyfHEMCBjvHTkl@;C`m?z&Pj(Yah+| zTH57Dhq#sHwEe!${|PrNffKHNUQXpHG_Z%#w(Z#!aS?hmt>Ux3`aJtA?aTARGR$lu z!8?=?a{7|dfosK^InZh7hZ?u z0Ijfr2XjZ~m#+LLGzp(Zy{xv-L4zclC=u#H*Mo@f(f1Kz`^bu52(vY%h$E5^3L!iH zoK_AOdQLt5ooStaj-MyIT=O&#?ka>*5C!dsyP?;t8kj|sXq3rWTgs46FXs{n7zs?G zNDN@O7L*(ILY*fKNf5H?{n;5tLfIM?JU<4%pl4deY3{B&GU&)55NSsLRn^s_xo|Sa zDY3X2cIu3JNF^l+*|DC~X`?V{QdhBFkwKfmE~gYCajGl5MaQ48_hniN}H53?X+Hte5UX(m1l!>u;lj{3FQSPT)p;RYLx zR`-RlXepepDW8qSb;_L-Ee{^OpT#nixeZ#2m9|cHbaU1Bk=oMZw!^tcULT8-ioJpxp1Npd_7PGVIQ(r|o^dJrrd; zF%{m5``i*Ir%|n_yxPd)C%q$%oX3%oSjNm*)U1`*ZP#!OGp?U0)_=^OC`rA%{DtBXn7EUi5v{;)bH>*5+wn^u!8n;Ara7<_ zmX~Go3uUn|_45b0U2yFQ?mZWxIzcX}vC#cd`ChE|7kbybze~U+lQO)ibxu`sy&qK@ z$S#3wl7m*JMOfC2DZrCZ1CJ42Gr%48XbGlrjAQg_m=DqO6#xGaJvD z!CGg0q|Us#HodQ%U^t&J<)rAhVgs`NvAM1R*L^&qL4h^);Qn;e;FzMu$n5}1N~L= zkO2uG?4A;#Bqn)0qk;_R~vjGtu>jwYY_~n&O2JB-&iNayiA#)6Vp&tz%EL zwS3few8wBcso*1#oO4?Q5gd>y?Y z6i*T@kW>HRdKfmvguAMd^nOmt(WLRbt}3x0`O_o3aw58#h<+)Ug9LL6td_%UY&!YC zEBCXb?EgAaZ>b;k1cnrYt1KiVEYZ?t8M!A+k03G_L}&VhKM@V45o_x3(jS^NVujtj&!5D4-UDwtX?+c)&N!7+dGb{S9aS-S7&pvz8|TE9li}1_Ty3_SIKSlS>gx2M^<{9?Q&=#X@m-y;~bOP z3c3Gi!v9l(|3{U6o0mDFPy0Aw`QQ$;{c)=SuzMP23@QBXIkypp%|iUZ-Htt{p$I6vwQy8@QIgs6dF2`W$r9QswPY(+H#QWw-jGma42oK4Foh1hdH8ND zh1aUN4^70p#?=bNE~@AEe>Cs`Y9-{Q=+{;I667k|#n*}YRuMQ%T}Tp!Jk6^(`4YO_ zb+)8(z?ptge9d_k9={HBuckMF9tqoc+x#a26r9ErvO&JOLWY1zmuW zV&;Hx(B6Fi4=|eF%Wf5`B`p*Db}Hc%%*|P72N`(~5wM!ChKiC#bu?CJN#6UW!Q=W4 z0vgq})95x;^-~QCB|a4uRBl zC$nbG9irNu%+o(+5F>(F3V5(XHx^3}zTJ-93k$;)Jh#6RrQcsLmKl@Ft$D8K>y$aR z6X1-Or`>y0joDv&dqqP_+hL?K}JQ@yuf@rt}ubgcuq{Otc|*>a3vV!AKBT1KG-y!FKmT?5B)d{vqh2yyHsXGtz$ z<>w;}I-642#chjYMww99w^>e5&JjYMG+Oh*1?+P?@%&-qCoN9xQON9_qQitv|J={R zqFwdEZ#=LndqCc8pc` znjtcD*CtK}rT``o-ldsEVe3*~AyH&@Wy_@nJzA*XDa$n2FnUBCIjjRPx8rkc`6UBs z;&`1tqZPVwB@12wL5Ty|+dFAB1Vwt6p;+IrDp8@_{_&U2HjDDu>T7y}QtB zYO#GSY)@czmNBF#M;6b5f`vwY-yfcNO~+-iA+hzUf-LDD{MWD(linu)wo zoiCc7k2C+-7u$)+J$a~GIVVUl?bTO&D;Ne?{pLgl?Cko`Hrp}VTImzdRcs@}7 zmJ#_BtpgwbUiHh5KmDG!m52&i-}gk)ZpQmWkm zqkOL#EvMRhoZK!tq{g@tAK5N#{GColxPFhTF(Yp~x#+r#NDM%k*i|NKq&Do4E`N)l zDt;u)*Qhb*I@4@=9Z#g~ZfL^Tza2%3isaY)>^MuadX9M8)2lL5e$FUKVIV=X3bBmf zJ!`L_O3zQ6>b|xM}7i@A<>;w=Y$=}J|b^KPqwHUnfhQnCftXF znvfzSpTk~g_Vh(66^7B0=PY7J@pk0_>pG@}degZ1UTJo?#Q zK?T+BoGOLsx+k0>4Czd%fWzSjL54g^1Jfw>yt-_xE0FS68RB>iAN;$<3eDQ1uD)k! zENMnbNUJNz`HIKgVQv)$#q3hXNQ^>n3-e2pn*f^W7!F^o5mbzIcFq4-h<&_*YQAm@ z(1UBiy=Y?I6lPnL9XlyFHGtMN*8|+{U$y!sOaw0*EVkOQu6~89;Vx*VWh5G-P)g|0W3NbRhzFAs1>klXhXHZQlVX)-rYEe0zq^^}OlcLh>@X0im z+nTmMd&qj+Zyw?~<3XRS@?khI1jo(_J&hUozPWq6-x>an;%+wXAb~OB&J&s9Jrx+} zI`d|Tm(j5;v?P_h2}KcBnaCGl_gxnHB+_&<1i^j#Wx0m%TW6^8>PJKfibvkH*jVhO z2#enr8SW<$EF4UNnE@B2?HLlRul5;@_1O+SyxUA^IMCsaU0GY zY#qBlYoC1F(zEOOc;K2YpB%rc=BYM#Mu$2=qo32zk*BUF;<_d;-azT|(9*109A<9r zlO^(l#8H-9kzEgT>xApCBXIGP6#}CL$=u;0Qr|J{RU4fwS!`+Z1a(~SkhbQcuH^<# zHRpr&gLs^2ri6d{8Sv04GV=H>n3?DpYpcO`V><3dlI#8<)aRep8fffVZ9b##T4gkA zM&kGo^bHzZ(cc%uY18|Dx#R`jo$P=%e;^1l4`A(kSn(q`a+oLvTvE4r{--GXubPyW zAwV4goXC{%85jOvmWlrwAD2BD<}UxoKtU(n!vymhS*JHrjBXwzy4+#i zz16USR%3wI;}|PXCHS9v8Xer1eZ4P+sG6;8T}Ch?(aNqZrs&+uE&Hs!KqqcXK?@=K4Nqm1U*)_x z-U*uBc-FpLV^XfQWCw}|jV85mCDsU0nLX0hd+?GH16CQk)ZPQ7NfN=4@ti9fWx;}E zqEXjICPcd<0r7Fre;OtgQDi;i`n)rww|5uF zne8gYNXDk*{}Hu(3G+Kh5k~p+R)1y!r&XJM_Z|;NuJz&`$P16*ADb&k?58A}Y3g{c zc9x&K8_wD07E=?8`Gv?i1qW(7Cx@DOs0tI%KIx`%sMRF{ zJGnThD-J;k2IJ=WTkL2{leg<2Q;bDPk6X4ToLI0N%AnM2aXJpRTMgzktKng$tA7U2jM07}-rb!?^PW9Wtg-Re=C>x)u~HoL~D|gqnaxE8nGej z1Q*pKRvn+>N`I4Ygg-IX3Mvlm3TbkjC|fiAER^tvPs`+_*lm|$X$d;MecUJc*Ru8D z@8?Tl(#az?qg?|iON$zS{m-KwWe$waHaE7jcVn9+pu$~c19;L;l_u9R!{6gqTvnx# zX0^SoWR#=ni+H^d4*77+L`g1s3TyC#k1o1T0;>@y?tGvm>Qpu zJjFG<5GDV0{mG)^$7*I{`{6g#e*Hx~qT3fKff4Z3)hU!C87 ztE?k#OlTXOoaPxYW-46l(o&V)DD#ZUK$hm}rjD(G8!ot2OS?`9xykP1m$=>QO#uo2 z&ET#HPCqg#3Z(M`%^EG!5v~DIyT)jhEF@OO8tFOx%d7$A0HKWoLG?j{HAjYTF0C1% zV1405m?iITaH=3GBjSbiq@U4v`}3kuQs zwO}MSt;4XoCf$1dGC>eUL;>fi(lNA%z61%C{&kTZK~`YLf}}Y3T4rlou1RVSnP>Di z{_86oR+##T!+L4$5$q3^p^?f4?S9o>f6w3V^3*buBl;oPh#oNEAL4`3&l1_W3 zr(iN{&*b$Ip`<_V0+UddTBJ54>0U~x756E{JlWYCsY<=2B;%=#uE{{P&upblrnR42 z#p`NMW|IbmMeE#u`0slT1BoJ0=Q#A{b|BJ(6(>OfE7ulZ0J93DC6FH3hoS;&DeR&M zwzA++icZ8phD8GU~H!hT(L>TXWr}+*aNPd)q zB9abM%i9Xk3JvxIvFGh&%5=5ppzBS&NK^UJyRH?XQfadmh#|H+y5iM?S6}hQ<5oKV zT5f&zyKqyII53^WrXZL6eJkoTlIAXu%~r{Iw4_2D06DNAx*fWYObXUCaG4Ib7+bk) z&A5@tzaYNCp6LkrisZ=aIcg3sWlSKKlsv-+JImu43+k?(ER^0-C<*Mvqdrk9ykxgn zN+wm?u(iS*4#Owp>}QO)&kjA^;M{T8@=xLXXGe(`rN4?0IsGVax23g=->|NPOH|K@tSeCv@DV zwDMhkdHlHW~VK3iSj{wLQT!UQycf{nG zN9-9EH4#beH4rn&2^3zY8mHeg_~LNQPT#KU`J#OC%J&s~*uK@d-tmG$?QARQX1l(} zA=hi1E|o=UdW^YQg98vfe=$`+BuikvEw`3!i$?@uPx9(Xq$v6{1jTmFXzDLdOCn^o z@_cqh=5$qy1@!O~Eb=j|8t}n=^W-d3V@)W;1k6;i!Uh z;s5jt*fc|7xp#>uNHg*Tk7#?`-T+snW!+G2$ol_J!Ocm4)}X#qEalYD|6g_Ve|*J$ z!5B|kkw=x*Rq#4HZ%&%rA2X*lYAPQK)gQkpoaFexS0As{Mc0oG0xD7;mpniXsp-{> zKPH{;ho|dWwS;H>#=TR>K??H2*WnGiM*UZiCP2o7t4hx)Bl%wyS1w5l|Cz-$W}*nr z&czptHOtWboqkgF|I+M=AL}3TX za-zIDu%2%A!;>_8Uo7Ocd6(`H@a%^Ja-))X<6=GR!{7<8z5(q)dF};SUwUv{xWlAU z{m3ccNFI<$x0~eqhg(vtk7+dy4E(a8k&t)*a78C>-j;{TSo_AMUwo$_4*Ab;I~X|Z z^lp0O0Il&^VXUsD>+lQi?gR3_P%~W8(<&ULRuVGmZtXR7OJ#9z8tB$mq4T|YM|L58 zqyEj6jjLw!`r8Nf3EBXmMXboK^csI4%j6C#j;2ifWEmV~x%;;DRk@kwZtVG3Q~M8j zjDxe=1oWivFC+z{Qzz7-Ev|gH@`v?W69We>5buOd=^1+9>9#lV zCipJLP$uDiK;Z}jtD}wgdZ}tQW1T+6&Lpo~e)yQwBy0%R7~qaS9!6u351v(5={RKM zuc=7OEL&6|1nLcwA4F0!Iw=H25EPXWjsY=A;+H!(uMoRsIrkmif?K1h^xwld!887D zYep8VnH`gA=D%Tpg^Rq)7uFaB%b=_SLxUgI^s0}Txj$A-dGH;QXu)hTcMPMwWZ4gQ zSeg{vm^Qdhw|4zvcTj!>8d!fs=5+gn;_gtRo8%l%-gBK}cEYkRe1w}ZfAhR0MT{_o zAwUhQUQ^CH*SM;Ex-NcS)H3_ca$VJUdrfu$6H>LP!^b1My zKZA+z4LttuDo+-9%n?ozZSUl;_=}Z z3vV9FduGY~`lP@>w2hyRPt_G^2e70iF)`YZ@8QYzyYAL)N7e($0Timxk*M-NsQ9Dc zVgDRAxh)puLo#RzUqCdl)?HJ$otpWt7uGF_YYB(wFp|gLRD7x!2g7D|$+m(l55$H9 z&09t2=Uw4M#oGhfSp6*@DQwO6hJ{IttL!Iw`5y@27gr}A-+rULCBR#W8VL4>6Bfrv z`QGuxRM0>E;|2ay()ZcQyw!fFEB!9Q=c1^<&e#K$uL_0N`|W8mI3BcfmA_z{hJf(s zs82Uz6hovOpA9C7!|`j%LQWRRde5;R+?9K|uQM{Q$KMu(cC+oe6|P`92kR$3)7~~I zN9b9{D>kG;{pT-7)OkURk#s8r`VI_?GXZLLyQR?@G^bDyK`DdGs|X?HUg5idt4)5a zQ8#a-n?+#0^1PTlrAuKFnwsv8692+}KqK=BwfgfNR>zXct-y86#}}rbUrrXhQX>lA z#{zAa+$40o)&x$pmN6cLIA!!n_i%@bF=jeBzq-O}+OK*N!6>55mh~~W-d7h$%qvL? zi;xz1pEGFL)4}-v!%>!qnx(#I!_H~6$*%|5p*Q%vX!$;v|40Dkp_K^}ocD@3Cb19t zqzTs7u`)d(INVvL*dUD-+YFP`(EMJ7Dp>Fl`HR3HC2rwepD_F_A81dylqEUjxfQg<+vznl5| zXR8By9d8k631+wu>WPwX)UbZ(VKvp1@%)+2=u$lgSDgf-JI7$!MmU_cv~-6~|H6^N zdg-3efdQd;fV~KX@1;VT3tY2l##It0iE6|*_MbKmdrM`{v}*dy`Lyyu zFMhMHJb~9qBkvi3A^@8kl)TY*?=nmn?J~;sTISE9XTv+lji|Q~KZmWUSmo~*rurok z9sF|7lOo*w2Ltn?U!NFgs+~ZbJFy z1?3`y^%p}6tM?GKBQ1tX9VDY8`)T44ILK8V%~xzDo?CLRj1zhJ(VI`9?g3jl)|x3T zTkHUgd_NC6f#;khz5Igei$vQMjYm;R%gdPM#O@=yWiM*rF0J1Q79c${d^dbmAa2Z3 zm3ZKK;O7T*<@>HvbnAfde>j_*Mj!95QqdTXK?aA&p2;?Y1Js{-iQHkD+>xHdLIb0XxUCjBFb8W2Xcqz!dFWpy#1Kvr<;EAe`> zWa#`Yd54}9=5zlL7>j^D%?G?=`OMX+*Jf8l8b!X7))1eTlQ0?Usc7-CpvAAQP(bRoJHpWi8& z(p8k-qMfFZ$5Pzr>x+jK-=m7*`%!%oZDzO)NMUlG<1rGM9-1rcMuI0ba@vh(k>UBw zir2TZl2qL;{@CK*Rw+l~x*iHK?R4SjV?KPPzOi~3vE9+ueXd1bHn45I->BncSqYqi z1v(~?N7XF`*`RBa?LKD(yxx$UP7WSLl}~X@6_`?Du{jrBtY^)BXMP^}0XhR#0aF%*cqp6A(&gQIaXfwO)X}4SE`n(2Oi)m+}P>jGble@fQ+c2&yXyZ69+q@x6VAt9&qCfzW?`yEMsFifnw`?SxA z;dtD?LDB|Fq~UqC8N#N0#zI-CrnW-@#|e!j!rzY98Bs4Y+{jd=88}{j_T~R6X*?KB zU7ZxS-1rQ`;mi#$FG_PtAfcc=**!2b73@ZiOBS7f)r`7b%>oHoy-0$QN#Gv z;2S_Iwc&{^f$GHcRJ`pTLe&<|gLo3H^2Og+NL9Vf=+xn&WSsi&Hz7sV3FV_VOLW@f0|DW}_TN5GkV|R%#dD?Fx`l!;ms_(wq7o3yt z{_Zt7V4k+j_GxRLQy2HU2Wz%+fx`fWlH_0z3wNsD3odXyuIl^C$93r47ShQ?xrw%! zlQJ`do$<+(A(X#qC-bGDP~_FmY{Uc`&-{`%4)2OnK}ffb|68o1GD5UN5OOx1J+N)? ze33&{>P3*Lr(GB3ss5U~`;dFnNB8R)*~X7dIl!3zZvqGSj$GQhz)}h2d(8p&)7P9K zD($(19U^}+eeNSC3wd{n&qh&v;LS?Z{t|NYDm}xy6IrHSFwuYsCY3MGR!D1m>_uoe z^sAxl95-P$+!wmAUcrX#XlUC_;lF^(BJ-nWyV{XlD9W+0|BtJ8jIJc?*0noH$5zL- z*;%n|Cmq}7if!9AI_}ucij$7*bZq0xyT7x~-sAkOA2q7RD9mR*_q;BiN}C_KSARZK z>@;qB=ke@+u3fZR$hCx}E-UWuVBtUSI2xzQt)As1eS&Cv=I)8K%Q~_A*%7EG{9W99 z=a$g9i^8i`;*P{Sy~Io_$uVLW4-A~7xk;E&R1dKE^UX5(NqU){fg*kFO0V1JWcXGZ zV7hyUrO-%xgQ@R}f>Cb18|;4!BqeY>l0utGS!jO6`^~HPzKO*qpVtl4d3R)hrcP$`!`4?jK|k6-b0NGpLxS`E?_Gk)S?11IGu7GAev>^6!l~ zZCoP6fSeL4=K(aVO!Tzvo4Ifd@cE}Po7mxu$KmZNMaBcL>(?(kVn z9TcFNy@M_dx3%9?NF^K)8uccG+U52h%_E_m?>8xBBl&iNKb-^$=R9P3(fo=J(`Tk4 z3YiNwM0Qf;Pu2wciBL8Zi8$34X7KI}3)g8-Vl!0e{Zv**SgV!Gx$iiejC zuNOy2ljywb;e<}tCr7qP z?RI`1RpUoijPmBwEFBiKx({Md>gv!sIWhxB&OHH3wAs!O+?V~kPj;>WtP&Uu`8zS; zEgg89u4>d~{{q}=(CvhKfZH25yD8n5e+Xqz#krM$Hw4j-oLdJs<>k8_4bNi!hbV#F zMQS*J#uSBH%E!Z25^h>^VOsXsxCge9yIJb)9L1EWHOEa%+G&b7k%_MLGmi)3WLb$b zp-OuA^v}LS(ZZF|H#EA2|vs0lHBKMZWt%KgCJ}9FMBLlF94U*p~Q#}*MQ+viE!fs z@o)9eFMXee(!F+hy|a2DxLkoKDje$U@VL;V`-9?wK&wzJN>oa?`?(0+)$4U=ug_} z?HHA?yRN_ve`lHheWqp8;tPR^9%0y%HoC1*qKW!oQ1fz3JsCAhIS1puMUmh7}G68 zTJ}@4sTcZ#mS-Ma#TyjO$}RD5vZ$AEY5q5g4kMQVYka_s(R~rVUCM@BLfZ|=*P3g# zxhUA~722>Hwu_6Pn!b(gU)?Ga-#ZMC8PYA~luBzT!7j2N6<5j9Keud%%;pXMw|{jz z9P}o5j4_5bjeoK75TJ?(G&iI@8k4!t-4&WgL2ks1#SOKPx|mY);;M=!e#19On*`3D zmdlK$#2Y6DBtEVuzKyyE#M!IJSfuKoN!|R{S0YOdv56+D5v~xLH$q4TlOHSmA(Nd~ z&i8MT+L3v-xjn6*BD9isK@2S%nG1ut_Qb9Nyoc~ztf`S+)zYmirD*6ElC=z2!Ou;8 zXgxNN>&0fykG27r%e#&o@SDpuI(D1X}W^nT4Y;%T>bm1n|H*^#?05PNIwu!;8tjU^IO05UxIvFkW-yR@aK0Vaw-4mftHZ zPc4CahNlS2d1GWwKpq2uE4aopIP+4O(b2TxYKX-$w&dv+UMydie<$9~A*_#>MEMb< zp2Kg7#b@W^?h_k!I3rg07sx9cR|!zBRBL0u?FdIWG4t7e%&6yVJ-0#=lXxn9NbPi8)#I= z{N+`LbUCV<$kG*QYl|s-cJJ}(dcOFo^x7cbiS%r{-*x$zdO8k^WDgDk-RQC?W|7O>_4Y^%wlHw(UkG7y}$@?M^U3@Wyk4*>6G zM4lf=6Z=$+M_^i=lMlg9jn2_K&qarHb9+>#vGioR<9?EEj0r10G12pr|Fp)U4)+tP zI%v7^{~=892(ze=oWoOiTfB*+sZjNK7eiY&j3$kF!4dq86fd383_rI+=J4l#^`NI! z!K=_-rkf0wZ2q6jG5=3kAobSKN#5HjvXQMC_a||E7u#HQdiToPykET#&ig>}TpUet z&kNJ1;jP2_+SPXHxKn`qRww_6lTPhKy=vN@o1Y!Ky zvV|U0pZ~gwCkUzDL#v=B+f}>91_7XyHvc}Iwj>xX6Mx~-VgGsv{_vc={ncOL9+x@3 z?=%y#Z>rcmS0irE`Q&^6q7%XV*|YLP1~?L$)8zVG!{y~BN+X4yd zRFJbp@W2mVuG1;Xs-2Heg(jbOt)B)eavvL<$(NquiK)ieBdmNGx0Yl*AmghXCse=d zW1UPw^h8FmvB$ck?{{8FwAb4-H@Ma8zw5*`Io>wTpnH`PBZWx`cRBaQ*SI)$z~G{I zC)i2Yj5beMW*`_-giL8^Y(B4^%)0{6K6YrqC?mrJo#45zY3=u+a(VX!2ogyK2i!~X zGx296v3;Z3U@V!UaY8~r=h+~s&}PM-1SlU&^?i8_ ztlk?Zb%6UJHxJvpvD%Q+oGwQ@{rEap4&bIKav-Ie2JER!0kDElTYjMIK)YE6$UYmE zexe^$YCRzP1He`_VL6nkMu`HIyX@qioPmgKu1$Ww@xhhK->|KQ9@_>1U%qCTXVUbc0^s` znp1P00kOCa3>7|62+WRP_Vy2ItROB zkd~vpY;`;EluovfSUVLeHRq$Iz_3$fiv|*=Uj8X}Kv;iC;+{VvTE4uUx@&%d-sewj zIn8%sbVubl8ks-^;>KPvR=ooY+7Zx*ex>nJGZj|Sqlmd+K-&E>ucuG0Kj#MZ(pnYp zp-?dV5Nr^q!y#O%0SQ-J9l08t21`5z3>+Q_3j9HtcF!C7bI3h z+NXxWxZkDGmgN=ko^tLk$A9UrmzJ4^7?XsKI<}Efy2^_{!ce7k1HA;wy*linX zLT&jX5S}9%Qr=ckMxvUexfb)H>(Sqhif;bWkL6T`P}=aj?npHIwjNByVUQJ%P9tumX`+ zFb2^@%dqj?O19*E;#>hYaJiTIgh^QDmfzwu>+RF$TW$B~~ruqyl8Miz?&% zEgdRLF@CtUPu0_B0rG^dl)E>5p)x4G)VE$<$u52@Ub{-iGl2Yk|I)P>GuFGE8F z4kI1jo0Ch{z}o16`F#6dbV0lBRTf)5AUL${u1$g1BC14gKO2C{Ax zpS2)?0#+^q-WNY@Pk$1*bRCKy1HL@hiMc)sabC?5pN*eM99GteYkm1PB^#&90Hb6U z@mHkt;aT|tdN4-`@$oy9NLvY;l)RKziqntjultO3+A6sR@B7+p5TWhbDBqX)C>k8s zxlKKS>WMt&$)zUXi52SLq8F$A4X(aP#KH-d`RN0va+MSd@y2IA&(3;bx^)w-w?H?0 zmKGJ=)BKx*OaMqG;)t%g+&*dgn6jv`fu@q`LA0%F7WS}>(_(!42jk@J-OQ^Jtpzw^ zUhTB*z%-03zT9J#dB_Kvn1Zmq@iobyj?l1WD}N411RK!3BK(1vq({fGmL_pM+dRF+ z_1&o*mKueCc>dUMEgzc<{B2q@B2tPQmb6CEv(gD z7?UMt`Fw`Wtq9I9g;FYIw*EJ4O4L2IoKgt2U54pmt}o{~XefFi&l2yDY*GZ`tRi3J zFENKhG1g@V%!J3k<+yYA*>Y@DA(H}0t>&EC75Pn)U-wP?&HD_;8q>|u&(z%WdOnP; zs2f~$u5w&FmyMHJe#Mu1U9KOiYlHf__Ij_f#`u@?onBfkNJr3zrKb}2Dgor^2~bV1 z1JE=YClyc4OX~dCGE=pYA73YaCsy3$@78#Pi;K!*-o*U5KMr|Emnm`~9ETM4s(z4UYEzgem@O z9Bzlg!Sg<@_4-ZUCw})?`QIDS=gOAd$6cD=YuNM*5g4=rP06R9-}|()@yly?KIUAD z{=0{rSkFgCJAsd$NcB*Q-ZfIE#z?)c4dZ~YJNP|fnBgzr;Bd~6fRNC4b5tycj8c{m z*IujIuhjF^Ys$Bn_y=nh*(BSMLR+Z6=X?`wu*|Kp=p%cfLM^9UFzq4OxVy1Hukxf3 zTlNIH4m{Jg&!frW;W_P|}Y*&NqVVX-eAf%@HZb=KF1A8Uk8875H_ zJOxXO^siIO+o6kMV-g1lDu4hWk3~UKt*i5hA<=prF$X%#a{k@v3#Oi+6Gxf+KmoJq zE!(~dtwul>%!OlNT<-@l#D)R18tM?t7$^me?9oEaPhn^fB^3~J7{_*lgFU!ZyfiV zj1h={<8)THE;N1GCR4?(qG*>&{+_tMn!iATkTwrrFCeyoijFSZdZv@-ne<CxZ`zOwH>$3D9St?L5T(8YsOQo-wnKO znN@dxslSeLRkO~bR1g{o0TM#1iva>Ds()^s9xwCr%7dZ3;}20aM;2>#SK}HHY7wvw ze4bdg5@Q{?^#<1Xe?0E>m3l6Z`SH%dON({BR*^0EZU-){$R|I1>wZas>~gB~|ESXc zTp)XzhINqr(x-RylnT80gKLXstS*t$zsmCc#FlmK@`t^JQ6JWsg<7|=w$5C;Bt^Ye z|G(guyt?majb7Ed4_gX-lOQzv*bV1Kq)G2{7Ek3Wr2!Yb4&6za6~emOxa51@%}0O) z{#$nwO4lYIm&15RS(vlWXSrpM@sCULPA{+4rC`KIz9Ef%YAmsY(X8_AaIOl+OSQ_Y z9b>DPu8l9QU|1E!Kjty)uVCM>!1^ygVld|-C&AB*^2;m=3T%V3sU0hp5+QCv>_foy z4GA;GLo-%wQ81=h89rQ^$5DF<^j1a@%qWlMT3bTWTO}uTZ8u(3@P&|5%570TQHjY- zict5{Pple=D}mpr#~ejJo0G~L2px5@)5no{>o!f%7U-E!(k>_>kTW*vM}0}e;YVCFbMG(D38J|gqjsHrh`j+@JYUhMUh&8w$N^|>_LV+#Ka&qx!O4H5TwNKw@V#A6?O5X<_ z!%1%lQle(P<%Q~(e2u1|9G*sDXjcbKU}a#A9cuRO!%ky_FbU>TcNY{KFZJs#>_%a z0M-sjEh|LAUef(dU`N(wPPI?CXd(HC8gcgGj-DXF+GrLe6(B6y{Vpi@Cq$_MO(Pd4 z=}-R8TzMg=;*!Le1Xz=z2{aOS?`kQ5r} zo%w`zIa`AIrb?$NfL3u>0jd%7^^eJ7lti zxCVUV(AK62%@-q7%{q`5VVY{+)(WvxNA4YRqYL&$O7sO@oJSBVeHD*i4(x7E4kix| z#x@Nalqp@gzOV%Sg-%Hw+j zjr?Jwu|rk9CdVA$nlGN|m|W4hTMim7KHqMfZif~Y4$-*&at>9ed^`<%SNs#lKh3(( zPQg+WExV`;zKE{>Fac+qi(A|Ofn#$-$Qk}l7Fux0Ducg%&A8_#4efRaj#$N>sl0|- zz!llcZNB*4zZ}Q+bk-nPqw+eotdTOzA)^C^m|1J*;HeahcKkSPS29!75o$fAMi_TR?kwe&yBni znsse6oO;Xu`ibbgn%FDEk}@6?g1;cfxpvPn!@jD$(C?>YjTz4Wne*(uCGvj77}*58 z72~=PMcUFo!G{yq^8UiFsnhKDI^j|G_yk;xtP zC@JE<&nD;noy6_wuf4(LC5N3mWhYQc&mpHtY9z$cU*3@;1k0ePUfIT@&n();*4)N9 zPoS$nD8F#ekXKtXXLcsX{gvGxl~=0o79s-KnJi&qlr0*a(@y@vQr4y91}U{(~R>uDf=ou z22oAqY2iv+&91rZ>CnJZ+6e`@2rivLv1(@opz&Hp_t|9=3+c@5t?ufI5Mer;_} zjXiHdHqEPdu63a8Pdoho1KTdu zzg{>n;hBWiRqP8>jC5eb?+le8aSKQ=^9A&JW^!)=W#v5p>1A8VPrS z-o)S=QplUEAWRTyvCW;8M9lyb;OP{Zo534M{BKmh&}q~S;IzNPK90vRxT%?oZ*jW^ zo{dQ}i=qx~10{Cbukx(Oco3(!+b7TvL$}TMD_U^8^qN)+?6Cf?X76_*?B!Y)5d##s zTvOwG)aY96jtN;WaDO9CaQn?`Inyp#FLJg7SM)5-&8H(F@G+pnh+8~F<6rBPnJ$8n zfrzyA$hoXtAO8`E&?At0CB&e+u~YIV%|Sd`|N6CrQ4u>Dsp^9>XNV_9jd9h3 z!LxGujX6sBKRla$vx>E!Q#LbYI(G=h+_NcmFNHo#Dq;NF8g)b&^G}ihs(#w-288b| zIwvTtK9KL>J`wMeC{8ClvyZl?x$KC{EPiIWJa(%~`DBYWncc2z-w*R6V(*X!eptk1 zzw%DJO?dM~-l%-@1?|U%8zvM%AOzDd|dRrpIAIxxb^(z0tp@K zrSOs7Qnd3Cr7RCOY3PbTIBb$gjAS%4beXM_m_?TCiKuyhSP+bpt3UoX2;BPz8qlg2 z2xnJHI{~N_*^|7&Ueyd;v>=g>p$c1$W!mLAx*?c$=Md~|ipc>6EbQF3gTWmXb-JUa zxMS&k5Iau|cu`(%mUY6TrL=a>mkTO2gN`~GQ2a^1NB%%=bBuFHwwQ8TU#=u=0eCz1 zF5#K{x$W-ro_mbRL|){Hx|LA5;36F}d`mIU3*LPU8G333Zmkx4zuN9IM3VEeHrtvh zL-Qm|sRO!rp*;T$+O3u-KRb#k*sc0*q~|jND)4>YSMORcl<@sSmItGNx}@(gCXxJY zADZxh)y#<=4At9#KB{xu^(v{E6(~y2DwQl2FJCWU-#9u$N=EUL&=FpIy~?;h@#V3r zegsWr9_U+Wrg?t>lTVdLm3%iVEplQ>H}O(N9qZYRHyH3t^JI`7WCA=5a~uc`@o}|J zb|B#jAL$Ja3O1f1pf(p}Gk&t3dMMM1A53`a$d>X}Jxdl@B}UQ0XFnV@IH< zi#F?Iy3;2!PGz4DhaYM@en|K3H{?eO4rj9JD?{qG0w>vV?+JFGD_}?%uK=9tm)a-> zV<#G#C2!39U#RIxFPkFRB{#%$=;vahkm$EH0Vy_X7h3!6JdCNt)Kj5m_|x*ztMPeD ztiRci627;Zgqg7sd=_dMERn4>AvdQt9447kK;uzrZb~wmT{Af~+!=O#IF*j2$T*sO zcxM8#25jD3MWX0aMN~XbCy&%WOQdJG>Bb3QCG0_7>4{Z3DCO(hQjh_oiy!_h=cyk; zB^_&ccAFtm9uv#qPMciT-es{rqv=XeMmRy(yVxdrUWnoy$;Z|NrNdt$RP~x!VAXzC zi&T+lx$-4sOYP=HUP17MrdWCdn{%=hD2?~mSpreUWhb`Xl<^=De@=gjCv!1dzp&(A zh@@laIwRq2$&zsXe$VgUm{^_?F89HTr3d1Jjld#Wgm1KLF*c_4Cn3PwCqBlZ#nIa{8?8P7E!tzS}69fnLA!!!-!E5cK2D*1`uhssC@)E zqA|MvE>byE5_XJLKVUydxnpmZsf2M2ZmKx42><2b-vK50Zpydhfs9qdij;!(lFFU> z(+opwT1n7VfP(0q;)IKNso-^%X$r@=Ks|Cg?1i+*ff#GA4=uOMgdw!=21W%g+|~X_ zo4V5ro(AsE`+g|!VD~M`4UF}sq=qF-CEz?Xu4mmL>*VxOapv^`mx3>4%dRm0>($}E zv)U!MP)?|Fq8s%OAs|j(fr%Oo2==J^y*71UoIL8dF9BoLO40c}F1ZqcuGbUQcw?T# z?`AlU^-<(o+9)TWplE+d`uNZbkbGiqcQEn}0ZRNBbd;mG)8+>899JM^zZ67MvCaLA z8{mSJLxPwHEO3L^+G87M?XWk8tMvM3t37gr3eC_(I9XL(WY`Zmp~kK$V&|J zG5rI!7GSD-3pS45=}a#E-a$owo<`27JpJ4K;dimK(5eS&J%=D2Y6^vE--z|wOqHK0 z)WB|VOS7pYf^TG7g)Jq)tM3~4`7A#_5Myybq|5n9$Y@hX*>vvVYK`Nh2+>vLl>+XV zf67$V3Xx#WDRys!%I?zcwg5puyumd4>fur4CE!dTCQ=CS-LH5&eMhgTf%TFGe&@mC zs-WSwlFR9p2+ISPc{E=vPjT-DDs%E-@)0EH9qWpN#yv6G`?=h|doRd8z&V)x#t*xaNo^lN&OWaW^9Z$4 z{U)@|r9=A4DI9(|-BL}kKEqCA;z$H_O%cTUL&hCKFpcn8?B5Q@-T(;`cskfyH`APD zok=2dE(pTv-LImuAfG0dwJ^W2$Hnl1)p%< z!@>K|A?ClpLBiQbkawY_fxzL$jhOV`BKSjBU+mq;`t#>o8H`rfjvj06+O{l5qGO45 zCC|x7#QcdvluwxSNdBu}F)3f27hBp%i{$jm4tGPFp0S_GI5u**Z&8bi2 z$mY(iGg{c9t$LWg&);$O`Q6Nx7I9Z8n=QRuvex~6)o~CXw{<6Bf862yS@-2IAEiIo zONYNKn$E%zpw8M{0U> zE&pjG|6iyDZGeInIBl-}dy-${HPjuEk?;NKCw|Fo-YbKnfGA}i=|!B9Q)BiD9FRzqN?HLU%W^)GR~O>e^C-;Nn<&bUfA{=X4?7u6a=hd>zgB6Pk30Is;fnWho;EK(H+a@PTFoV@obkD> z9yV5|n3f8WFm5SPyBvOc7Fyr6f%P0Y=GcupNZiW~9$@QXL^mJ+NG3X~P2`^~F<7rN zo|vj?j;n|sX$lH}?7pzkgI_d=BAw9YRkfSkaeYuENs#jZ92TjLQ~Gi^s8zb&WX#oHZHp)%2vt74rLN3_scM-T?a`4D z4Tz+xCXN(CDL#!Jf7fUZ!O}MCOIVA9L{2U93($yAOBa=88-0#Qf*{!G6Zvc<10>qE zrJUV~uqm{q+W&YBVsJ#r0(QJGpnTD!~O;HT-YZqOmQ zvv}VQ2>p(*p~O+ZLLTtbTe-aXoiTBD@AXM`f>fhe&wpY!0azLB{GNLUm=h}S_VD#u zmvwC}YAyg8qwHbO2Ik`hxyej+fWPNhoJio9Cg&ucwnFLWmF+P(~FFON(syIepA=%F^Z1sY3ww>n~H4L_kvA4&ynG?wSQ$ObS z2J`uYJMenxK&SkPo+=3GyTLs*E@m;WC{3HDeYrGY|Ls^GC-R5~kH6tUQi(o!B6I^U z#xH0PXL$e*^in>+*X7(t4TojXEF> zoL$0e%nze7OmtL#^-Dvt`NES&z+qD)+d2CY*9r0Zap%n8_qpYFPwlnj_nDWij{kF9 z>u!qmkFQ3M@Jxb>1^>mR)tja2__zyic1nZHz#v!Wf*lmqk8_7zt;zqcpWmv<1)(n$ z8;+06kIpLTmo)XASHK(%a4e=uTn<}~^kMOwYon=*hf8?&uY&fnFLDRws5+su9f&{o zld+(40o63Xtj4f2zU3@!8y|ulAJR+O?jm!-=ibvIChX2eW^)VyXm>{mFapT$$d8`O zTS1_DbaiLh6x`HX&=vb3Q-*P$b^Uq|D?{BTz{jWJ5qp{P_sf+A0cS1}`R(SxWC=30 zpwy(hraiT{0|EG=S0u$sBAVtQrav6rPDI|A8)NjyBjEPL%YM@*1@XeO>}v=4YToQx zUfLn#l+!F4A(9tS*-KLfSOD_I8Hnz{+Bqk5^87VprFbwh~G|e*#ERE;bHGKR{WaN+& z%MqxR-+t7Z^9jpFV;R>(l`H4WG2YBC64Q~_@*oh>6aA{R&XH)+cB9Mw=#gnC)9P$$ zTIWx4>Y0{fSuz=w@u-Aph}>_RL7utgR(}&eiQZkhwl*yUZLhm%AK?deF1Uk}SbD_rs3#7oAgAxG#?# zsKUgk&d2orm+oUE4Wz+IMG9K~v3+QXJ$SK%kNnEea8C1fyZ#1Yxzl87*009qUQgjg zgaQInW=!|DCsJ$ug{AgQ!F6h93WyZScPfgsy3yb!hAO=@-co-%qRY(CuL1GHwPu@5 z9ey_W;9*0CCTFarIPu(@1NfsueMxjIYkaE1uw1m`MM46~Yg z5QD@z$dncCi|5UhWAnOjjZLVvt2&s>SND&JdH@SIM0>COv~eyq_umqC%`Ln=uUh?T z)=by)+cTCc`U@MzoT_Z&*JKjl2ewPveFG{e{~~GIn1v72#i6Kypy=&PRPgAdag;f zr4vsQz7+(nAGG*rN|cRoN3P#Y?X)U*bxEMU=C-{<07IYqPX3yNFKG&SV=w~JoX);9 z>bm8~kV)ggR4Q;S6XrJl4Jg<$pl6ejluELv9}ZHk{?2rPk1@=d znC0WqGP#Ou%Lt8@wO9{%a*$xV!tGG4mN6ehPOj9QlbeXeyPD7I-Y)cxUGt_vzF){GVV1bh#OC2!+%>;q=eI$sf7@v| z;MV#k8D|pMGxN|FK;$Jq&?EJ4dRGGvc{3N#_!_#MgSzjwN_U8wr2APDYhTU>>QuVM z{m>$+{r!Gg&?In6c)1t;)2LD)C2Zp|ioT(Mq5hd^ZTD}|_pwHi#8FZ-f76o}2#Fn* zPzhhbs%N!sNPU{;lGt%gftR1V%#Kz$E)A&5E*^j?nb`dw)p@mDc(c<=!nN*72P-ybeKvkgY9`Xf%|m!dT8^@}4k>_j|Bu6;(7$z@W)?|7ON+MDO$kpespu{#aV4xsK7rZw^k z{Xe+ij`a=nyaS%kJdkGE1i?1k)wE3ag9_XZ3Yg}ePps_({hqDv?=|$lw)Gi~dj>w< ztMJjBpCg-n#(0s-WR~q$_2ey(Q@1{38s?z3wLkWY?E0fVivwPgms*pJDq)Mli)@YB zbNhqtqHdrdy!JbwO)VY`HOj8%m#!Fh`B8Vg!;lzXwO^Hn^ust=dI2jtzY*M zLb_BjoSV*IzYH4V6nBA)JlJV!MdL;ilQFOruN>6^9AibH4lR3{6<)_Rdc1f;<`oAH zO9z@>J>WD(7#>vc(@kO}+qCaHj@pG_r|p+A3f`%~1gU#IN;c`lgw}ev`7N_YdWqUt z-z@~qtk574v^^>%5Y7pOl71rF1Fqr{vCZ?R9rjWtkbbuwxbO7#2ZTVtL;pZ}^XBZe z-npU2*W|2oF!-P2^!QH?_zsQlD@>mf$ea7_jCYAuDWya$uk7lcU4GU9nyL zaj(Zh`Z|9%SNuW1tj@ea*#rMH*JP%@9$tDTZLH-A{a95DR-*jR5mgWJ;A5JxUZaC!c%irAfUUC-*i z^h*hO&v#qZ(ZUJMSB*~zQ60=<%w2D_Wzmy6_=*SVSxMPM1)qAH{TdzGBH@ z*bd>*F~z%xgnq!pvIEjhvB7GD#I1-du;qz-aPHI3f}tDO^dS)dLxccj#Pw1rgoeE} z1n)IHN2cbYRew<{-RCwrXEzsuVdx8B1x5ek`?Yake^Mq&kKsL03wwrR;d(q+t8qxw z=3}~zazpkFN-lrz06K@uJ_m4I<~cdaOWkinFdlEhv7?W|7^w{b%^}^7Pc3cVI#b0V zF{~^kkGD=K+7q}v3CxMya;+Q@ni63(SO3?y^>@tBR=$@5IA)#fM@&v1_?9@eWy-ZBh7ALVutiDH!-I)wTOAoe6n zj7natSTRSRZqk(c7AIEWsWfGcK8Gu`46Nk&Xo4SDsooRrz>B{awA=`pF6vCBaZwja zDry*R{3LL-fT@ElQt267Qn@;(|^{0(M&(1xN z8_L}t_s>O6`aLglwol#|&KS&CZEY4}&1YVZSBtXyT<^Q#WO6=C$}+v`JS1|DWrL4U zrIqDY=)0Ake4{RTE4y0%{T9Ye1hhQ1?72RY9cdf`58Upyq1hxyAOFls7)KMKdW=Z7 zk_}I zE~9<(S_?EF!I2k~X$mlfIM#WOTZ&qQv{N;`KPx0rOktA2IuZFI(M1YIwclC?;~poj zHzW%?I|Qr$MOjE&Q50u4I#HpwK@&H<+ENllXr|MI8%qvnnVg?~eyO*iyuVSDoeXc7~uY``8hxh!|s)F*VMwC0+SQP@OMl!tCK-Ol$IoUW>`RUBwh-wsl&cW`5y9q@T`jcChH%6! z20@7j+88giaE`1*9&ba}U=&nO3tP2Qugt`&0dJZWk0i;UCt@Uj7plw*Q2uTeHGJ7V zA#Jt|lrrO)X*k~)gGm3NJWljWvOOt1z?RPxCDJ3u;~R~BN0TN`9lsXVUd`!oCaePn z-pv|Xs*aXlqQGljY)|BuorOC6HqrFy>N^ba4(jK~ziERj{z-|EhtIU1=Amt0GT|nU zd%DHF{JTcU%}Ev|Y==ehJo`^c+K;1XF-4F^w7}iJ3<+oYIRX`jshC9-_VPi7^TMd# z+Bz0RoJ3e5EJrkxc?HvNDiVgg4&+wRmg7hm!%B=a(Gn6E2X`kG4;>^n5Zw&Ml`V$W z7tD{1^~Uh_7sYv8T@%QwJ;99q#}H@G$>YkrE}JuJ9vOhIxQ;JBZ@y))P6g1I2j>08 z@oJvyAYPP)6n(L(A@;Wpil%RMD^=AtRXvB^rsZug-vRH7ZMctvaN+}}JpGWqF>6_b z?pq5XecOlsHCwK#iC6HyoP7y%CU}E`#+HN}_dJbo8^J++r#_A~_y^te=E^=oZX1FI_JCgN^;i zUch167o!pUbwb{IgRFf1>g;|YACyb2?Jl@*-?A$PgAVu@36JS;I%(*7Ey{Yv`P4%H z8Z=M3LYYQ8+tq4l1Or}-bg0f<6&S-_6S+ZO*$`)Yw4P9IOmem3?tUF(JLV@#Kuh)7 zC>b)Z&~c=@(1QG3gdlx;a{9r# z=5~x~39h+w2{et^4EMO`OW+?k(Jz6?ZU3|wMY6%LhxaQ?D&UV@b&zJVAQUb7X!m(P zE$B7kk}?=8=Kv0Z#(p)1^E@ekTwIW&N*mZ}Dz|K}@ybPXI{2YDBoz= z_fk&?Q(p=i4Pf6kBte|kWqj2eImoXFt^EKHtv$y_KKvnP>OL->IAaP%HvU0d_nh|R z3m$Hs?D%7WMy{xiN*Z5SCeCtn!v5-Hq@=NdgY45vCpe9~>dSzaS0SV4?vWpgKz2XGiP|{fQ72CyKnJLQ>-O)6PKyo1dp!t#LH1pvb@F z@C^a(m}yEque(+7`tA87O5lzCOUB{LKWt)gdEeu`SEzWAnYVXAH@ugo-xV>}_Eplq ze^|fOYSeaDI=+O8e0@$rCAbsZ-Q68Ru;3CTxVyVsaCfJ1 zw?Kl^jWrI9yA0=icb=I$f9ro$t-bcz?<&+6cqJXQz?31hN9dYjixg^Q#-4L&nbyY_ zX-naZuZ1ztA_H^1${d%VO^db>lDClfcry9*G%kK&AVFklb!u+2nPDZ zR{GOTX=OR@Wlv&3TeV_+YwP}8q7Fn9z z9AKNSEI(*`E2R9YCU)O3Fi@G17Yy?*J~(ns1E1O*-w%aOy$n-oaw$zaxQc}6Ud1Fj z@&h)1@1_r0Kknb8zxgRo2+B&p7>)Q&7^a3M%*j1FL(zZpC-It^r}!_AM6(>6*p#RKtvtep0q(V??BkxLmN{(<^Jq5FmPV{*87bt$Afw`=Ofi?UC! zm?+BGZ^()Nsy%p2>*nmf?hv>Fm)(GkUdXJprE);Ig#bYtE)<$)p9=ZHkzTpNoP^4= z_JRqpapIzuL46 z+FTr7wV9!+YyZ@Pl9>!i;<=BPEA1UkCkTI!fzh%i;WDr!MZb_}9U>BvV%6K%;u}x3RxN789UUPUa z;{zV{GhpnXz87>77PGP;nP@sv?Ir|QerCMXR`a$o!87Qrj8h%)yq=|={#f)*(B;(1 z!Hb!-aI8|qZWxT-m=EE}?zxB8-~|iT&-%h)5FNZh#`5moRQ{%Oei?BzXg%1b;;7lZ zU3N3N6E>njr&#E}d13Grhju*OVLHo3wQ?-v--S!(;`uY&VY{^M9T`IsG^G54x82^o zo59W1!Z>DZW`2pkGg5Z}tFC$m;p@8@PT}zaMnPTs(AOvqoiQJgL7o?(_j{!`3;2); zx=O_!nP)zgxXSDtpapA#% zn@{&od(vwV^8%tzzMhI>!0@P!8J>LrvUo0YwAZ7D7d7{@cb<)5oQr34OfQMuFW)I69KpkOBkW0N$S(L z7htR4TIAkurAs^3YEu4#%HG4lp>DqymQ_!dA|(=+?#qY3gN78yrzO0)X4>gX85e?u5?Mjcwm~T zyDx3t&T4>YfaQsmnSys=aFQG2Y;8s05p}G~<}730E4DK|OT`P_+Of3^znsA%y!6gb z#3~xIqb*Uewh>KNA5Hs$X? zjTR|>M=!}1ON}6hW*J-3l3)XzT@rE|jD_sJe+!xO0nW19b}d|E#Y7=$d{GOy?EUg> z51Q94i>d3*2R};-L^dTgp4%2sAJ06dlV*lgXPn z(EYPmKm?w9|KRckWbHatB64*|Q94UW;_1{`!`n1?+L#v&Q#R?B)cl_8GaSXkBPzlHaRWeBTOlLE9|9Viw0kjf^X%mE`ao~5=b z3BKR!&`}8L)D}DT6!X<7S-Ae4gHy`hlrpcty1p;!4?8hQ+T{E-LBEng+yRVArLiwk zl^FU`s}qK5A8ir1rN;-r(6`*2zQ#0{w3?DrxmN+xbEpDsv~>#ashh%949f}^BRC?h zTgMzN+69zUw<}#88=+}Xupp;~{IKn-TO}Jri(bdY;u5z#GaPMRm{cWoSBD@mLaMQHmAVu(urp6pshuvEjXSvLKCiI@N6%m>hIBmboaXTJCKMI zJd!spGwoANbh)xHAa~$5@p#rOq^WL!no)g@*aVJRo0m1X#$=t-O%8n3uZok*-l`q# zYUXe}^wb!GPN3gwj6TRdXRD%3-Iy#>4B}PA#ijRlBayFC0L@3-nQ5-zE~!BED_drl zAE7jqzX&LG^mZrj7C0-E++geme7adR5hM+AA=0O1K;qN>ZDjQ-X%g?=rvJPKzZbQO znrQx=I4JNe7JHWh1I-9E>_Qaj=ghT4F^}^&O15Qt0fQ5@n$LWwQiUA8w+}RXJ6o9{Jj?%msE))zj zcO#F=t`$y#@2Kx|b1qCavWc7^dhgBIM(emshG9+?h9=Tvdd?yj4v&RbZJG2<5GyQO zNN_wtk)QCs8rb% zp-J5M-`vLKq}$(dfa6@tUR0j@!bRL){3!uqh-F_y8&;Q{4P&us?y|#SZ77VZ=hTwr4tZ@C2ok^c>@6*+kZZ(^_ z$b0n18EoJiR;l+PptA`*NOqP`d6(1iIcMNto;01wbo5emG`Oz5lC?~L7k92=v4`tu zUsdZLzyRM;h2MS<68D5w@8q(32uBI~bSSBGq<6g5?yx>o?`U%mR0x=P9!Z1$WmfLA zCp;AL>0F;TLk3ivEptLWfCM?@caA+Uf? zuPyxZNJqez`}=_V>VNOg0k69&PE6X4GVg31grs3N%kLn74CU*41wa2jI9IF2dpJ9K zN=R_KwbDju6}1qF3x5zAxai3}a3BQwTABA%_EHwu{--;X?LRtwlaJkiM(&4xQI3iE z*@~Y{H)Hr0c!4l`1f?f_7733hv@um5)pa@nVwubb{HhC{JMT4bGFF4m4lQB^J6jeJ zo?gt+;w(NE`5otOM9I@|T`5#eMYS3SJ?G*>?1!NuY=W0@_kNZ&#b}7pMi6PxhNx1&7X^UVaAIY z4%@P)cjHJxB|zUW1Iwf_=N4-{_J6LT6@=R~GAH7>%v#AQS+xoxCKs>WAbVn#go8ez zg&7&m5WV(j-W4Whk^r#3z~hUiNj|37asd&*w*4>?LNI&mP#fvIHKq2&H~0$-yxuu+ zz7yd_LRaP&gHp*!8?79$ssd&|79||ACv2Z6T+M&QT!zE8n@0*DZVnf^3{eyN3#q@P zqY|zE5>{E-rMig94TDHA}5g42OHv(AP?!b4lrW05c@#g78pX+{$5YXICCgJeXj zgVC615K2QZbH~n*b3&Vjt6olgsCKv(r>Ev|Wsdaz3gGo?9eGLE*Mdm%61sTsc#Y5puBdBm}|&q{{xR8N$BE&Yyk61iS})X)Y$&TH@? z*hK(NN>>&Mp{m|n>Q7CvCndStMU8_ki0=NWVaIHZm1DQfqARj!%h#%=B1q4jutGl% zSI*BBJz)a8)D3&$HP(ptjU9&tS*~T6BPGj>>thX@XSj)JsYR86zlGz<;)2 z|5<-s^g3^`0O;sv_~4lm%Gh?ze1@Ap0&Ef;Y$S7DIU-Cj=ej@?bnWH=I@uq`_Z%Bum+i5UBP zWhjL2pJtyEW-&+c(M8bL8AUQ#!SFg?!Zx%HdBY)a{t;lqB?uZ|Y$H{b1k(SQ0yi~@ zdTAoH4l+o0+O75SyCw@=-nVVq7n~<4?JJlsql5kG|E6V9Cf~)-MM`^IKD74k*4mwG ze3xu$2gvL|XR}=Up_w)bGKbUqK9@SVn%KHyGz7JMFL+^@`qMHd?jGhl8gkIB$2TWK zAu#D?9K^rf$M6!7*MXWgi7svaXWiqHiJO|Kqm4-siw!bK2cy$13}E!; zQdR5YNVj7u$TU%6#F=@-M`Z#EP(XqDV%>CvG^sMMF4>4dXmzakVPL?6%<;Z|qj8e_ zh;1gN#SXWXgBZusb&)bcm@i`c3`FR5Se>`t^z<-C4fx8a&kwT8tA-4u5?q@Sj1uDh zf!HLdJ5%F|XTg0~>ur%7ZH|xX{DA_#EZrTpfgu0zPTE3^XJO@yx&XUe^C8wXdTc)# zoY^9VE5sVG8U3J+3F>$NCXMktr4r8N_FQ_7E?4=PQH|R=(ZOr@gistf9e*K0U0jW1 zfmUSbaP=niZBpI)il5&51(ECmeAm9f+xmRb-q}T7@sP+Fgr^EGt$8>c1E=Gd;#e2vfH|#_Ya?WG0pBpC>qC{OY$|^&~e^c)AA_Pk{S}zn|mUW`nkh zGkbd}PGPB1bWOh1+*?s(8j&7euTk>&Z{im&tN;#|NSAuqEQrFMBAzI3rZT+vyXGeR4Qa@6$W2araVlb__Y9NhBo?lhCr@ zXBO5iZRBh>Bo+x34)N#M3vykdnI;bi&a8of@qQjqPHK3_XB4yItmBmmW*PL;0Pm7- zWD19wiqqWYj9uPtZVZJ}U#lA)XdIR-?&Xc!DR0DhLQl&V@opvQ8@A{UuL;tk3E%We zE~w?^N57U*EB!)JPYmUGhBnkh8K_*|cA{aB%&cb4?#-mX@7EC#8W08Be@gIvB8kwo zc_mX5N_cSgv|eVYP58dYZ7RC|J)Hn0)x0bp6EG9CMO> z7XZ0O?|>MKTE=Pg3{m&bN*=E8>VCKrd<`r6mDYI@c|<+o|lQbx{~S5G+)9 zoii-od?RppCb(`E+2cXnR$el>T<)G2XEwqe{e`b`r$f4uMWg}f4{;jukxGbI@~(<3 z9*=p_kv>YtVSHQXjn+IrF#F{7O;q92*M7|>O*e;M)FDNN{0zR{1w~#tzWADh^uf<{ zT$7n3RiQh1`5iI86lwBsod9qHySBRORp==^WlYerhBU| ziKrW|oLL^F&V$HciW?Mx><9<+8fnEy)}0a4FqJs;)sooeMSR>VH=sa&woDMPs zeLT(kFO>vloh8GfU%wwy~9SohJ6*b%Z8SIui?&smlg9k0`zE_cL!>qqR&e-pAvN+T(F4Eyd7Au?5Y#tW-6AccIxa zGo+Yx$Z0mn-QMV$7oYT;F2WtAUSKrOOGkaeR+B*YSHk-q&JzzEDTz+Oz+0p|NZG$* z_&G69V9O&{F@FsFEXK#o;5*!erQ#Vrb# z5?7`S=ggt*pusP84S=d^<5+(l31dxOZ{YA}9X8dfz;lL&PQ<)cTKr|Zm@g}O!|sw{ ziWYHH=ig=J-Vg_7yBwcNg5yjXolkk+A_WN~ifo$rWZyi@2Q9q|zV2t(H~iFQ#1mY_ zQHu%b?}{X(X-)m{V@flKnLJunV$I`qx)-HCZGr#79?sP5>3%fFb;ErC?$h$06Ffv7 znM6|_)sBwH!5c(kK{LFZPP269J*UQIc1W-<8Gg{}bRqHgB1N;vp9BaH*nhiE`QQum z_mCVa@k~x6>es=e8#eGCU7;TtF{MS4v!!H_n4ZkXhBy>InDH-SE z77-(LU-t?52AeXcBpe+Hzumt4Ri<-1C-HUvC`>cSZ|d+v(&#k1vhSHI8#8FxY$*Cd z%pcj7&JBekzn8=LdvEx%yatB&7N;|a02$usA9PzxKg{=LPc)uGY2zVqedZIx2Hdzo z!9|DBBe(KfGy!GJB$PRoVO-1go;3v$%sCWOY{H9hD1{6mu55oypMs2-HZ$H)g(UC# zei;IOuezLRGY369Uw=Ytc}I+JWIw()r|zJ>zNqw;DzCN0E+)TJ+xV(|BIsiJ>Czeg zJ5c$nXQq9k>ouZ;1L?2l;izRPeSG^mPimb>Gk&og#-wl@pa56>l}>=!5ejK=IPX>{ zPUdA=*AVuW>b2zfU(4+YT7pTvc1!ba7onUVdyhb1gb*^s^4f>$hLp(c2@j~t6|?ADqY3Ui zDruUVl6v~X)qSpFeuoO^M#!^VTzMl0yz)dRDBkU|O-OA2C#LpJ=p1-S9WCzbqXp51 zsIOk-2Lb2Lmr2N)dZmbaqwe<1Up5ib7y%Ze{hPFY?Fkp`g=2 zN&e*zd6{v~>JkU*A<7Hug7$r)esn^+-7Yb%150uJ>N{p!U%R)pd7^{iEiazeiJhF( zZdM%YuSYOG4k4fSN4rpSvMB{iQB5Ui-t_f%u7#WWq@x`H!Y}cc8BTtt!zrnQ?0ruT z0pEc9&We_@$Vc6F3>ctd9HC9U11o#cUk^ZMNAnm7Ssb!Qp4r;qS*FA!nJ>@;8IX!6 zU^4z*IVZk{9|nPp$HG>^HIc|J@n6r@EBx83Pslb{U()g^4iCpXw#eb}rgw5v0CsYzf7xT2~bY2cXTVx*FZE= z$D0_e|Gpl>Sza7Hc_4@b>*1^QpWwne@u3aUI2u73Z(nC`7Hf2i|1OXd;2O68kyg(s9M{hMa7g}8sDY#?}(JJ@To2!HB6UO3vGvPY5BQie#6k0m=P+mR8J}Ux(|o zq{};pl%`@Ch~I5wrQ_b>Q^>As1*!$0h=6Awh8KNtg@mW9h#)$XdF%=YkB!#kZG#~0 zXr5vVy0Esq-EL9I^vN*0XNRjqI>+ZdAc+baSy%4ZCVN43azZh5q@DqVoqq zM4;}DGS%ut`H*pWn6G?X&u8qV%`KL2j)j)JYlN+bJA*i*@!3PG=|G)|axyroN1-gD z{Kco;zd+7~AM`{VO6?IpR`>^P*hwqXM8!f8ZkN7mPqhaMFZ5uXMTt1ZB3S5|NS^4# z_pjorYxplD5p4SB3qUC9s%E^pkYwY(A!4^e>NeLZBLUMR!4%r2G~XGEao)5W3EIK#mT?e3|#eRkh0-Yd@7!gZ*`=E#<;X5|YY_H{Q z3O-|3QSSQ$EN@-@KAiVaE9$8)WT@f+eAb{YCOdHVGu2*E9Rl~{amUs}@MF(1n_uo* z1VvP`T$8l?QrQJ zE~k-_5j*CgE^g6sNGjDbv;mIrI#m?@!Ij|*STJ}=*;-*bTtP2e#* zyq4#>K3k|Q;UA$pxpkz!+VyhjeV&hhT1@B5Hr9k?z5dKZN#-Fz0tq4XiBuHEqRrb3 zD5yGhAdeSXU*1S2vD@4U7ewxFXfWf#@ffS z8+3ioxL%OA2;|ed%a!ExrAsSd=;jXs<@7C{t4H3#-O-P_WfCZ7zWg}*dv}U@7{407 zXiMzQN+`OmZEssT*ANH%6^Zgv-!~}G?x#lW)nH5PvEn4S2C&P$ff2+ zAGMHNfyg99-mS_PQ^mKdI6LpHf`YIsE``I;f6wKiIkN?Pk4J;C?1R)f>6GkgwBDcA zd9=c<)4w8|Juf<5Jd?rr5hF}=rzL0Kn=a&7P^yIQB;{YwdlNIyR#ngA2glTH*Dwz( z`fHq#e|~MQV-$fMU~Anr+km$Om5+W&6UkF)H+KV^^Gt@RJ|+}lze&2gr`Y&(N3?jL-%nuF_Sc$+7JW6dXYy;e3ZU?b0%Sl?Zd7o^+3FKE?YNDo#hvj zkiL2RAOXgPe1N8X`Y^9&39z=Zei9$|%Mx;0QIsRN?*Waj>IPK8P|v193TAEF@mpT4 zV>=59ZQdAm8$OUJmoW#`_@+kA)B^Csz6zp2#a%aRJVJ-y^!qVIoO#j^Q~%nl#}7B% z!bAr1)edKY&D7-q7J^H*$40o9-ANXfT&L7jWz3j?P{L_^wR&bbcbbgnA2T2o%cp2R z;F~%j?}*y2e06^Eg5qbp8CVwwTA#nJHSh8L=)v`Q`t-bhqub-=>^yd+Cgk+xhWMHN zN&nGo8QEs?Gv1plYARQYe8FqP3R47YM3YlyQ{@@-#RK>6Nh`fHSt{h>q80}>k>|{- zxqz9W@@rdO{|8VDp~1tx^G@C~^i9g!qfV(eGI21|ZN-fi3%$=1RlEx?GO|^HXq^_Z z=$Z?8qs|rs)TgANKc;jF-c$@Sgsdx+bSb7VUt8d^!ryMa z-*I38|CQ7KU$})F8y@e=4Y{TRbIbn|SN9Jk(KCJd_VY5~?eTx|E)~xoy^gf)`PHF4 zLdfuY{p7D#?U@0czpjt3|2YL*CzK?<@yvR0J>kFKzIS!KY`%APjiz!6%&P$TZ3zsW zlqYWYTve-7v45)QS>4Sddb^!ua+K0_eWn=Yn~Ai$$XYH0>wk>qab-e+S5XezNSOoVYtsP8EH(EeA;7=Lj=Q8*~O1$Cwxgnl}-xRRFfk}ym!lV9=As` zuz6|BH~7p*>AT&+et?J<;8K+*y#~XnutGAN=esID?(p|fRc6xrxp>7~*GHBlp~Ho; z`(K8hw=686+VQI*9Szsbn&ia@;g=d(&lr@bL;fvi9hg z=r5#(B7c`nS874InYg32N?Rzk-~UZ$sUXwFVHqx>Ot4Z3yZ;JWVu0>6wCdUttk4)*dCf%hI)ewJfOp*zia@X;Hsf>Z_Y-U<6&Sy!iA zvyoXoxV@9TJp-Qqm2jFGzk%qx~_> z|8_C8vu-1t0j}Tzu%A%c6_{(|1sSk8r=$g3}rt9H;;$n zMGElE$FRohIfh-graB6{M^ifiP$Q|K!ABooS$Dz|tn>kfPtY=aAkt?-NNnFbael?G zoT+F22+Kz@FHZ=ZeV@L{qlsD1)qD*XVBIg^{u5Up{;SG_mDk3j%y#$SP@C4?jzd}B zm^Mll3W$+WJV>?5m($-MK6Qj6sU8&&^1vj5+v|@9OfhBft;G3uG@fR3m#PebZ236m3WrflS-mZ6s~pru`={gkKREi% zZAkhRL?=R+u3A}3#~-1lQn&M8?0_qB(-oeSF$8Xu8&ouY-$v(3J`ED9btenKri~Y@ zs6Jpgo?23a<7)KQF|}57E*W@5x3_W;ISc5126A2FE+OKQGpLe2#1(UF4BH~g{{@L? zaa}9;@0NJQT+-eMel_G?=h|0Y!2t08BpZRSwjWV5`kv++xsBtuk9;QZRj}Bnp+X)X zsyOte&iXl7s4OqTuV7V0GE5?L>+lofM)((;c!(@y)`l&kB$I{^wuKe$bK|JP<|qNj zH_IFcEw2a1R{U6~0X*gz_-AUnKS*L@(Xt|FlHZ(mW`t0U2aTE-yC+2}vmXb{!-FE|s#E*tckD3?FT1R??(pm9A8p*%kn?t?!h0>0Fts|*Y z+&-P~s6Wk4D(5rgAQD|>wHJ%V?cnWZOa`>mYeVdj=?g)i5_=g}^uG0lfFITU766EEXscvIQOqM1AIjRni|DD5Se%3*lvysCNGj%xV^QVVzXESZ?HrK8*K{ z6?e#mR$49kdC<=Q9lfTe5B>r@HDWOlUSb~*BR-OXMrwBU%Hwg_#_tnJ=^lo+Gr^?% zE#I1sOW@ME^eh$vuHVrbOva5aI(;-5dY0`4t?=@R;A?=U)^q9pe7O{B4KWN@W1YwbQ-CfqwKUE` z+RzDl&QEWR_+f23^i5~-9|A84%s@h0jP0C4dS3SMre8c_TzO-NXJ)o zqjvToT?5l^s`kJRtK0v(h#-y*L_Ib(SiljFjf>7Hr?+^<1p9#Hs4t-Fu5z&4?U^jn zB?#*Sxz2?Gvh9iJl8L;tyJ~;G%sG*U1Uk6FFYs+u4clJ>dKqZX(MwLpCz z|HYtnXT8*OCfygvc1xH0bBl|H`YqT~FNPVz$`qVwdKUk+`H7dCz&jG%J^`A(Xwfqq z4@|w=zh^tHHHvn!)R?#Tf-*Hd@c}c(NZG=`mkSzF47h}e zVneF~>ECmg*;Q-h<`faeT+Mzo=FCwbzFlbaJ&3^6mvKb(%!qi)N2jWfQZZq6Ox4|~ zJ5s{CuX-`n{wAWEfnE~uJ>fFTkL9hKu?YOVN7wczWOn6ykvRu{? zGDD}J$(=>#oh%zdLaF7U2l_f<^leXziyBJfsgkW z_=!39HwB(4$34#kzBc`4f5guXY^jl}QU&1SZsVqNW`2ICoMXY$5vE_CR9YkTBlYM* z))I>VF%}hgKNKk(j`#VQqYcyL`7-s{J@*apA|V}KnMyy&Ly?BLo63{0o)fUy3ubwcXz)B~=Z=`~h`|qQ_LnWYF2wpIA@JU2EoN&M z-kvq`8k^^Og6QbmjTJ)Q@o*%-)IG#h{G!@0Mug1T9e z*XDmS)d1t(x9))6F2Gyf^~^KBh}9k^;$dvjxz}Av%pwgLCigZUUP+m}Sow`t11C3q zux+E&Fn98HEzA_;KRzKS3|gNoGh2_hX;dy$`HzfUs?LWG**>6ubMzHe7uh!skaNvZ zQTgMt@M?vLcjjUycYk?~lC^Q3p)|o9lQ{{RNT69es7}QZXp#T8=77% zYYRN&Bs(4khmO3nR8$;$#2AfMCrxZB4zi2p zF9cDuXH8g6o8=gKw7ZD$qcO&}+&eNIFZcmqSdl#ogPZ&Yt?a>ybr?%KZlO##L}jQ% zz8MQ>2TyyoES`)Z!>Rfg>9Ry_ReMmEx-qcZEsBpL3#iP+sHrC!o>lLP1B=ev-T{?- z19aZD%CL`bxeTLA1J39;R&4B9(HyFGhQ#p^@s|9U+Qn8qq;t?yQc;u3-@;-eMs32E zphBRg0f0k9NFQsZZ;%k3zwOB)eNr00bALy=>6byBXw&!+VwpC^S=!Uc()|*MF8+5V zc!2yt$6Om8Q31GJ(6e3noBAw&8tP@UCdm)?o>-mKTIkT5({c<~!g72Rqt77wC8L(^ zRj@6m_LO&1jiqMtaI|t5GRnzo>!m2mGf$!TMb*LrHD~6NjEIsCV9hmB+~I+zZ{f6I zB51}lEyKNIg4uz(hxQ|bmVwVZn+&tjuY3;G8^K-Z;=YHX3g4T-l5b%INxL8pv}!^5 zYx%hD0!n=8EzY*O+%BW4=B*gsHWq{17;ke^?OliXzL^S7o*nojcfsBTHtrsH+;?C0 zxsWWr4NRGnj?YwtBQ>*Dpc41SE*?fnGvS$_lQd(iTeH>dw+X#y{y?DhSzvo?`G~9RsJ7>upxE~PYy9h<)xw;RR<8uD-JMXUeofqk z$C|ozMs1!!XRcpB{?)?MZr?uX0rD>hKsMFR%aa?DQVGY|-UGwMd*!jVTU1E7IvllU zlLuFWMF~U{_z z?yS$a8)I_z9Ya)o7qhRx6%ugLTQo`CR@EI2Tz4aRo}W|&*!lrK>n4d#JIUESWy2hO zwU>b;#vz?Kg9poBFSQVE3G|9T>R_uD3|0Mgr75oaWLq`b32?1ehu;I!n}1fdHJeTm z1ELb2>3M=KfOoEFHCNwNo}4&%f9xcZb?S1=LE5P*6uzTkVXJ<7_(P^PDg}4_iVM2G zf$`e(FWFNJQ zUHlc%_(TVtQ#)nQQ6|iPhbB-Z%lQ&`|7gI)GUP22*?@s3C%ByAJeoK6nahoJb45e_ zy6jm&P>TBiQ9QzW+-!00fnW|Wl3d)5!5!J>hUdM*p0oVqicz@u{@)u1ue2>i+H&Q zH*nK-IH_7P(Gplqv0_%IcwE;fjQ6lyw=Q=|AyDAsfsnU2)T^n+IwT-1z%7ZewW579^1 zB1OQm&A8fqdGxq_8R7p(DTKyjJ!Q2QDstUytf2K<`I9+z?!v9CSMzMBO`^`V(??El zr5R~UczO?Em7U4s{)DfZ$DxWa{8ida4|-;FABI`#@I%y;DX~@+PxzE&ANJ!JMX%Ga ziC5KLjvY>GWjI;n70Y+3yKZ~id|B`)H6*CJ}z2!pR#)D2%jkiPy}X% zUyX7vI~@$V$cfzBLLJG;+3pfO?iy(9!5>U8(y>Jplh^nf0^>oh{uT4ULgeia$Bz{H zfhCQ92@Xh%+)#8IeUp77jS)Q<*Z)`^&kN1R#C7z$r3zU>K&W?w>c95{4`ZPQFTb9J z43p{XoK4)*s{pI{Dz6x`50+cv3@2q4gBYKnpTf8wa!c+h5Yp7xIuMP&xUYkS`RwoM zs&g*rz0^eju*+!A`F+x*7oAP zx8}kZx^`%>oBqhfr^iss=ww@#?_dF`Scp}Prv7UaOV4j0DRC{?g>Fs}idPpN0*e1h zp?NIV##2K!pAWyg!ij|>VN(af0}dPD3>oYlmr*$uiTKgnyv4JL2r5jHM>>0sX%W2R zm$5NgXOgyDKBjMe<^Aow^+XE!_DdOhus6y+YA%`H^s`ph*?X#ZAV)eO@7oTCCAaBG zqOTvXfHcGXhLc@fyD>F>adil0zbfEFpfCcCL3Xmta@L34J4w9hSU@iSN@pzl&qlmLANDDYHWIJ#^V4x2qxk!az67>?y4|tyBC$ zt>dEWyIjF&qX`Y=D)U3L$~Exl`C$6N#2_MG-LU^g&=_bw45$1L{qJ)ouLH=03y$-A zl<#gey%%=#5@VGDioZ=ADVo)G{XNKts8%PrBYt`nEw-7iI!1MA!?n-Y?<$yhUUbOU zKgnffeZC-Ir)Y5_@Lc@0mbqR-$l@GKj581DGw6Lf{ttP^Nyjwc5$@h{+HR1|w1oM6 z^qzVh|7Bm5G9OrPre_n>c-2;I)UMh~{B5^xjiKW&G&|Ig#cNjEqTPB#7La>~LzKPf6UArf`8ghmOT=VVpP+XW%zMBadNKs^(R;z zHPn_rG0{IKOHo>AYli^fL=*(snE=h>H`|xGb{GoGw}HcVapeo{Ak#kneEnh-p;O_u zp-42gbr9_%hU0wNIRCKF2xZ;SO^nn3Ay#bM*g;GDoxqDyWiGc+|Jn*eF%)t4@=B1aN}8Q zrQ8Sq;0kpde6eoQkX2npOr22Oz0O1!yRhcahGZ(SWkMNNFxosC|HrpCbnCYaV!nVI z(z7beS{=?ktPit-{((uMtfjXO_F7=HZEt19B)66IaV!jt{R^wXK3XoEvn-Opu-a%5 z@6q;aCpa8=!;!Xud}7eghUlSj0XFVUx(?OFUib{qj;G#9 zE7_#EVN(7rchywk(Ebo(7VMi&t{=OHzx$Db*@*un@7R;fGx1>`f*SP)!}fe|Ly9`n z*GH&OcyiF0%cpBx!>4b+pAj?QWmAtlmJ=DHSt`!b(T1s+l%Tou)>{Lcy7=8~x zmVx^W_km~8i#{7X{WOFHdPp&Oha24b^tF`mNb3+VCX}0$JhIHp>Qh2WT-lz9s_=?q zey{ewSpfF76p}cwW+D??CB%4o4RMvqxScMM?xkAHyOHi-zBomN0T67;#^3V4`hs}X zUP@y5fjdifN5+x$sD`xMe_LLjcByCE1Y8C`HPnnU%zN=ViUnhB^XT+F|`I76+XkGg^@T2zN7N(x_=J{)*(eefu84mz3ho}f&_A#?`npQKZ#J`$xtu2WKdx^*^1r{7zduyVj`;Z9 z5~CGn!4I*F!H^jY2~i2<44OGSp-Ye=$<(5Ixe&0uGlk`dzhYZRycV%m)ncd=WPfdA z+en+lX`vhn<^7p^mxgM=*EbCR?M3Th03z-(xhT%S$#*lh#o8toHHa%VMsCXqU{pk? z8XrgqA=y20owFcPO&rL%(TAQJr&J$s3a2bOL|~xS$t@Z)C54|u@CxP+v-s3bw>7qc zTqg1A(1)KE!U2{29XfM=c6=MLnoBsI>ZOC^0_0h|w=xl$6+|SY+ExzBP8BXUCS1O{ zp%@=zD?<2icoch&dHsTR2{Csk9hF}d0#lxj-ThQasC>W3CEGntL?3JY{lMV7)uD|$ zbA5N?qR^P3;-Wiu;;Grk*cdl9pEw!UF3m=Rri!(0>iN6FYmHn;R#&iA8y z>-Tg1?>_yb2)UH)==<>&t3LJOiZRb?L=Z9=&%U{AyDuAL1;#JO(BM(!f;bsE{`@g~ zPce_`ua`zxQO);5aclpnjZ0L(&ibZdr;4_j#CCD2)GB?!%%#7@6WNqrB%HisA#wsq zYqV~B@;|#ZHw~GoZ|dM`%j>yW`M#=1mCvjSdkkLsDG)`q{bpQCOhC*ZB=fo;bjrT8 zW9VoIQ(uDC)3qUe}f@+56k{7Y4jLRQKx@MvV@}MIIbI zzU+iUXWx>kwU4H6dCQV5*aI5kewhZ1^2BxzU=in!{G>)6$wD|iA3&zkgvD>UWM}}w zusviJP=X00=90LdP03;JXMma!h_QFg74`V;DIYK~a}$J;8K}?#Bp2jlDlA2R*&>u~ zi7mW^D}9w^^8Iw!L)I(VB$;&mO6XpbRQIcaTx7uOCJ42W2`f8K!lf_Y$o|MTXpNQ0 zAzA(*^nuxOeHDLkKkIR5)S1z@y;|edps=I9E3{e<+wC1*(0lfd&gPx@I5BJbMJsY? zB7}SZxst``DOe7{9swfNRe87>nr+UsO;N;GK$50Wp=s zEU(7HinBW0K2F4)rvxWP;x`<50p~bma8P^l`+kKnis=*mT=DwiRlF;cNyp*c+s`D* z^X4`7o;Jc^So3D%xKys(L)5|d*aehH!7sT$;s)dBw`W!zrE;I^GkneYdIJD1TO_Y= zd=zmS-hT*DXMYC%X?b)MI(`cJHPE+8R>qZOfG;RY_c>?e7r0>q$WE5^*s)K?Bo_i0 zm&Tls@K4bGG1OBGA^{dpx0T2tX3M%`!u{;HHo{-?E*IX*I4whZ!uIj=kkM^N(=2S+ z$)_(Z-Pf30nXMK|^^s@n2&%CMzMF*ou3Y-f(*8P+?r1$i-1k~0r%p9~_ltDP_r}62 zPjX*3PUbS-k|5DJPt&PzF}VM_yQaStclpybG|o%sdMMzkoky zjSp&X8bar@h4`_6l#^r6_sA$1MNm#!XZ1KqFjE5$JDpD<lg9gMrt7H|A0xbs2jW3d~h#fDi6$p@z3`33!Zxi3}&)Qqa{{HrT4$M?UHzX z;blI3{$fdne@oS?WVj()G1Zb-Q1=P`@vHOBI4t$2SEQIg0{Ec#R<~5&C*xnPi5_(q zuwrZF9{v$-v*k~Jq2=v=2}+VH9fTL+kV2dex-0RLCns|YlS1njA4<plPw5}cd?>jCdc$S&uW^(V~YDI|PFoh`#Teo+S-j5$Dq-bV1RR34&1eb=73k!X7o zCg%;_w|2=B8<993EFNWEielXAv1rsjky{m|6C*D4N~gy_>`OoAOaETGJv&cF}_?MGCy1v!R$t14}HOkP^29>8X!QU;A{T& zC3vyK&&=>0Ahxe=rpSpI6eZfW-31Vt7%5a%0(2$C>gI#&6l4bWZ-=n`k2&`^-9&^~br9e9w%Gpca^2U-Hq`Wsb*o+sXlr za==u#YiFLSE{JWf#QFFdS`=si_qSc_OkaaTW|AV4=hjt!7=FhzY2zgIKDEXD?QbqiOKNkFj=*~MHCaIF@o+;j`qe0PV zTKPh)Y!2<-WvcREVU|7UZ|sGw{APLGpUB+pR>^>y&&{saWGwoB<~wCk+&jHPH5rWH z9aUuKY^KzuhD(6cu8E%Af~}$Qmk2`7lLefbC`KEn_a)2OD~#$wL)cHVq?Y=*5X39; zpRntft5bMOI-mch^wkh!t`L`cwp#DBG&E{OZ%uoOehTXIvHebgUgUtA)8>WTM4K1H zWstxSHW1IbE}{HgBZ6iDcI-#6cHT=+#CZbC1`^kDw@)60sT}P{Q#_wgcotrhWSS*3Lu3QnQTQ;Saadisf z&_obfTX%;&lR?p6Aa%5#UnLo;8XQkN8gr$0X%_BaJF0KBv#OuuKX(jZ!S~S4~cl%2(ISlNf67 zzYt$9mgM&gP)HpjWV^mAp-7wntx|VZQkxx2L~KMXI=b&YLLk}Kcq^oP$0U`(K`A2l z#VY{5pe+F}$+^I4`}_8Y)~=Pj`{=hwuOQZK+qw3&o)~gk)!2#4v}XQDeT!_QoBd9- z$N;eOXmkS)?R3s0Q2e&@e!29nd_T8RT}1p#=l$T1n`J5oz1+9$B(iBWUd&a%y>Wai z+LN%=){+0srPo{A8qKb)fhUKprrOx+kN z7*=CZ8p9oCnTC4chb*D~)4&tl*zrcUdb92oHoiy$BZ&V~s4iFaO-*_V_G4_VbWSoY z5+taVKVrx3t5(%WCr%&3<3TBW<35ApQJAUK?0wKPvY_v{cUm6CM|c_f!6#HM)h;vz z;AKuf(Y)FrK(>j#-nkUAqJj* zQZem4U(%Ay5pEr&mdfk2%vx6d&y&vNFlMxdIm`iE{(kng|BWl9;zi2x)Bhjj%KyTc zLVBK9a(%8IKv$dIg*OGhUE!0>`#-@4Z!d4x-SV;8a&Q0fv?PwaKOF15nSX!WUMx@T ze%bscrZJL%z=o9Qc7;KfuFlX!RPMu4^Q^pS)#R+a8zB$cx)JDHO!S53?mdM9B*v!x zb9|y22ym#&!}x2?s_58^M4Wb-3-_S`g9;{T_?&xAe6vMkNp75SW~2~Dd~zp(yd*E^ zc!yiG#n1!{Cl_=|!>DH?D6x_`7}+`8x0^l-nPVT3T+(;UWK`+nLS2HH()?ulQ;0nC zZEH{7Y4p!haJzmwqZNIiEQBwUalK*-k+9j%vamYS?`-M1{c6`=E!Rs@o7C{W8ezXt zFY^L49Qbq^dP2*F-yYYCA%3SZV3nUNgT=ISO0@GacF<%o)o{1hGN>YIU@O(7@{weq z&8!Dwbl0_ShzLN{f-ypkIyPG1>Nx|XOBH6%6CT3&d#NX;buN71CLMaHt?b#m785I|viUw* zB{yuqobKiO*rHY&4pMo`%N5I84@#uoOIcj4Du?F)qsj0W3hl@lzYB?#6xDveFx6Sc z#UqCJ?j}ctIO!|5jtV=*Xy$pwrv)X; zSQX5LnC9n}+HjRPK@jX)5Si+duY18bRv~Rid!e?(oy_YRT+$Gdqjn&`tO2*)`(}>@ zP4pX`Cpc}J2&)enoYF?@0Eiiku0utV%WA0&J|3LQ#0}T=xWs#I8@6a9{39pe3tw_n zveTz}@Rw5}%t8%Fde!bQ7pH8UheBd2+~l4f;HP9`HqI%I=MPR4cjP5|{~5QI{X+c5 zj!ycJ%15P2?zn;DC9OXiemgtJmvEZol#= zSis>&v|ZpMQ*23T0>zW?^XgJaIrP@T{FQ&6&92J?Q-r;Y9ZV&DmSBQk+}5b)oZV4^ z$e$>jD51VbydkGQJvke1xw(Mh?7eZfnOyXI7&ozcC%1u7&&hMPN3YWx<8n7y-oS9k z!gsuM4(e|X3ey+7&HkO=6Z%YSsv~sH2^hcdqZNI)g&6FS)017}Pu?4g-HB>L!_Ay( z*U71@IJ)x{%L@#h@m0fymy`(8l4y%}kSHH=P%F{-tz5{ge?Vwx&%l#d=Ux9wV>eUn z$9e(rVXm?e<3VHseCBql3l>I)2VKq4zqQzZdZbTFpxMMozOH!nzEn3TZRA@}z}K7v zK>F7lCV5T%v6Bf87KJ~^G{v(_l-O5{#$6U#x_!7+YK2tKd*u$M_Y_T4eOjB-J)cYM z?#~##5vrsc0y26npL3D)rv-5nvGHd;KwET&ak-ckGiBQ!BQGaymG1KxnPU%aKh=LC z9NhYlt_xYvdm|u0{unK=8VnL(FLcYFos4bU)yn99^38O&pA(!n%KH_(&3>hgMMgTl zY>)XYje{)cb!s=ZcgK#3`cEm|PQA}Zf`&fQ8%*)Gkg(|ji3;{4DZ<^hHl+} z`j7Ny&v~IR6k;O+P7)ityr*I79biDoVUQ4E?tp*eEOB&m)F-z0x-Mv$gV3@|% zy2-l4aG;&_uA+|N>%|r` zM|3EF7n@FJu^Y^N+S>b`AWcU0rE$JJixbmwE@6wYhRfCrk zE2g4p&I{wEBdgQAC;~fU{C$So8ev=~(h8T@CX{v3h1LuR6Nprh|Ghdm=)^E0klr`Y z;SZu;fxA*42UJiw1@wu6J>FNw_zr3NnxlK$%M@UVaj$^8B=2f=i|8xd{4XW<)OrhX zFW;Cg=EUsmZ%bK>v(+~lqqSJdW@c@pf)n0Qka$X9o3pgKt~a;qnR!b7=0^__r57M) z+Pg6r?WJq^Y%%hHQ3t^Ffw205Nnsy?RsG#;sShtF6o7kQnKJ!4?K-V^0c}cAcKPeI zdM{mksOn_*^jPFR$#%m$|Aqu@2=e*IA1af*_ns+RZZ0KPAH;^znN;Duu(GT^#Q=~O z4I3{%L|c6@9GG=LCPoPs8~#M_E3H3sSDJF<(^!$ulE&5toJQ^t1cQ5vFTDsG<4Oj) z;5gfoUVOKpg#KOs@^)NVo>ngH+B| z9Q=?9d#C3Ph^G@)e?&A;fU&5|@<8SHe(r32q2)U~5OpyVtwmB)0CZ$VcgavU+&;#K zdZ1TbrMFnEA=NDf!P_X5CH;6E4Uc>zHz@N&3DjNVAYW*71owwf9ZXRQEbaF;V&Ic6 zGLg$YBza-1Iwt8kSkl-8X|c#Y~iw$|-GoU`Vzby@OBW ziOS63=uqh*!bS5O%ag}_!T(ZL0C$80sPpK%~-Uf zqR)T4oWZiIqp)m6@nKD0pEj?lIx=N@r@vz?%F;e9MZ-t>q_numJgfkxttPWt<}+Rh zytAp}b<7W_k)8-Q2M#M-A)%8PPOBOJNU^%`{_HB5oUBAfjx`Zz=T^>-zg_>KX63_^v?-e$7YA;rmkD$5?;1j`PlxuFDOvptkr!f2>pUpHNW? zq*w!oiCEYHF6u437qaUlP5vFfg;?8K{F$@z#^zjkJ8eX5(Gy}HC*snM#+R={67{GD zpPNLkUTCWaB7x=)F>7dL=r|*Z{aQ&#k8zq3rTf$nQSd$`vfG%C2_{FaT4^N^?1RVT~9a(3^4r#fCg9lgKR3p&Xx^;t}5L=D&7BJk^Jq?o-v#JK2m`#`6P^8v)1wl z{U=_h82t(T%=*v>jakQ59@Emlqm_8xJqJTSlqET#KKA}_yA&~@odyk`o!VbRu#b|K$q zj)`qMCZq+|E?CnWI6t`>_E1$0o?h z7SFlsy)=0&Q&Zwi6!oCH{j1-N5B@X=RR81Zoga7fvF?hLM9TXWk^)blz-V;%LQU_k zVaCrUv7o(jS0)NS0@n6InT(VD<7EdfCNGMX!8vWAi}_J;=ke6Uy-Ik-yCBb8P)|8Y zgGSk~B`NG@`^CoeNrxlJ=AX2Mx2OvwuF-MWk9mJ|e_RZHsSv2zI}M62cs%pmmgY8j?1P*i+rvnhIn zo+5UsUj-fIiHI9x#}2w8y>e3EMd_l1W8gKqaL)6G&(91TdCWYAXk+&n+c=yqlG;6D zu5Jwuk^*7r?MNAe{{zZ@$KYyW3Ml<|q~L$ee{bpTrcZ;_dQ)%Ppf8o2{ueP>`bksW z38G57&AUGV2(L4oZyx~#Z_VYPH|Mu+H%U@KzjOUA#A{$7Q@SQEwgY7wMWO(sEhO>-SFojS|Pqsk}T_XeN3c6~e?2ol}h&Dbw9Sc?Bd$XgOJ z^d<5XsgzpNd*^2+-zAa+Au9rmU7G~qw|dj?Qhd)EBX_!-8!|%tFF+6Xb^S1VkuTPs z0TgLS{9!flzYuf?RSpZKGg(DBZcR&KItXQ?)7k-b#Pn%VmBfHqGX5FL2W=x*Q0u;a-MyB%3^^5DL}Chv*jA z>STGB=|u+dLI??TZmrkn&@C|vAg!px;~|as=9D&G;^&a8?QWlqI_YrjLf6!hh-3ZMgbDCVv+rm)D>H`hM2-r9%uhsSH9lFBDWIC_8v|9zK z@Gnz?oSKYxy!z3|3!KV-B-O=uv^@mMzGe-nWevs?&7K|JZnSVzH@jNmaq#-eC zoqe48yO7yV+n1JbYuXgmY>z*^NKOthLuzsdM3m!qrgHbkEA}zugmBoE%acag)6t)4 z%7XHC&A>DrT=1$sTReOHl(>|lbgPBaaggK*iQa@90A8gml@gG!#&0nfM8kfZzg*ig?fw?Vs6IlX%Tc z`9dKf&fG@KTOzWz!*)5M_=x2%_TdeQj+P zkj>W_pew3e;@GtHhX3saZsMnfATsn57rbA)1bUwlX?gy>ra!9jUPM6Eik0Glat%DQ z4TuBug`J2p`gk#n*SKbBADMhG=bm9CKG0DmB5k0D`7|8&c*Nz7yeh7U1}1pyeuZ3Z zs_M=k&wX5j1E}5p{ONiBGna^;gc6cIiz*N|w{GSLa2aj{ITJPSrJwHPc=8?RuRmvM zSw3E_2Jt`BEHrEJhh>)j^~;K?37vwVuS$z07f@q@qGn5u{In>x?=S8*hRUh1LeM^n z>tK4k+X2qKryEdUk{BL^gg@JPP$WZ-oIL( zb56C#=jPuL9?GmZ3f21!vk=fs0Pn+*H`jBR|-R&4}mhkSw=Qv7NjZ zG$b(cq!K=ap5*S5h&QAD{AxzQt*)d@ZL3LQ0vrHoQ+i4HD zmeLgo82hNtN;&f_$^7HgJ_X(6D$WpO*DEReCy#e;b^X_{Z5{AM&eVy zF0kvv*MeTb>ClWBhTuAJ{W&D4geU<)INnk#DnX78;=6-Lp%}ydAhf9|^r7jJB9gYP zl5CS^j&a)4C{E1!UDL zv`mb18iskGZ|B)(*@Ue*VR{o(=&zc4KvI7F9gGpF5#G*n*Z{i%yVJiw)~Qi+Yl_&u zDuiF|lqWJ)S-^D2J@q}7Rs|g(lv6<5pwcM?8X`hTw7v|&A44YN!Ae=}skD!F`*ka7 zx{%IVg6&IXy;a{+hVZ~y#SfN`G(=a3K;>8de7isiMBj6D`m&X$jI06XfW2JlqC*_G zU4j!5w_w?S-Zc-(!Y=IS&-d$wU z23dzbqGr9vje<=x=|m;eZ*a+<06X$EkA*s&*N!X5_MU+(wNT#j!Hi> z5Oc&>4bBIkQrEr+3}3$0-|>rPd|dY1OiWknnpe8h#zKkb=b|0?f)2}$jB03?!bAVV z+2S7MgCD~a9`b^5APwhewlZ-%p>Z_2nPn!fK+a)K)gNEAH~%-h{f(zxB^_NaojdJ` z&h)#8W;{mKtZ)Gw0Ig~;xRHLb8E%Y>;L%XLmh^0H$bAd`oi?DeaC5n9m=~?sSPu9E z5x1=$e^DaG))8eVRLuYG;=hPvjwrDQC$vpP zRLVEVM@%F4Wg}Q)7<$-^6m@5Rx7+2;5B~9@ zA@qSt=p9cVl|#!S4Hi zs?N`B%v?*WsN<@8mJ%vs1;iSO+)FJ7v=0PZP_2;fP%TD{XS(M;A^#TA4-3B7*@;xcc3y>KETQ06$lf(4ATe~-W>4yRM58EUhrjGDvwuqF zXZx53|Co2JGs3=@JgZiQt@M@WC5zh?Q?My6kz1?mYnu*-)mJH_jd@nIUL@ywB0>55 z{Vm@6!{%MVu%Aqfe{H*I{Q{;0vFYk^u64%wx{ALZ{Pro6E=J}ww-T0$MlV3GqV)!2 zi;<0W8Ej~!PzG21I>xb3?|w>34;>TkcenTOGGUO*PP>vPC5#-nr#JFVs$D=&PD;Mn zx>;QgDpOOJ0o^_Wub!_MGa1!XiSK@KKshIQhXVANWK8035ukptPg$=j&@1<(d^5?F zV5q$jsWMZJYV^lZuHu!SH=PHps*tTOE2(01RKcsBiIp=moX-dNDKgKG$DG)O*4U_mhb*K+?pKn_2#d z{dCNrEEc`N@50gDSTI&P(<3B`?A+d%^T{*93 zEu=Z>*(5u9Q`c`tx>epaCYZeAy)acFJ0+d_E-YZyK@-8B#8*s^psHm!GhEK(=GI{hsO1zdYOc#ph?l@^}g_s?9JkR&e*s)ZS$v-|+Ms%fRti;6Xefj=sRw!2mN0aTdF z{=+wjf5ms~SL%Df;1hKppDDBl9FPppilmF_YeRlM=IE!3SwXHZSmX9TZ~Vgq&#%=$ zO@fa>-9T0(|4W*nFlG1lV5yG_xdXJ&GiZj z+S9$x9<^sUOdB5SXpGuZjkPh3I~?RrKaug?!@gm33c(U*#Ja&^TR>ijBIyxaD*~x^oy>wUFR0XBWE^*pyo_<^+^R^T&!UiWp7#eKhLvw-$y82 zN1T*|6_gSBA#*97w-C{i-3`$;l3`r7X%zHF82T`9Ezh4i+B)IZD7Bc*N%1>ikgiFa z{+ZQAJ!60_AZ^u8kME&NrcA}Z2^$L-`U0H9v*|7t4QPbzb?|_5TW~)vta1&0jfc^s zp4*!sd;lEQYtTg5PD4uO&Q~xTFX!vR%d$gWjOSB%a1rTTS!al!ZBshO9irV_$@~`( zL4@xvs{{-(womoc*%+@w?nXMKCuGuPa?p>b5b^qA;CoSe02$5;-M1^CIg%|p8A4fQ zIO}Hc5udoZ{t%&E=i|aQFr@vkS4F6JnspPA?L8ST)!h+N%E$3@Zyvz(nWEoALrlcg zqOo+#o#kzGbZ_?nrF5-u9K*u!ne(HE+O|z0O1t{H=>m>V7d0b8~5$hc(|oHR&6whSP}8>qw#XWkI?dHiaj^jjx=m*lNmPnp4y$ z*8s4DZ${CvOB(xN8uUlaXMxlBUzQy~2t0|xOQN;OTX04$EKwXR5e)VBQ@E*_(?-~} z@Begx>g-kk1>gD$(riZo@n^>GTe}+&2pPeY>U2CdVhqzLH@NZ|gcXf*kB%!2%sic*>^_V{`#XW^uu<45oB? zbXS|G{Xq$i8iSh+6@k3=W*sT0i^I3X-e|eiajy#1!c%kmCL0$|Ng~F6etH+L(B&z6 zPH_xd7G54vkk;W=V}RXWLh4t!Z2LElz!737k#iA_+o;%RrNf40Q8Zu5g^q-tztvS) z8NBu;s9!m72;Zg#LsOYclVDEW5ZoPtZTqW;?lq-5M-~VnxxK|pXz_j0t9M-Zh zqxEwOVbP9WL7*2VR*-i5K0m?*G;5MHNc{Y7v>Ruvlnv_@aSs3My@xJXGPto$#FRB+ zK#_;868OQAXrEfV_eSelufd=O?e|mV5RYmmMu-7z|CUwDtNg`cr~&h*T}#4V z;mJ_7I;|1MF~_gYVdBT9^!qEgD#(o~Ip&=Fi;U&V=q?HIY@P zH-;((s=6%bqo|#TnVG>!^7nE6^bqjl#UsVe{rPdUD?MP%duIhFa}7(B7;OUHd0&f$ zW;>ShR{~?&$%l3I%DMrZO}J#?68AO@%Hmu0vwX1On&~@NQSj_z=Ec*H&<&yx z2(0C!-fa_kKdI6ya~k4g9(`6Zpdc3|N0(ASXtDjM4&d34k`mpF)3ZH(h&f_7jJA7m zqFwV}7fH{3HD(t`=G3V=ACfwk*2Vw(?5_*yCqwQmix;tRZ&qj}SemlM3f}JLerC|z z&X7JlK0AtL+@(AWn>ULqe@k)wl>uSh>_&itYV11(2e`8-bvdW9YT#gC+yDo5%j z4#505>X6)wM@OQdnXfk6m1qo3v9%0bjnMRUS?1T1b;^h5M z?WEqHWc^aB&N$IS07XVf>4bUuVYtz48l|)4Z+Bm&@#1dNoTP_JrpiKYcZE0C5tV`s zhCiCgXWXB=hc})h{Gv2noFp9t4N)`zeX#XgfQ@The(2bT3q7AA21KEX0Drr5 z;EssW6d&jKk(QjkZEEU}iu`9WE|s8%Nu?(hmR3}|r=|oZy4k57tbLelw2pag?$3{T z!%dCOCUkZMCl;2e)n9B^|;pVnZ7tkmDAEPbyC)4^ys*b_5`DIhO5w39 zZ(woM+xSt{C;03h%}wD^XxMME5yAC9?JQ3o?K>{@cXWpPMPT#CTAlxv%7HJ|kNDaa z5~-hww<@6B<~5p4FG}si{#Zr#ZN6!-pW0os;bDgH$%R$p=ewJ(tq+nLEIT^ErG&u? z>^$pCdndHltVqS-JOOu$!B6uO%|qpnT2H_OqWB9bApafgj{Lu{f#MBW%BL5f0ikt` zcR07b_fz(Mv+E_Y;Ul+Z<#Bu@G@)()D|j^3X~XW-E7+i0)RtOAObpU=YLmG?l`|)w zjN8^+U#hI22X%MLbjE+m*TR$)+$X#qtM5w4bft^X%QbaU)M^{awO;;ySN^t|GlY8y zOK2lXFk8jHe@-9aj?W4st40m4>vT~RhgM0`1pLdy9hDe?&-ORep>zO~6NT=NN?jM( zyUDGoS{{;hSH>B+ua=w4)8;?SxL}7xoJTnqTPL=6M`ba2#gu2_WSnd4Xj~ZlnsJ6c zOk^{X^~WBJI0w*c0{tt{)(qovOwpkk5BA7Zg5q2vVee~+0DHL4@i6KIwTERX`gB?Q#H{7fK}X-!>Wy zFkc+iQ4g*v_bHFm-Ie@TlYCRX>`WRQR~4u%jW>7rn%&;7p796`@K#x79!UJG8wI=` z3Pnk(vA~0eST#r%9s7D*?*o6@$1cI-Wlv$lyH%ITT2Q8ALUJ7K^z+6Zyzv=0RKqLL zQYY=te#|iaFJ%L{j9|6zn?O7Wg5H&9@8d|Ws=9m8#Yh^0b=J^@DvsXPe`)srNcD3? zS5qCSx1vb*iShr|^8Y2_w=T%fZ?E=2x11ZKW;$XZ)+pVdcO$R_{JuJJccGmo&(BmF zy;Zb7HX~pEy@eUffUd4GWUC1f_ny=4-8VQnqcBu$IT$+KS78IvuLy-x#`UcG>KIr{ zBcxpf%D$j!H8bEl3!Y)O{rJD15#c65qJ_ z-HvL&H~BQtD8}(-9_P*lD^1xFZgn62X^Z=upo6HBB?VZANugD2+P^LgsYGQ{k@xoR z4~@6y-)v8C@)^V!J+3>qejsxaP?SNxvV!Xjr|O#BwBr5rFfqi>%!{>kcbhKrb+^@) zC8^PsN~~WR0Nb$rkTT)fDA@S2#h1x$ghq6h^?f#F3Ol9y9Fx&{f1O>1CGSZulaK}L z8BwkOP~lA|KDF~FeK+pkB%G7uwF3-_DyN;lWaq&t@*5x0V!~?s_bURGnxpnZ7va30 zp}8GOowHf%8*Z*6*6S9kVIa5h38Z1QddLq>`So^KJp>E>_7;?!@|#DH#p!5 zu4`US)_E+!A|9qw*MR*JJaPHnhBx3*7?pXro@J4J_g=%L59GC4=Q;l~t8-aV2T`GIXDSU1=QL`LN@`t#gtXQVr{gJ|OEydzmc%l!LhvF&cm<5ndX1@R>$ zRay&RUSkwGLA((Sk+XvSvQYb%e~G`GCREmLoJ>1FaNNU^I_|Z@cxjnkM<(!vF(|SM zg(c83(03}uVEo6_l5F$%96(C^{-UJia%oYQkM}DX!pwW8o@T5u#fz&s8%XTNV0z-; z=G%H)%9q%e=f_m05sU{sDsMoJ_93K+2g^PqhKF?x$uqck(xN)U@I3rrK#ACqzPUiQ zg3ji9<~&zpsfsy{SPV{oW{UaZX5Rw-l1+m!o?_yRiI9BD_g*pfNoGw1jvnh^I%7KI z5E@x!{n=O*)~e6;^w#qUh4)Ho<|N$?0a;GitOX;yg#UaFSmDh1x?bswrq!?{>2ypz zkb~6nJFFO@&!yPUw`b~qV`ku7V*j?^4?O}}aUAAKvrR33?>?!7xsxaBYQOdsHgr}#FhG#f!y^rCfG?`WY|~RA zjXsW$XF$CuE?3S-)Vb#eHl2mLdDj#;*N8zp3);Pq?ekv~Lri(@;S0;K;DZjNC*QH- z3%?#OSQE{Mrb%KxxN2LL(A9v9G#)BpyGc~7l@K^F$Ok0@o~X@xO1EcWL?cMdCgmeV z9=-1%K*_Ig;m-CF>Sfmrysz{~6CvdMdeP(D_el657qw7>6zcgY8R5a0jv?uHv@!_Z zM5iR0_6HCHlALYHYh^uiZiycF zYPQwioDhG$IaWVD0if^cxY9f6pHYAuw`uA}$pfiGl04*rn2`hR*n35 z7K`AwgA-~nCwBrx=jPOi^KdQ zBWM(f({Rg5PRRA+(%b0TF_JP+=o$Iy53TD=OtrvZ=7W3Dqf*zV2lXNnuc4f1pO-|v zrp$9?D(`G`3%yd}_Q+ipA0yYAY>z+WZolF1!Ggn#<7U+MY)H`f=Ynu`HYhesa=!rm ztnV#rcN=1wzm+dcFe>wmqXLxq`iR9EFHEBU(-5!k$^#71Yy~mVg;1)Y7$mkr{DL3@_4ED2FirHR%$KRZX-VM z*XOYNrjE{g3d`vRwyh86fve_Nn7~6`k?8 zgORv(W>Pk~Kuz>xCLc4u4>L6mKn5{IlMwoxxtb7M+u3HUiRS-N*7Pkmg;VQsE!fp45{sIlVa@03E*#rCFtdFB`vE zViIW;=lI>H3u;{@Icu=Z$0hJ8|NC%AVqIq~lHcZy1d1$1TuBK7ZMl%3aJJ~X<`wS6 zL^y@?t%^;mXXASrUzN4v3u!(^h_}kG%u;9LX53D#-9Ch%?la}&cFHMMZ15@*3_CJT zwhB!h0r%3{?(he%7}dNrPKA0!_F&Zi6@7jsQ4;jT5%+D`-I~&r(0f>G@I55T+O+g_ zFRK%BevH{|e?WN<8%;csUY5_ME-Zf5xq*cL0PRj3Q%;%+*X9URY33woMQwV2h`P@B zmJ5%l%_EDbOJXqD(X{VEK&w0_Hs(oRctyv3kEh#_TB2QbPcm8ukHJ~@_XcimeAS6I z=xT)z7(q5vH552aj=^yKJwXa^7g}|I1MgigFQvWz=HUNa|?ud=uh*? z#yS4%7L_u~7FT$WOs?xE;7@DkETPBb&%hwH{^7~ER%8%#=7Wa1@PS+!IqJrTl}V;F z|6Q9fHESe)t-0WgBcsR^;^NoW(w%RF-(#kTUsM&Ng}yAw`3sq(^eQl3sT7)&7vwu? zGV}89sE5OgP*gLk`8h;YiMPmEP+4W;%P&0quJ?$oh#OH`rE_(Whw+wh=ThIVJ*-m^ zWH7VEGA3wOYJK`;(8YOBj@{qD{bV@&xTHAjKq4HuUDZtOjv2pxYxFcia~1DdK=DxE z1N`<5kGqhZV>Hk^pN>b`c@BX{%d?WMS_1`B%6eJ;D~@BfNP zp{D+tS~J3<3<{UkCxK$DOfG^o4_n}>eE}{1!WwKaFeqEBt>2uNp!u6{(ee|8e!xf9 zT5S?!Jzx=$FM%Z#w~q>4WWs((B|1XHA>!Sek|VMz;`8|Bkr9iL8+6Nuey0%i>fkQ- zMWc)IC{*(`?p>ST5ef<*F@#P-?Oh_#ly^&l5~{3&{&oyq67%+h8mU zh%FR1@cLIyeU}IoNfk5OEw-S_zo?D%WZ<%YZs$UazSqB>xt?f=75Skc<0KO1j|Bs! z(SATY7v8G5v^1PcN*G~)>W_-9dRG>k#5TGlAC_m+RrmS)K8a+`S?W!Ew#B~~-8@%n z=N$!zZS#o}yv5`>qbu)iAYbhDIA^|Q)`D{LaX@rF&Qn&>Z1?GxU5rRr_W;Cy3UBNu zA?YS#9psY6bq(f8Vcl@Z274Aq5rPaLLgi4d*H@{G-Fxz^ti*f3HhO} zG~=wbbmv`0_lW0vwY9GgGb^tZckfGGi!ON6EzR^v}H}`mnnb()$jM1`CP{9ClPc zD}qA~SAMH!A{YX#u1xslTd;*!eei5D!QMo2MrmE=xAwE0mhNK#pD!K!m+rn_p_0)S zPfQ@*qTE|+2&26&`78q*NG+B8+xz1!LBL;o&%`uucyZ{wWxIcY92vDWmAFEylGEa0 z4E$O(>$IN_W}`l47IZ?Z+E@jOLWq+ytTdQpvqOxY7%2+Z*i*b za-5bYZ4JHjLr3>7V-SwoZc2IfX^meM<}Ovr@QO@u@-?#P5$ae|rHvRl({Ip!ASDDj zBVO)x!;*DT3yUn*#$GU}07%OkFo66F8c5#?g~&_Zdn{uD`OKV-YdLDFOI^|!WaA$L zx-+rs6bZyyH1^Ua!iMD?!eww?(kM>f;RS13QqKz$N)AG!%pQ%+->Ld zrp0gdGLdp3WSnUzo{2qTWPFuR+aA0@nFY5MnbX?B#Vq;rq#)D_E@UMHf|8s-el;5B zXJTD09cP<+oD*3178xLn*tH1u4Lq=PNfSc2yrNh-hVa9xXS?lIPD8(=Jx$-3MN%~xT;Lp=PFI_sPdEG#=`^{zOs5kY|al`4227>iz1f|A@v zIW&X$W+&%-x>thI=UTk#-}L@wG0Yr(k!=tw+(%Nz+e<9!-^X{U=Sl*HyuxDJ7z9HR z>{XEV1~j9Zp)V^^Fk;YLiDL>P1#d}zA~A&PEoW#Mw^0B zE5(_U`AUP$*JasD8n>4dyXR2iaplzf6D#na6wd~dE$6gpQb%ZyGZIn~^iCA)@HB8r z)Am}5MJ@HHw5rgBN9&~YAu_rp;lb&^N~9ISp!3w@n;Y%CmHQq+5Imz zkC`m}WnpJX1grfrQ>sIc1=G!E-IHnZq&#cF?CZctd)S^GzL#hgSZwr+sbFEqjMu)M z&v|8EPi($?6F6eh&@#cfIY^IREY}Tv!30=ccLWDhM;q7U=*;>2?D;#a=aK3(Zt-9Pa6%IzzHe1i zbsu!cp3*b-hs=McnMZ3cUxudpy_JV$?2Vxdnb$y455XF}U`0hD7K!DG zczrTKu}aRm>opR}V;o7O|Lz!vh-?Ni^Hn&*+&`^IcTpR@&_T=ex6#cxN`>#?$xSnzzJGK)+P;X}J7`rIZ;lGY+qI4ixE3nr?msyW`{20<; zrQ(9~h~$3!{q`8*svd@OGs`HrN1=o_=>q4SzTQ#gj|1vgW)7V~-bday@%W?8IR)CTC1)Nn^b2 z+8K>%1K)w`xJLvQ=UJhWarK~z%c5ZW6&I1zE}I(*%xw2vUwhIrv(5@N(3O?posv;% zF%4n_x7wp8%~pENA}aBXL^JPEC7;vLqL=+%47<%xaMAZYaY`Z+mkPleg_B?K8hR1g zo*}=3(U!~Zwl~4(9rRs_e-O~u^ljXd6#NIIHxHo&H_7=A& znZ1klMziN3k1|OOg;SB3q7J+j;z_$iRWd0Z8F8Gn8zrF1w|bi_DO%Zgok>DM^mR?+ zRnzcet#cNKKLoX|J^01QF{UDEs`Q*2H{1Iuaq-hszZD^PdBdT^% zL`Xb^s=06@fj3(|f8pZgS3~)^M9MEoGEY8Tqd~{38nB>5JK@eA!0SEV2;pVN26kUg zm-#$59ykHl&-$%QyI63atIk(}OM9N_nzW#O9zls<%4&&!J}E5bQd6Rty3jNH&xzGI z8X2Bnzl_NK_pHlPE2E!wYVf8*nMI#FG{i6@DI`ev3*iV)%# z1BU4H+wl*36d3dL`+d_SBN0{A7b?Pr%}4Ju^{eYLB| zDCO5QtfEK83?Q@lOcf0Y|4`F=t5w$6U(ND|UsN{kLu*A+xz@S+B+(}Xib;iU z5pE7v174Tp7;?a3FfZ`Uxo?|@l@lkW#4rD zDeykR%>sRHPJSl(OLbg)iEo&*PN5CZig$AJGmhJ8;*1-#P zy=3d-JS?ufL5#6Yw(L?Q>Tg&9Ge2_~^p)S(0%oj(0)LBlO-3lDnVxpbIV%RgTQtG8 z)zMuum^0R8CY5KSQYFl8dkv>vI9%WwcZv7&KoEBWXn!g_g-&Ytmu}^@sf$)f;C3*q zGWc&rn}0{$f`xwI2xTF|0d*iGNL~Ci{Ga&CdNkZSY|(yc6Jqo~55H^XITF6dzW>|^ zD~GWlK=TV!@nv1BZD3e3pbvCdd4ac-e>U-^Fv-NxF%BY9kF=cJKS zd?+v{qX*=)vCDsbcDYWs>0~a$Ke+(ZR>0KLN1eEd^ZDD;-@DZp5~D6xftmqI=3L=? zhBve#!UI`-6&tb2anF~JNCJdl?W~0+FPccQ>Ex$LV16n^nrj(SpF}o0xvo zC{Y3F;r}tU%k0Y(W7@Z0y#rzK3ivYavszG}j$EVPA(_!~!>~SY*jMT(i5FRuzT8cM z99MG)%vQ-cYhP8(Eq-uNYy@Ac4zGW>IcrI6)nELgbreP&PO#;WYl5c7e^KiqMp!Y% zpeuAxy!Q*M(`?-kok8{M$AfCc zYm*=Swu8+QM3%l?J})UWf=BB?+7>A9!|_iWB8)WVecT&%jEMI9y9ych&thg=jl$n? zr(5^NR;rs@8_}hF@W>Sr`xkr{q?VLud!p84Rs09h)^!dly;|{BDoSr)Vv9H}K02YJ z6!N9l57BZ#6|_*5ip@S^TV+!)l>4SXhidk%($p4hd{9nn@ls?9P{>@CX=#exYc+h^ zyOuoNa?cLF_Aw&SyeEykK351?RhPpIi6zFkE9g2`C9lidP;uW6wxo6Co#4XC%~#ns zRf8$@5l>;WaMXJFNd&Pw9Te@DRQa_7faFs!rraTt6Hj?6$}L1;fqq9_YV~yjT$H^7 zXMCfzjT4)*3Zu0I*LLu4SP-@Um>1V+ce%jHcMMZKprcz%q)4)HyA0>;`&d>xCQrny0TEAPUsl%j`00U|ga9CV?2{1ObH+BPf{4%Cd~R(!Mp${A4v zrKw-R^$J*9j0r_J3kKt0kaR)**?`Z*joqkI3X4^~!1rI2d*T@zzy2y$q)rQsu;f|L zwAit`{plbDlfs@uuTkna_`J?j-9jZ8hV6|zoesAe1Bf{MvRW095Pd%1DxRb@RXv?*g$oCj9_&Q zS3B?1TP}i5mL&USwT<546d@2R1#qps&0#>o83ve_MmpD=u#s}XqtNWXy!dFm##lgr z`VexO>MP?!+M=bS0wy-n5Ov11@bzLMFPvZ#eGn6EA7Z&w^98Y9A5vE3;U&Cek9QOf z6w~)MRDI1G^4-?tgRuYn`}^Z=iE~UN*M>OzV9nipl|lt&9^3^B$sg|sW3sR~URq_5 zdz=0%rut2JtQT0_NK-!f()DK$Ai^{X5Dq@@40cvkCMl3TVmX}57F`qCN|~m%r&!BR zvRtbl%P*8CLv|qjK)HU+l{`5(8r^Zwu^wEOFejA5kW;pXOJEC=tPtITtqfJ4XOu6C za(Ax7P(lQKVYGG<>r>qyDka#}fgW_cgnVJFL3i@fsuVyz7?#=F{d;KTj$SMapKR47 zCHce2_m@6@k6*>I+MC)W$u;}L<+nAac`l7dA;I ziTUfUm=SJx2kEE55YT6U?ZySFv41>DbPIiyAOs1da+;AStG0AGk5f_rK-9}Tho9?> z^Zy*DiS9&{s(j{jShB3KLKV-0M(_Gq=-*hJ9O&h~B-#yd)~}bhWUa);^WX6xlHrd5 z#O=k0x(=8~JDR9zJs!Ds#n5ewqg$)Yx+fy!gM`lhwPs{!;YLUma6AEDAmg z0^?#DjId%U*6DLI3lS@ zM8)q?o&O(OE+T&b8{1fuJi&(orQ$EOF3IpsI)BJbiC#P_W^ z{|!W+R~`l2c-PUf0Pwxco9}h`+r9siLCzb*>(1LieEv+R==wsjrJm>@Vm81DJ5g?w zd17H#h*Hs=C~qw~$P>C?4E}`$91EutI=i*{4+O804F^_2L7&;q-#IO@?!YO2*ydQ3 zdLHh%T28iN*{=&9E=HSm3<`@p4ZW1cWhAjlCE|URKmoG4x8;t82GJM9^5rS;qr#R} z5u*phr`RsfGA}Q}vfIzaMAHJ_YRdnN<{WvUM1ua_%Z?J)+^u~bru&pU)od#9C@!BM>lEPb}02zX?Co)Zt6FjF`{rrqa1rCYfEj*DXa%? zZq4Pu_`9)eah!gM`&SOTeFTSSZndw~&erg#=^i_KUM4wI=rc_i8W%u3f62ZR8+-KA z0{tOxWOX}`4!Z+Whd9`P9WjTe*re-`?=+tfJ}G!$S=H)%;4MjSKa~lZV5{`)|!E(AM+sHT9r38<*!@_NADPK`li0fosZTHQ>1~2!mJ0+=ADY@SG#>4o77%0u zk*gV?tNYr^j*gG&HP5gNn();I)%`a}I=#VZ4|?K(iGzDwtvefmU#BAC|11`Xva&e! z!-4aMr~0i&!~b9%_pVWJyiisooZpnh38v&)Z?B^RnYyrcon;zqQ3@|oI&}^W6r0UfL#_G7Ep&=>d48y3{#x@YV?Or;|20cDf-9k0NBZ$^pl-lRo|@&bkA+3- z?-P+(R~gXhxp0ppsJlQnHRtR0dp&OWOG^BJ=p*Kg#$^xxZ+eG6G`-EwjSxm#8qr}( zXS_pAGMH~fCp(hlP&tVV>R2GgRcM$mKn7{*d0M-CIPN^F;CLL1xU`z%R%L_CyC1_a z**an7%%KRUD`@mYW4(x4mk>(i-r>g>){UZWgfjX8*#OZLVUhg@E45dY@OPYIsluXL zyDf!942SbNe|`D;9yic5^FXlL1y1VTK9l49O|06{oUP_>fkm0LW&@I+@`r6_LJGsrwtx-f zUcAc+%b|90wT*~I4+7P$t{RtB)oTg+2BwWt*Q_vfh8Sdtex6&(>T~>?Oy)>`gah%o zUz&_T2+TWZ2b_FcDW+Qu<3&bvL;(=k{dA2qXQSUPLZ07A9qqg5=tbKaLlYpNVPVX-Z6<4z&DgB-SH-%(ENVDS zZ~24RAUMwA;s{m#WqIu>wxRBAX*t%GI~+31PD2=G?!|k>%r#angz~n9;q*MOVDK;3 z%MJZw9MWVjQP-*DTVZfaR5(=|Aisbjr;k5N(p@CoP15aOK`=V_2|@SzoRV!KQQ)3l zrSfV0BjG?^4=6k_DX#U8P!mPiRZ`gAk4z@Wa@E*91eo46b-qM=5Rq;?CX{s>WV@xb z{=s(rd*fP$m9Dw$Wev;KsO&XPnme}T8tD1M__Jwh$QX}+^i0vzAKgt7OSk?OxDRME zELT6N$prE;$L;p$b9~fGtC2HPSQ=^eOxGf?AGz#hq>x^|(z@DH35!vVHGT|3O;2rz zBBc0}snuMef1q$F)I3?1gnrhA)M=538zTDrHCuuDJn5W|g<I53wTxcVkdW~u!39>zY$H!x zvM0X6io+j1cDG@91?rw~T5V3e&8XP6L<{UM)Wvk)j|>ENdma&{1&PM7h-hg+l`WY!Z z?I;^nja*2!SbLz8Dr!-X?)_8C(I1UVv zi@;djMWTPwhn77wD7PV$F*n&V7tG=G=8KKCUBpBY@0Lu6IiSDD;W`UzJK@DX&{zzTWY&Yt4}7|IV9WWY3MG%u+MY}&Pdn@>(t7r=N z54QgIPBQFcB%3lXTbCHp%YC-3kt5EdmFVWn36j~b#9g?C(x)SbQc!WV#PjGz zW}YiBWn~ilc!hh-eWty;bKpe zU3Ex!GvoikU82evZmEEB?Q0^ffmSsowDZ;_@%50_oUdwyL7_)X_qHVvL@yGfX6&{d zPUG*z&TLdtaUJ1o9bYg~f_pM<6}wNJs;#{$CuO<=hw!Zao#kU|42IjdK4k~%?s`?q zJZk!79K!;C2Z8C_{yvaDrq8}jF;qVM$CvrP&7ng>ftpA!J52S-+y6h@M9^vTDCeCs zx!ve5Q8Re8vm|Mn{SZ~!uXTLUj=c0PO2ec^gK zq|#K8PeA&@WjHnV%UAIWCnBF?`hxrX%*beq+lM%U_n2z)8LTw#;H_!?3a4t(|HZ#N z#PH=Rs__cniDM(oHC_x4;9J23Mh?H2<9w>q5Csr@=7}7G=}ysf+}p0f;Q?ui12^d~ zSKkL?jq2I9+5H>v+Uh1*t%{eAb=|uAjFJDKV0yNTYP zhr9x2#WqB<*fl{2(7ZI;KV*Z$I zvhODL4R&)`!$n+eoG!-iDo7#|#hcQMVj&XKUfgUYMqxI7>(?a&jQrLgDe=0A$L>ST z5_8=H?|gK<dZ5(>igT0(W{4izStxnG>yt@_Kv z%Urs;nFoL3!QdS&-&G;Wp5h%r$+pTJGy{bpRxQ>>bNkWys~XYP{8M#6r6f$5Q8bA{ z?JlIj6zLGrrcQU7E*Y(O6D#NTZ=LIlG2gu$t^;EBemiuG+)++48%faU%E^w-)7gjJ zuDhctzqPpeW2=cY7YI@hEq`cA`eL6%?qknd^e!$ zCUm=?RJpVm(P4@cmHu_E==JxkYevlAhJD`?lJI7XoTZv*A^24ti1x&ho@HgtE4X!& zUqO~ku)U_;MXGHy{V3lQFMACrcJ4VWJn|WjmH)ON<3BU)p$OI$**o~VAlj1HIr{R} zz;D_2aAnP3doyb!CG(@UQHWVPy*wQzzz<(}MgH`Mgr~{msHNnx>ZAB7BPf+hfUhy} zS0Bu!`AJ}o;rE$(A0_`Ej~%vAQFVcJYH2h-S1zY_m3*3%Jld<8PKza-iq5{zf2PFR zLA;wwc2%H=u})G2x5a2i#q&B25YP|5u~$BLL6RnH_j@;9C5RL!Wx{_qCx)c}ky)z( z-6cfDGT;P)93BL-563(AG(R!Eis8%S*DBh}Q^W*T#+#mDb`bl5Z35qb0f@ec(bSK> zaB!aefa;t2%pUdc3bMaF3=YZgaihp&upV_b`wknGYmBND!=@9o6~CT%F#BZmR? zc=%aG@^Hf+2RuhxQuH_3NE97BIQcPoZ$-n!!ekfMHQ|JW9H?#kti8I7Q})5Tf6xnK zSm5i?c|u^(%ePau;z=Cz`!3=$q!nkbT;j*-7E+;&ZC+L5=wZhv!gh0^Q*A*ZI?*XL z7noudk~o`39Dy+EF5pSPswmd)d_~780-4feS9Hbxn}>sPlt)#g3!mQ{I!0Xg z8oA%(3}x};u9SY{gb41K9;SC4bDq(GFPI>aS827<{%q|_ZPsy5Gq!Kq{!yI$A(0vn zekT=bI?iR4I6T?M{ z`S`uaasYLxQsq@;ukbu!!_L8lf{^_YA$DD)0Qj@fUh_w~0%|DurB!K^b5OaAIsiA! z<0?q9{%Zb$he(ktSmxHSJb&ohGYN9;MBgyo0rEct`^1{gQW_0p4DD1%F=}sOl{^aJ zPHdEWge1{ef0#^ty)9aF`kP=aK9;=;cC%3ybfxFF?!!UulBM}x@NEsQX)@whQ+tLE zb>Im5x&?C}toEPCu5Pr4D>>m0*gAWq=7Y)J6>EHF-g{`P-rX8RyhE3wQ79=RU|14Z0s`F*8~tn8UQD^hpe z>3fnYKJkrc3K=TJM(py_Xbw=X(~l^SJ0wjM5vaW|R}gq#M8Z;d4QCca9A2RtEs2h3 zt8-$^nC6(1aSfq4JU+2+eA}ONrit-eEP5e~*OcC<7p(_#v5grnAB=FnQGv!}$$C$A z0@#((1fEkvO+FG$NG4nd`Av z%f@Ojdhv}yP_f#dN+ChSG4`d549oP#i5LNEBagh2WL;^2^MUkp&lk-k1(E@Bwd1gnWcW6o-)cGKB#-(5jL$<;LK2#dY-W?Rtc(>z7sfi*t9>EPx&EH zi1cS=Nhhamkc6lq6v+_|c^5XjlF{T~7L^%!f7ybuExndx212;ySc?~FT8nM0oP9OF z98SS%KCwN($5XOWNv`}#Xs7FNWlxjOlZaz_j9=`j0rT#sITQ~*4INEex;#SyX*b7(ul(uZNJnP zc*pk`!@XhW1!La}%~!MAI8+Q`NFL{|>MOCNdWZ*@Bg<#J#T*0P75cj)^kjHQ zwll5LHE={+x=OdmxUn6kq;AG3>e%tlt&{G+WKZ);hMHWe)?W3#r__#QYcU|?++6|U zpX~OYDR5Ve&TtPsZnJM4wQ>--Z(KL}^YOHtykW+oNM++o0>iMxQQfk<|B@Av`rU)g zIuO$QTuF?E<$uK`x|m9jSlA$XW^G`n#cU`gsahh~2kTY32EM>+-&4=la8WCMR#Rrb z8-}xbhe@0pyaaHkb6hSI*MgOggWj}nOq$-tqY>u~X5Tx*pKY(PX>U@EQ>h+pmX`^U z53L=>J;;{x`+6U-+Z_y&JLagS^_Al<$uVt0`42>*xi+ zmqKB%dKBJ+&rX2UYZGS|9G4KcFG1{S9?^MLF5%owv8Ua%FEM3gu-5VabYET=@og?_ zypON`uPl{!YUCHmqA1k#`sR!O?cmB}j?mN3>jTl31<=M@pYi)io%$OF=UfM=w}HvG zt^K!W(bvl?W-^kl#f}Gu*RXMI@N+Y00sQL0tkx#f$2Bg9u2301Pg9h5Jhs*@8?TgT z`-i(XjVacDRrr!WuC;qR5ovnN9ewp!$m*f)^}jyNHJ9#z))b}Dx$|3c8!p;IA^8r?B&6$WH?#Jqmy z>OsYz3!NMA;F)wM9Da=9jT_~PlpS^Jh1UQJO{)E~DfL&}P2In1&JaNR!Z%*&S}v4= z-4yOI7pBp+@lib2x4HyYv@RjjNep`cON%ZQv1!dhC@Mh^TDi~{hp%O5@X@((NE~bH zL7f2cw6CI9n-mQ#xy&1@29%W@yMLqc5xaK%IY&yKr`UY4wDQN5Yfv9|*PH;@N-T&jlLf<(>_K=Ew_T4o8SDt|cRi2VniD zF{n2+lUwDm`@9F}vTRW;RDzzoBf^lfzZ(uWPiVAU_D2d@*V~XqHkYpEVvOgrVy=x{U*t97D&I%mM-S6y#g zx;O`so}NLfYg$6NAmdAU$v(pTD@3p!_^2-2OB+OR2#nWeK!y+B=X&g-=2xRF!Z`QQ4MV! zy_I5(L_&#epZ~40h2h&P*@_>7-o<-;6A7Dq1Z&m0)>3+L?eB%*Bwr0uozO`EXtZ!~nV`(&S228W;+zTTq1khsDWcgvi#_eD!(O%&jr-hutrcHT~h z7QXpMY<_yb=V=?*V?oD6xxQ+-Rd#?&deI|gXtKS~*3dB62%c_!B#)&7yXiU^&P3KR z;eK3)il}+lE&tzz{{_hLLq855;nzp%fqvZF-V2P%{(0LcF`pc)Rk}eO5;82p{WUDM=^<<2t8HB(M8i;oX-x{tdEE)O5=RCb$6CSXR}uLtFy-KVd|Zhx5OZlsJ8!_gp?#+V`tThJZ}{ zR%)syU4+33GS@btt)hRco|ZnVq=R1O#$A3w8Qga8XajQ)t4ZxuIm55wzR$}8cF$$f zFNmamMX^-ke67hgD$Xq}ofjN(!9gO_E&g1h#-YkSv6D*Z9Wjp|Buy*d=-|Iia1XX4 z{4Dw#b@rqEPJbsw?QnIQRlCu==IMm!F0bX7z5ms^z9?IoAfK=lk0D4Y{uzIm0F5j}&i`k5$j*?RgbE!a$%Sw~ z>f*j){uG+kI4d=Gch`daO-Z++U8iSaAOP#|RW!l0P3bAI6}0$`ncT{~YQ%Uy@kNbqvd{6akuutJEwWzJt}4 z5MwhFx^fjCHDT;z8XEK1Ee#V@_J{h&lvN@1B8(oB6W=6+32(8$#QO=FU)gBAjuG8B zy~-Ym29%yTn@MM{E^4Q)+4$q(W=cDSB0#-*soTQ;)JYs(kmivX*G%%#pBuu#{$`{T zbA+GDz-88W=n354{vZoekpf{4WqfSXwyU@99E!CV=+LzcO)qqV`>U_kFfDjbNXoZa z{o6Yd!z{Y*&DlhRIWNs?6f*hL(o5FFwu?j9&gm8U+WmGS1YoOgVTK2Bg|1Irh z|5ikGbTluCmu4Wz0bOriNfc(2r+7zj91NS-gIjsHDZ+;RO zyw|7T>^TqcRfuv2AnWM;LC@oe-f;bKyh6R(0Enhe?B8il_FI5Irkin@$diG%EvVRD zSF0vy>fYJD^UO^<8L@lkl+=vneej20au%tE{#aCKNJ9;`@_T*W&O7HX zWD_VMci5Y8*(0nDYhMJ%`!fo?vPghaXfpd{g-8SHyUYomF!gDB&X0dZ)W}QeOV=mMdTGXr~F** zO)~vNvicMA(;ULX@f5AIQIWX?+p~LznIBhYRv)6o(|ay2|054%2;#R_wGl(3XGmqO z@z@x{KAYZ={!l5SM}Ga;jo>}{!H1yyGx7OLUb1B$DveXG6?<_tO3BSGUiADfOymw+ z4&6__aVzr=X1VlY>e{iT?OiHA^u1JN{hggN1uDmKk9Wmkvb=X;@aFX$M73dr_9)ihl@@()oC6h6{UsU+weqZLakUr_L3AqjjA$CM}Zd|MHE|*3eg^H6e z|09#%OlzGFJPPu76(a42-F<<|^ z`-n@EV^;2Di*PDH(R!%yzsmLh%_Q7_M|_Af`Y#Oqf83A%O)FH1{x35k^j7~qc(!d7 zH-f*p)qUqUoy4SWa-NqqcC~K6P-B1hu;-xD$ngX4{RYR#>%cz1{|!98HDNChbhKI+ zX~qFHfuTatRQ?g;c)*rbfm@i(F-;yTm8%LJ4YsnBxxB!#*V!@h|6eO#kUEKZxo&LV zcCgng$eMqaP^fK$!x8F5&a2r0II~nOGJRFCjgXFi`2G`5g!tnsDnb-M;6RIeK{38B z!WaPC63UoKd{tGS9;|dlV5_q!-6YqVF)(YJ63nV(Jx-@+E~t;Jb6_PIQp%l$=@>`+ zGwl(1ZH7jZ_2Kbwn{9XJ{cj*5#n$sjE8f;tFJ|Il#w=S?icU3FM3|a5o*zskkH0&- z79tLn%3*?pDt2=gq=4iF?jqwhSCjjxt8Hka2K4jU(Ro`)?3B4?Hd@QNEh*u}7?EDu z;;j8W{s7musgtg>Bt+18)#{6yB5W!Y-yj3=uejP#$h;034@M*5^w+gRDwpR`oW7hb z){T+1p5I$^1xX$QIVT@1)ZyHQZNH##&~W0$eR=hgXu!8cxFfDUl9>WpseIpyCk|g- z6f< zC;r^3A!;e*Km1zCVjF^NQc}XJ!Tg~l&ZD;FtD!a8Y=iW6ag*Yu;e`ltitDhO*q(`~ zg3r?$uVm_}Sw|;B8zA7I8}%5$Zj~F^&u)42G?O2 zS^Ese5s7s6RRr3pypB9yI7esz3*-yOm}6`pmj35w(VJkDu=Y+M6xyHFWSjG*{aE8|xE%SgSD@;m z8_hxNo^EaxH%!=c)?SV(_{ceiB!$%^AXcLPuv)quuHg}9rsccY!8*JhZt(h}3$6X- zd;r4S(b^?@H08+ZwKoqX2-Uz-p0N~4%6abK1Zm^r_3)iE`8`Q*l-+?t!35aw z1R1jo2{kOaCCEzd_HRr|*jdzrX_1OVeP~0Jtq`2Y2PcB4F0KY%KcbW?+v5wgkD`R2 z&HD?pRjJ)D7y?S_my7RPek%fap{`?r&9lc8wflr*iEp@5AI|%1PtM^Mo_a4oXRLoT zTSPROe}ZgAyrWnJd>3g>rhW7(4b9NBkGO_SxU@i|NkjfafQ)^)sY{LgvX!qkN$%8^ zxQ4y27Q@knC%yI4nyfLENKHV@Yt%zb+YA2XT{EzdOCGD+_~K=0135-rv+g1{*|w#b zd{?gP7oLFIL2As5!)nWTxb+Hg#@!f7IGXFDTtGoLOv_FAnPu4Mg7)@J+Oqx)Iy5vr z>HT#(xD{OLpa}!U#>Z@gGODLFZLO1~IbMqisCxI10XLID3Zy=1?vI(`_bs=J@82j| zwvoi$otcT1I|>4YsfQhK?O+hClPg^|$A^D1#~)X-y_w$JY)=`#TV0n{n-D)% z9n$4}L1!8w{LEy#1sV?}3-`E)YS?SG{vn`}_}+{(nDod|H3p~1Q?z{we~nme)D@9~ z9BVbkkoku%Vmk(zY(2o1a9F|1|5qIn`nRWF_;Un|`DT+H^2xW9-Jy{!SV^O)4bavR+ZuAGTv? znBV8}{J30+KO0(2^tZrrXd8|feXssSoY?pKgg0EL)ny%uZ&Dj&d@L~zw*%+GlKNAo z82+59>kcBSBG?XFFkW*llpEn+i}GOPin4r9WEpZ+PC>aoJy zE1+&!x)#P{Le==O6WzE1eP0v%`d9rwct;i)R9Okm4bH!Wg9CP~V+M-iejnslez6{l zcP4#sX?Pm@dp2FIu||RateMx5G#NI-4+*z=QGPd3(k{Q2#mo!*y7a50+2lT=5uH)- zk+_VPuOkJJkV_*OIv!+ey1R4?e#U6^!IjcYRwKO5jaqT_*2#bVWd9FXS;|M}TooXY zB0!DS#53wDWEXFU5S05*Dx@U)h_v|M0{@?jFyLkV+TH)j0wA^vBaS@5%p(7nZ(*W) z>_x2Qv5?aZKY|VMo_5vQw@?u}X~oNWURG|HEOr!8sNYU`+XnFU{O~~zA(cs^Wg(RT z6Vl!6bYRq(`Fgq(TZu2PBr0)x3hjLYS%j!SFth1BDrI2QNEXk&x4yi&p@+EIDTk;m zw>7)Z-oZCHTzv}(3gX(F><%;K1Q4y9Wp1hmFLgoTi-d!wD-IwUxDAzWm5Y$iySpPC z=W=7zRnV9#K8pjQsA_AyPgwEujgSwgJ#dlzBcBnL^A}_CPvQa51vKR|#dfj}0xivh zfTq(5`04%ep;Gxn`r)!9y<-s?IdA!q3&eEY);Kw#yR2fH_At@n_#ow^SaYp6mOIHG z0upqYU*n03JRkn}UgRS0jDE&gQ7c`!&0457cIdKz)wz53zLNcAm!VrT!fVI>y^WWCEbgd!@IsccF zya_OLd{pi0f%};PZp3(l?{u(>TNE23ZzJ)Li?-59dRoxPH`-Ve0rf{ruD*QU4q=ZY{gz zuqP8^`Aq5G``sUbB-FRu+pJ|z-Hmx?ZqDXFFwSBa&7ubJ)l(gRDbS-b zcubmIef^f1wO@FB!&D=gSCbks@y@C-k)n+^FO?rYDX*O!cB7ECq%Ef08tlH8LNkS5 zaKbuw3pBlR*8f9SdrZP;FV6p$k^Y~c$0p8p_pIp4(*7aF>vj*x%R2cp6>kIfj8ML6-19~T&n2(_Z&_9x=8PK ziomwIbU5*^3Oc+^OAP1TS7h?|1@H38GLaVf*xmp_H`Lue0+HI*+f*Xa%Cbphxg3PO zonvz~V)vn3Qv|TpdyOe!FjH97CXZvy?n6x2Jh$VTn^G%*HYRDlvq$FY?JrR%)(BSO z;~_7u66y^T<*rW|B^~zbhtC#Vx|fjf!F2MIt6|NS5#py|e_orKp`GRE7-kxrbdmTv z(;byd#bC9={f5WHO;TUFcy1Xea$Gd9Dz_ce$l~`wfXzReA5>++X6|GWp%ESn$~?ai z^&Rx$zFzIx@g%=&S6UQFJT%A+bVLLE{I5)biu1sA?PlLx<%Ez9TW&{cRr?yp>o|GL zhoifBIKYXg+IybJ&1mTbwKDF^QVX^}ucpN;tVy!S-u~%m7BWvjX*)%U;A~a{UPGh*o#Md*BP%q)<7PAOm zPPskYj#$|zW~#0&HU@O&pg8z!RW|~W|A(uy3X3D`mNo7g+yex6*8stt5InfMyF+ky zcXtU8+&$P}K?eqBaF;<3`}y~gefqX9y05xx)mN+D3(!vpYqvf^XZl+w6KKtEZ=}(f zgE>bHNGj#6d$AX2RBH%N+!l}&vBbb9vpo|>6>{-Qvxjvv!?*Rs;U|@@Y)!#Bcia1z zMX#;MCSLDk1EhVD0-_^)<}!Y;M;F+Q8b0ZG_FqwJe776l+tWo*H3$dxz=z+Pg;^dA zVxzNED)TI5?#b)(3yt9KYDU*L4_RiWh>gn2ZVj!L z3}JRn(XbqDGWIVeA+h0P<(EIwMYn81URWKDFfDN4441cgh3W?JLUA;Ar`@tOz1{Tk zK2X=`_xEVY9#iF4!(Zi_oB#u`j#Blv@~rsisQtcm;u|ut{g@CE+HaRNTy@Jcrof0D z(XIDHzBl~{kK{+qkEvDH*sCvzV*Evjjw&D2+TG(yyM)AqI2g?L=ef)d?@>hCm^Lt5 z`X|w}gy{Rr)NRgBode+BV%rMAoQn4Xh-QN1Fqg44p^4iEnV#0Eix5N?;n&>0x~_EF z3#p$`_Qru(kX?6Fgpv+W?3xF(-9dwd0ur9}Yx{Qfj+|miIwdu(gk~+VrRb~n$=(|PAt^PuK8NRbIgxSH9@Ha)6VVqZv-uj4ye+U*7 z?i|+^nR&UbY&8%X=-hW^Nz`_>GrQTo8NQnnrUGfFduoa$Z(_5?)%pi}RIb=~pU0@(L?*e>NbB6uxMP(V*x~uDgi*|D`htZrVnPt|I#VPKj}ykxG0(PTrQWS)qXfII)}+nwk0hd|MMW$;tb5Y7qo ziIf@0gnZg8=Eq_A1+=$dq2c}up%o40R2&l^m%4&v?|JzikwuAIE}DI$NZ%mK8CmXi zUQrAv7SG<}jE#SZFt}})OP28SOYitVQp1$0`Q|3X6GqGf&*$&EEl5ro>T3uJi(xDG(PM#t^DLo z=K&k@(P4Y9yGyc9;H?VDedzCmW~icAVd3`14Fhl#_{>0Kkslw$)iKg6K^HLoO&ioq z1(4C{@C}*DBBe;kAIINSEPb;<+coZ-PWdQbSd*1szmB_^CR%WIh;F+#C^YgopB^9A z1ztykvPqKQ8>I@45{BmwZYdk(Z4=>Y?T~%%235O9Ir1+JpP{l>R-hiT(nEB%nAwl-0=A<4tk5bBX6^gYBYjx zWF23Q7I+4Y;BH|D2ATRT1J0Vdb9za03noa;&3<1K;P1>OUN38Yg9q@*nj!i95HXm4 z*S+w!VGjEAC3;6@lX-?O{B?Poau->U4b!6CtY<&fJ?*Q()q+jtL5(Bgzcx(8+*T~_ zSW*q07pySNw2=g&kVqjm6fmRCS~zpViJpo+=U~7vte%b1I4`pQtS)ExJ>m>0R1r*P zbOqx~O(JugI&&JwnXNF?!TcZGH3&RN^JDT9e+Y9-os|>(wcbmp<0$wyhO>F?qY8vP z)h(_zMH$lQo|nMetwc!cugOr9q5{6ecQgNW(YsrBOSc61xvNUvbAW%V)nFhc@I(_0 zZV>n^A?5136%s-{QU0{)|73)Sajl=-29)jt7(*S|Ch=^_pJ&l0`KFh+tw-qyT5GR0 zVm4H+qS1xaj;q7ZTE(fvVw}h+MLXyD2@bM z+xWY*brBs~%6yeaTM&Pb7ecKS`t+CNxajkjY+B5ZeS0-y8hluaAGi+H!@WTHxL6$i9 z=3$t{DtOO!qWaMnbq9SWxq{(B=(_|)Xe8B-pIqdlw}p`h)*C?v6NjqT5dZ-s=uIK= zM3tqkTl+;RylF$%!Xew#84bzhk9NZ$ayv_{OToL4?J*wVHlHP6h#M};2>(Q)phI78 z)YO(=&MrEl2B}@X$XB3nVEr}ZgF&soe?tHas)u>HIs9M_0fPc+Nw=I}#(b^^oVAyN zligPMc>$8GaT0q@6iwX-g5 z`mWun5|1iWG!k1^gt~ZuBnrlon{=4Yn=g!o6(4+7;`e7I?2dA~-MG9bgNdVf37c9L zK#e?+;ZyXI`PVTnZfl#PC%x6Q%^AbbS3%sKRi0P{2U_0d>IEt;b z8r>7vzDgvn6Uo!;SOWb=s{1)%v|}yAaADHmTbKF$=x5neXM3cv!tMZ$3x?_92mBm| zUc9=R*ilv7XTUdaP(jNkpx;7o{?nnf&_)IDC>g~;eFT<{A@qK= z=&+$C$sy7)+B6-@bZ}g8z8N}47)ydb>V3`DGuPC83bOl2SYyK2R^^r+X2vJ8Vz}aX zNmo~-wJGd8%WGPMtC)Hom2@1CW@1U5R24Eper^>-@pI-w8<&m)Wa;@I=fwI_uuec9B^ zNAIxvEEbV?T`Rn20q2MYr)4lGKM;)GyZ!^8z<}8HW?;puzkJA5WzQ1!2k&q@L-=z0 z!lZN*itFw#w1jt(MO($ef>xsot?JwYR!GW+NMzt()J`?530Jn_|!I=CNX}q+)ph44VpD(p8g}&GI{W7odq}i_dU4&~D z(=wE=2x4*tidsE5-&Qj!e~z|xl=5{Gy(l(o9x(7p&qS+~Cc8M->X@in_$ZhdFQC=NC{7hly)?U~wgL<9(Xk2L5kW=2 zKROp@HvadOlOHtcX5|IiChuHWA)q8F$G^u@M=ZzZ@kRQ)la@fSbeZB#>>u6M`1U`S zx*z{(;#EPjn!+1_n?LMj{&fup&*6e4If$!nOiNYE%tHyuV#Dm{4L*J!$q578_k5ob zN2gysV2p~?yAKjcH|fsALZo>ox3-?3L6b$a%+icm#U${}2a2wz;a zx!uPmol9Dw(73>Nx%mfLQY1-CRO~}NK^XJOD(_O+@JmNTnj((xJ$W5WHU1z6P2tH=pMVF-?jE5i4-kAnNy1#8@uIF*mFK{nNF$F%UWcw+ z-OL9FixSbMRx=b}8skFJdTXowY9Z7}gL}&3_Iczikd&H{sk#Ra(K0W+ zszac{(S+;vyE?G=RFyBjs`QMHlWCLF?5NP3U$G75yg%Q-{2SZ_}R2UxE@EM*bSM5jmK;-0vW(G(-}_g7Y6@%-N5;8gGcK2F7@w(ZLT4}qP4##RWLk!?xZ+S?QPqQxJrnI*av+Pg`aR-z8Upg-*{_2A}j~v z^VT+!G7|*7r1uDvkX|X|J#^(bdOB{n-SnXNY>vukAR#aLU>-quwT(yu>4txqhd6popzm zE7-ot0-ZQwzoS|e%D5g=bM;a`zP=r_F0BbsHF2J(Fa51<)*N1YGk0*XICnU=W#RLD zRwJ*eHGSj0&9Y&<2q{f`nWrWGRKt3wB}qrKK~d6^+?eS9O4)b_CW7);1NF*=~+V3-wo%CpC4aYpt-@ofTeB_E?`t-!W6C&a-OLE zH>;NukE?(no3c|@v=-SyUo^rKg_0oW9GwvwH_r3W^c9WTe|vEF8dB@UxY{ z{@0DLSl$(F^cy>xv}8qLk|A0SweQg%gTpRm_5F?6v$=zV_^07%>q?cn@<;*VD=^LpHN8FuH(4-x;{0K2`+ z?hlweXOoq_a5gr7q2!vqL}#&vvUfaJT@2OC2A6CRV$&N}P&a>EqzyR&+n3CR@ zuG8U0vzHj)4D)vhCJ{a1zD12%{EG^c-Cruw}!SO$D@)+&gT5DxW zu*%+Fgsh4V8R<8dc=@YkNopX6iYuJziNTu|E-mUtb z-=Vn$%oRPVl}h_caf*i|H0KavW{14CG83J@?F#TAHrBuPet-EPS@q4SvWq*mI}W;9 z8f+eUZr!oDoFA^d_Lcp$d$W^AQq|&b#&=OTN3_73Rp z%7I}jcWwS&lU)h1u1h3>&`?h?7fPLmlAjq`)`~-&bVcV?MUfR8pVH@^GrY?ur=GPc zw6crFzCUwxZI5D2rH|R`ftA@QO@HZ<^RV8x*6BXCJ@#BIrWHQa|B(EA;BiM=Tnu5U z6({Ud$PqZH7AA|f-B!_$Iv5*$_-l}0o$=1l>K*jff5aFW=Z+#GW$`{Fvmu_~|EYzT zjUoYOQswLK7c^=&6|o14fQtOz@6h`GW37o7TmhISu|t`U19Ig43STV?CjI6Xetj^; zbwk_^qmPN4H;nXs!mgZ2EZ3G@1qCaNYzci2%ZE4;!)%{Q;BN{LbP(>GlCD?W;PMV1 zC=15O7au0FT~gCp_Ta4dr8{3z2Rx>KV-Rtf1jRFBsU8osvKg)t!VcXi#Lj)i+d${! zK97SIykLLTWK>yCQ8R0aJ8iRL$0w)cCBZXnt50JkOvLn8t&u3mG&}iRW{hSH~|kVoOP5f6YAUwlS4K94&w@mE!z@g%h*tP% za%&{}bhA8>ZvpmDYTVh((=*to1^IsG*1Ly?x@dg~e3rLbyYcp*ES%sakC=hhib+G~ z;_lG{;ylCKzlVe+WBoY--}5+?MJHDf-qq<>i!^@Ov+a`m|LrY+gbRjyhU+hbGvpqWu(!t&?Xq(kJx&q)I2YqQk0kfP0)#Nnvt z4K3Gqhf1Eiv6TKMMzZ^PT&f#^$@=*G+b`wb?!v&#fS*!v_1 za+vd8L@B7HECL`=f(3T-Ul2UY-RSpbT}_$9)<6kgX)CUAdz1M;IC+Zo0#!NNbZa1ass*0M#Vha%&EVIvXQlq*Rh721YKUtK~g3;IQTtRs*uct zTB?UoviKb2yjA}Kc)b9#IMRWqz3D>uaCry6g zVQOtftaq1xPU+{zk6GLyC0KW&Xx2^)qrpL+|Lb3{kfW!q8)K^9zaxjqr$Yz@xXg1V z>&D!QqwJ*HT;QE-|F)8o8?c=eNUXQw#WbC8+x7?CFBKtxw?Ve6JN{MBKQCibU^UD5}x?fD+Rwj`Cgb9R{iX?=QK%ZK;{ui5kRD(jkk^fcf{#((#Ymd*rhZ7az~5&$c%$yD&Jk306#G^nt#(d;vHp=AiiwB1;Bqd*ENb9d0VWjD9|n@`5Vd^2xg*Q!hJi5PhtP; zAs=Cv7(%rR7lMvzB!I_&da7r3va`y0jb*Tyo<;>;F&ASKm7v&V*tGFOYw15wDt9TH zmU5i2&h;cpH!*&?6`ibuVd9~ir~0A~9W#`)5KBCn=rHAX_H^d>CsKtp%wT0$r7&a( z*MTtz)$$s#_lQ1m!;oH;y`vOUF|{v}C;$hJcwapn^O2`On<;QNFmx-=e9AmQQ=MLl zbKe*LMm<%7%MiYxs9?P1P?}@F9S%w@Hvo1L>DPs`QcEA=Y1ePS-7R@#J`{FW_n&9D zapFJnTXdhH4-F0KCfDre(fJg|zV3U77?Zj(7Ugqj0| zT-2BfY{NO8%&`7)#hVGyX>i9w@!)R*a@)iq=&&Il`LYm)6)uVM?A>1x&Ob_=!iQ6H zej8@zVQ#e+WxM&#o5W)7wW0Hyu#fT6rvSH61=x#m#-u&A&PHzd=!gZp1WR(<(*~je zN?8&71`07Q7*U~hZHX*uBbj}p?usTX-NLb+6VLiTJ6s74aPfCo=w)wD^inHJnC;?csPALZ|&?YUA}{$e~|2s@q~P2|QHMTr%oW0=rnBG4>lW z9m}T8tuW_T{n%9}{k;8V zwBk_?c%H@x*|hE;}-XybO`z0C`U&_2iyop=2+^2v%NcYij$e!^z}S+ zeIexoA9%ZOfs4QV=u40^e|~Ad{&I6IlbvEk76*6ZnucSBcLnx@&g>4QEZl=-cV6-+ zFaaM`5*O9TaBEhZ__vAse#ynrS~nWv{ZelPbwOV(ywo>5WnQKjgIm|w=`*}79lrXA zLU(cLg)w+J&6Hp!{3tvd{!fLtc9dNW7q>WGEuBMoeeStDoV|c9H&h&4+c98RIQ6$sZtuV0FAf_@Ew$ zyCk}?qbAM*v=s9W*K+Fo8|^PO^n>b$@|whcZDZ4fVMnpjI`YLAO^zWR;T^xfLJo1& zC-ofP1o)+Ga%-;)(Y#9GU%&5uAIJg4X;QNC&FiNsiJ$y#*c9MW9Qlk9$kMha~_0FgQ+()(m4cQbkz6ko#E!C&E#l%3N4S3$Wp+GR&PML zUlHTcFJ60-SM1$4l^1gBx?Z5;gQZzTZ`@cw)Z(I8r9v07fen7Z*C>Ozy;4W!ZhJ%? zO(xV!tDrnyaa#06CqKjj&)yjUStc^2f{;oHr}phrO2Ku{w|@jleEZt@czQ3Cd~lY} zETyxKA-@E(X}pm`8e+fxeg^<6j|E4;rKoh>NT#@1BE{brJ(b0m!3!y~JmL@j>?9@H z`5iylo+LTfyuB4RlP6gIdb4o?vjN|EjX`0VeAjUH$8Ozyefx{|EsoAGTYM;Y1JE~I zhB$lN_f-v0DX2y#rR?z_`QI0*w}@awp&}PLtxd|)VJt#)m8PC*VB_Z+y;hQ=;Xh|s zCG~aFh_P(A$LoY!KgReR(4cAEN6@DZhi&%Z-u2PbabD8DiT+0Gc}s72RS-#kE9O|0 z>6OlWISL6&+S>wcPmdQ&;PJ{cvgFu(msn4lo(fL$JQ$t8Q$A{L-OxSQyca4n2mM33 zKK)pt+i50vRI$#u72T}ZD1NSoD7*OiULE zvgH?1{sutc-I#p3+KU(}c{D-GOUhtF7SjBWQSXm|hUvP45w z`K4O#(3{65I76o`$S#2hV245bhw)sL?xo-}{Sa03{f2t}B9e_#y-4kHVx@0LTfR%_h6eB9*de;PKO0q8xcv?Ll$1_ zx5eGnTUbar2FFXEF&FhA5c5O!9Bx6OGU?AKaL1+*m@LJAckj>E%QX{fAj?bto!tQb-?v88C>mzqSIFr?42N>P7J=O0#-0rnYY&+S$Q`d zdpq{JLg)$s2w?LSCEdaTb3GE*EeA`+(kZesxTax>js=mG8yHx(rw0K9FdHVj7|0|j z03Y_2E%0LhU=kFlg8*(YNDPM-Z0Y3q)lDBUoAnkr)&>$%wmeL|=gXZJIgjDn<-S!| z8%pyT)xeo z;{D|PN2)1=$<<@6?IPO5PZ=~3E*P+04uG%#(P1W_HY`ylF#RV+yN>6tnV6dmd==Hr z0?OLzCl-qSy`Cxb|IDejOf+qOelkVLxa*$kxP?uTAHxIYIFVu>W433PzU3~Mi+rQF zCi?3wbp#RrEcjDplvQ=FBiA`%iT@S(=$}K_=KJ!!-3L3l;r}Z056#|1^Svgdm&76L zzZCrc5blqXG?zOU@2dxUm~Y$7iyefUDaFgSY5f2l7~oB!%li|AS-?>Cr5!|*-%zUz zd2Y@p9E&yZzr-4K>_pCxHA+w}MbIYe#VvW?i(F<>cR(>@7~Z;y^mZb^?C!$iD|;PR zWyE~@N@f{@-APvo$Ht!~hIcF_U?TfX^>6qp8FeDfB3*g5o?xASO8P4-t=J{*L;-f+rEF9{rBu&r=yX;1C zO!}jE4&sl~0C!m5WO9f1@!<;DNoSZat6UEd(C@zK{GF(BxOqM_&!uR8PVHi;C;*Xy zep~IuODP0EAy%$u-*#R`VrJ@u3gIWT&r*i(FiT#qm$y7pz6DF!Zn93e&jpR{@G<`s z5bQ28h@_iYn6nFH6`yYe=AHA1^zD4PJ<0Xs5?O5iysv5MhQ0|YyvSomh0%xG-O)#1 zwGHNUyEf)AG@usDBs59y#Lw<_Z}G2qHP&gAR6pfpiP_`IU?5zW4;;r*9l?vy>QEa; z$m&)@hf;I@x6gxdgTMLt=S%6Z)FaLQ3ITS-UWa8CgCAniPrrZ8=u=gbK#G}*Y9Qo-XiT@42C-fzG?+NMqZTMya!te z{~HzAWxJ0498s`Ros!NEC#1&3# zU4TPZp9dHzp~7lI#fTAk{i7HLo)42_q#BG6m_N_7WLLqyTM}lra8-TUK#nmK*tXt0 z4b@{D{t?X}?empKpU+=QuvE#+bS^zvA%BJunQ};~lJ%#XY6W{4ogVYgT}(O>4vdlZ zFR!2h>(sF=&8PM~qm9zAkmY@W)W&v}mCI|Yc&0yuc{7qLLPhz?xi>Q{%%9_Ozaa@D{~0fAGp?m>@^nH3 z1m%3npg%=5NZ?ezP3fb6(Z%f*8tYOk_+m^q|1$lkJV>lfbJ?8Mzu>x`wE+-!}G?9U%)GkJ@!O%?2}cV74q2bzTsB!9qu2-VdY_`RFbHMja9Dh$*fqL#zu&X5Ppu? z4Hv4=eFEk;`FXGj{Op^d>Uqg4CB&?9-Zth4Ao;UpGh=E-JqsEf6f$(35jYp}OK6G} zm+t=KsQUV{5*zBVU&1OYihy8>xXnH?AX|w>!7bU>u{~@T`?A1y4iKZfxTQv;=A-M* zQL6|#**2ca;6alFks9y$ZL!FuLsO3MV$YVYRQqebK_L)&EkwlP@6?6Lda)Ds&FND- z;#d}e+>yC1!LdRY8VCu*dUvE73rZ(h@YPq+np4ZVt(1KH!z2txp}YYdsn|1aCq%fZ z>_|!9MCIm$7$TbJ=_<@5B+w+CCXqG-OVD9STaFdoO6jfEx&eb$G#5RKN5Dl}`&`*| z3wYy#ep1p>`?hYJ-7LUiB2%or-+P*;5n-KGZL;O30*PYVvV|Wp1_JRQkA0=}Cc$S6 zHL*n+yTX_idXK>^)b4E{tmR8;*)@8_fx#n*-SFyp#Vx(vjeKmqd1|iR8ybypjCEzJ zuY&0J(&ak67y@UecNeBnyxgL;O$R=$ z*mb_#rlaS-Ldxjwr1Nj|rq~cF*P(F(k0YL!B^sL5AZFD!G-NTGHP!yobzR1f4V()? ztD7m3UD~JXbW6iAS?dL!+N*NuimK&3f-5lK8-uj7rXee=OWe4BzBIuz1|Q#d!t*lw zy=N%zaSEak(cR9`gWdRT0dY63?kQKR#Ry^7bpjTELPtwd+USaOmulWcc?O=lYB zp(Jr}`hdlBLgtNZi7SD7pTAu0;sVg{*laU*MhI;-j{untZ!?K8EUcb8HE9;AwWp=1 zxN2SP4_kB@C;8U;JyBA2UbpPX@N9X{dEU{imkNYKyrO5Z%kmbAJ41xg=Y>pm{+7v3 zT{ZX8^NpJagiI)a>-PFn@#M<ZHG@&GsXl{k-r|4mJ0CK%oD zX0s1%j)$sjvp7ZCdS|OO{pCc#FzlsH@U%t0?PiLbbc*-nA3a_@( zx|jtLYnvd^?{a-ePuUtB=z#l+^xI4lp2c+Cr1s0ph_^DcCoB9H(2sM0-_Nu+?(V@# zYuHTEV0wZ5ssci%EakjeJYf4^Z`Q)ZT*99Y&Agy|&%hvEzs;Pv`;B&OSo^W6SdH1k zmGb)fh2%L`LYqS~hq%lR%sJ%v4C2r0oItQ((4W`r$#U%sZ~?9Id~54p3{_SAm?Yf{6{=5ymHsXjz$zknVEl6E_mRGX)sW zG=uP1I%}SZB9A{wJaw*BgS-X|im>DVJ@WYCb#uLs9KKP(A-RmS;jED*qznNj#!;@& zU!1K^PV*V|{jHDJJ%pOTPxTAM1p)x|!>;dA7V`Z&Tk zINist$fa-)dEbF6xoIZM?|bV3@DdmM!aPj^0H(~2IV}{CK<^Oyc0P*0=L3(MgLM+L z{RU@_^uUnc!lU4#yI%nrN|<)8D02qlzC$Oz(Y>dJ`cicij4Y{RIrv`;QApa*POmEL zqkxduvyMFn(6mJecre#z69L?dSoEV)UpFva$2B+`XC?k0PEVB&??O@B7}5p@_gS}_ z(VkKj-galOqJHZh2AuDBh=^$cAc^4f10Zn7<-{69W-KpRaX zanZZO^83W=|8&07gDMINUN-`}S9{+|EITgUz@jfBeSy6GN*{k_*W`Y?$Pd>W^agsr z#kS>;d4eLFwknRdvB#qd5182bC8PdFnyDu}@d<DUmDd)@&&=CFq1OWm+#;~qkCEL7Js{Zfg|)VQf3vCS zbVhAe8|YkG0MmrTJkj;29DuryB3eugR}rgf;L&q9)Er}_7xX!Q0(CVQx~*joB{>$p z_|xl_PwDQL;{A>cWdw6NS<~9sm_#o+LCcoB5|O=`vQ{?2PxN|M*J_s`^-?}*oO^XI zw9$-#l5~F8%$Hv}jG{YXe$L~)i?KI`y)c@N(|TPcu-$5)84I(bFoZ-sW!6(Z-C=)} zU0)hFnUJ-pxU1i#E)+H;7UIW_Yd%Gyn)K(u7qZ$I1&5&is@K7q+ZDB4)=AurB0paN zP?Z}`u}=Mw2A|_M6bMz+HOpFaicnOPkchHacwX(aHzW0TM7YfT>%uiPk!3=FO|RU? zyj1&|rKJs7An`t-K#Dz?Xh6xDXVj%;PlzOdjOWxq?bhWxlGkrfNfFH@1wRIeib6$O zqLMd(dmAoY=c9jc#QCO+Iji{?C3}6xoYiT?)AbGsDj*YK6qaHU)_9kE6iuzR|LxWp z!v@dW$9-9$u%3&rmF&=!Tn@ixDRo&ztC;i44=Xt4>DRj))KfwGvDr*yvic3x??uR$ zj>yg{(%kNV(EX9g28xkaAQkIox6knW(0xt|S6FS!Jbr{DjIt^1pAmuMZ*uGT_7msS zB?xTap{%;xOR)6$BkN;hC==PO*M}=e8WEVz@()`iK80ZFrH`#K2gKI+Rq5|2xfbP? z`Orjjp0KIjBzQxb+4d#5m1l4(+_=?J&NEBK2ijqw9|*bAIDVOatk0L%BlXNR4Df(I ziBITBrlcfti_;~rv%0w@mB$R#vwy!V{X`IF?ur-t$&3(5zMcahoUT@J=<_9EWFRK6 zNR%dvqpi>2fGK|hzRDJO$mAVG(ofCrgwLyR)l{o$V&ZbmL}ccF_%oEw4+aZ-iShD) zTpC-^nAJ!Df^+xlBI}b8SEEj-O-1Ck1+zc@cd!(>u07Nr7;FI&dEv?*}uj9uq>QSihrdQbKBfe0$xWU*Cst5Wrfwx4G+T@B&0D@CU?h!d@l? z!s1%fJux1$QXV=;sH#LK1A>Mlx+4jeZMeXz6~A ziJmBf3+Gw3WX_Bg;jJ>HIc@tJgK2=ui=_|Ek?)^>j06hyqK*nP&%*^7T#Zxfpt!GvTG`@?K?_2n< z9x=usp1WiZD3_B5d{bQXmt(i@aj1NR6_?Dv2Bv97Lx^|vT|u*k6I-aCj$$~nlW4&u zi>WorGtX?q2^SS6+}&FYog%|eQ&gsc6E1{Qdjd%3gaF|UUVv2l4vRk<|7A?yXVvar zq4dlaf>G%~d-V*)y)nU!o`2}0a{**@qxvLSS9E0&>=uSfY)fIPk{G?D>I)QL;>ZJNOC?0T_fBh1R%T=*ZVSiUOjZ$zeLd!ECE)(lJQ+f+ zKPjy6?!ZBYLUd{O?A|VGNNUO_N#D`(n)?Gip$fMP`*Qj6MDET$vR)72WRF;JJ5+Jw zUL{nkfC1@~gu?=48J-0aZ6X&^1=MO%mW8d_Sq0JKE6sKep-&WB*@uj(r zT#}VnqjzWV^3M?DCG?$#sV^)h60AneO06`1~B(K3nG}et@CFZIQD>r+`mzF_#Fi z>o1&_q~?<|SWz&P#P_?GS;fm@!Uh}F*eu2?`^V41%X`stq>k0b-z@5JVaUzg%vp!7 zV~X#si75OIu7KkuLR2MBbSJNDHzdca+J{EqM&c!&ZRuS=8k|)k6nMyebpm^bmxAL? z2BR9@dlC!HFAXLxE-=WGe2)U$)95J&jY7SWLN?o>Wz=Dy<|FOull}OsX(Z|yC?bckl2|~lkw@$_gD)7NL|5hNu^=yto?0!Qj8C5Cu6n_lXw_c zXZjl|;xL;3fC&L=$EMyO~=Wvu{4jE47;q0pCrx&PN*X%IjuoutRy@Rn zCjZ;W{ckUsLJFn^`$-1-B--u&ONBVo6hc2u8otF?q6)m9o=g|K92?pP5Gb4aY9iSV zUev+?y|zEHBD{fDfp4qSM8jCGj;}YmlYHqYWMEyi5^eS+YE@SSG7dvxaU{>RkvAch)*|E4T}&1BNtzB zC5g*p@xifrd!D~R9T!92UckmM=uGmW0U(ir_(fz*Uf;}EI|0AqzU%E*b@kwr(f}!1 z*XqI$Sy!qP8gyD{%&e}*-r>qIt#A&aDhg**mUX-GT#&x%^kY;X)+cX&>W7i0oV3Cg zR`uAn?h5 znc=mxct!54>>m*fP(Ms{5vlBw{Ty=x!-SiffRN(j=8V04P)9(0ukB#K{s>@**-N2@wxzzO4CM7U6o*M}(^V zW@MD?bZ_~yT4*qZIev0S?u=Q-pn33_K~_2ZgJiIkko49)8&m*{!4i3F&ED@Zk1`e= z)S$T(%e{iUaUTp#|4x1&svbx3h}zKbr;ek{dg0$6^z!!sL)vG+-C>p5EauD`qhRB0 zZIkmrBo%X3T30GXz#AQ8_b=A3lV6iy%7GrDL)Q`t9Z0AHZG2dDelKB&n_DHSBBpk% z2iTS9Xx^AtrN4>yEbq97+3*i#l7sebClTM`bCfG~5#%34Jkt2$qEzAvg#t1a4zC616M+rNAtR=VJ&Nxhr3ki{Po(GthH3 znHo9RSxL#%e)Kq^;zVF1IBV?Wq|=-j>pv;ppeAS?GGqxY!F{}EwAScAj$m!d&MSyj z(M;teH+?hWfgC;|5Ez-DF7K*2a@7CE3KvWrasP)W~G5sD&rA2YF}e=j3yc1P}Y^!zVRStH+meVvNo6q z_H0NyXutc^eVpN3R>_IwRpr}iJ^3i=JY_hegSr>_jVqrzpH%(zv`#|w^|QH+X!Y?n z^aYCBh(OHESC43WTn=cA@&5R8So%XToWGoUkA-H1U9Cy6L)b>YjENxH$#VwgN3dUa zm`UKqu`bq*-b703eBeY0*Ino@X0OI@3F&3XGsYTe)Y1oF|qDwKf*`)j;(>vR>1w@ zY@{uxqzy4=5*7_B)7NMM%TK@W9;2Sl@&FrHu+p7fg>E(;U|U=pM^90W#bymiGh^@8mL-15^?wp)T*EX^&> zen|+IGB8!=cdgO0e9G)xU=MA}i%sFOWj!49SGlN3;Z%v|5E~=(?<#vss2>PWBAPmE zG5CFf<${67ho&B=p3K1m_&YdbDY z>(!pD08NdIz1yPWwgziUs`*!RU=b@t;hyXFqFQPK>#O>jaBnOH~2VgCB2-r5R zlt&T}l}2b`ohak8X$`Tf3vLg)DH&+7Ub)#R7B!XSdQ3u8h*umxET^%K$_ND7Vc+0Ye|PcE0%BF}FSk+Roy@ z_U!Vsou$ojuu#2L1p)YLQ-u?B5Mv2Aq<_8pu18)x8!4?mM|!#qYU94-b}NWKy2VDt zCS9!CqU9$3me$D~tg2-L6_zY2bhmVuVBQOzAYL=f%_h)E-!FL{=Qi4B=+dvYIiv~^ zQjvInx8eQ97nR62Hf)L}!$bac#7iA^zWD~Sv~>g}-2@%U3FqmPj-K)nLzUP5@r_)< zpOdI+b;7*UuwCqN zM9I=Rm;wu!d1`QUlEdaJbYzRU0AkSp5_I8i-J&IqhVNByjAeiT{O3)8O;)~gH&;vIP6bq|Al*)A+ z|Gu?v1A2g8pe91HKozm6n@TyTSSX%btRhZ#?tnm{clpD?W!)iU<*ZOk*zBT&v-Tb> zoC1s7G2ht>CF0wD3(@Es*y9HMHa0z=OU?1rRcd$5j73cjVhxH1TfA(vi4#Ij`Qr8c z58+Nj|B|fPV~!(|UbE8JKzTQ1JgK-UQMltYz>aSEPzdZ15lW}~j){P&n3dwWJTYU@ zO;TCM;^#1#EhitC`r`iaao!CNKB{|hx#$2UW)3-@C!lkf8DhZbZV^6BeE1WjF|lR< zi=rLbJj9gLG9JY~qP9JB@8QZceFqG0Lu=aSQqzJQ6e~jJZ}U```GT*F0ylu;5s1d@+9Se)7)E(B`Flj+0uo7qD@Xvl&lP?&C)iR269Z4tdB zj}HoptcBWo^_^NNNy=cH@dm@4>DoD;giNUSaFtdH-c4SU@#?R|TF~6+`JmF}1RYW* z`bPupjrz>5yzS6}`9pc+Zc!Y8u;Q5P`GN;rOjki}seeB_*7{5%Ol{(v|4HXg&hC8( z?aJ_lQBk4&ma7{<>zBJp&P&>vlv)1-BN8|2;Ad3|NB+AP5@pf%gOj$LhF+hT6FKmd zC(!LM`@R&qb3*`=v@Wxf`x_yeMhuBQX18)n)( z|L2b>eQ~N3Q^0ETQlHGLil)GG72qPD!b}X2%4n@UWMY)@9~S;Xn!x(E;v_@#4|2$H z86E$|d1C>gPaGU1&IuR4k@I5F*@G4QU-OjL{*{NTOGva9LEAW*OsaWresGaegN7 zwn!_8z7U_av1dwXsniV>#yj=S*z@ErQgI8Rv_OV~Xuxu{v9&VYyZCiU6caJCl#tS zYSaHt_3eeWe_G*~A&^`j+OGQ&`2IMV%PsYu`N4ZE`VY4$=u1NyXOpRB6(_yKkD^=+ zEFl~n`u8wfgTehbCrwNuPIIH~;=WfbSe&Tsu)cxEqi-OFFxa+ssdCZ(d+wtH5|gM< zm#UqsIxE>qsJ3i$nX6`!f$TAI9dI%X`ZoCArhgE5*Lz(KabRJpj8ZFI$MyCHp^H=@ z>pEW)t;DAu{TvWG5lu^;H9gt7OqdO))8vz8HVnp_^)baKQVrj>|Mi(6engHf(VY?tv7O7d{sSK@1etIt>$*DGa`341r_kSpJ+6Ip7hx!Dc}Dsq zNm9CjF{tKqf}iPl@zd67uf$Ylh)`5O51;@z0|%YBIg3vS;kJB5KYkdRkZc*lYmjx{ zbwlSM;N4k<`1MK1+_dIh-=|&kJ%Qk|S=@#wt?{Uv*(k!m{78N4yQ>5py6)%hSDM86 zZH5DG$KfyfX>82;31gI=PE>zim#PxGQXgV8-M22n=0o&wiwE^68lcqo|3dtn(E>?TpUChiz=Z1S+83H;)$wR=E9l0G`4@QCCmex zSt>2^_Fy%3r_Gpp1xOr;uq^}5mtu?2^&kG#*j3D`?LF>E>vVW%B9q)$$K$fR9a!lD zj(1o9Fh7R&jeYQUashBpX59y+b}_0cy~^w(J7gx@GVmqhDl%bzg6Qo+xtZRJuLt=w zK`<;?E=C=>R|KiLk3&Cp>B0E+{M>&+U0D)bHIY?OjP=Z4(v?0RJ|<(m%FAgh4gEFC z#=>o+ZUa|Zq0q%)4OF=@O)z;WYB|9w;Du1pl%uXK8wNK+s^FTDOkqdpxN22}S@vNw z2Qr9ORypD17zNt)0_ivaUH(CZFlP$3yU?HPB^m`8DYOUNW1R4Z^S56KWJ`BKAsG;ssH#-k{9r^rM1qc-B8_3XKAa)=6Rg5DD3MMcoL(di2*{RK0R?ELP(~ z-|X@eLN9x|2Sm-%Lj|uwNSA%i1%`@Ul9+7?q?^0fuDSpxLZqnPds+QMR#pUy*}1u) zvZafNuRF&s&Q4c&9*$Jf_`P*>>knw1{zF#a6rOk{xCx1f5f96>{z%dG{B-aU@;nvn zMEpR+TupQ87Z@iune9Nr^j)E3D@v{<3lh;Bd;imV^xm5TRe#PHNJgWkM8}Tuen-VO!is#fOQELVNhEYomF27U7yf-^iJVnO;DV_cRn z+6PlZ)z?pL?I}iP>XyGv0uq3e9A=i^?ND8rBuwlSzjxiBI-X=>Pw`XF6`xAO{SNSx z^dZELXN8x6o@=WXWYV##92uI#p5~sL{-Q_aat0#v@IT=EJRX((sj!Y)*sJ%EV1dt!w1{lYrlVud8{65nrrQIc0srrF9W z+BV*2rSRhQFR-F@-{3fiVEyR+2>>j@j8XRw_k}0%8%<3Cqk#Gds5v|T@y6KDdVVhy z%H17u4hg&(Mgn;NDu{&IkkWzwe!J|qNkzY~ZW!+MM}qBDD+5|2h_r`N9yW%Eake=p zYm+EMJug&)g!5etqF)D08lW_kl-KEKS3@;QylSGmvF{4=OD4N%fduhar^Hk)g9_2p zk%E*JDm~N~&@t^{OyWOMVd}v>gnjLF!RqgPMiN7h;h7L7os9W1@WY~$$31-P^^83n zF>BK0HFo-x`Cr!F(jRm3YXLuT@8LXM-*&C~2N&R+gJw-YZ;7+xS3Opbf_VmO8e24{hgpVE(Lo7E1iUj2m64edaTlP}C!3%pmm97k!+yBI|@HzeBpu^5LbuyP&e{Cj^g}Zz<51kS8 z>yAiD0ocI#gF5wXZtpT`Sdp^u_cl*_WM#l3j`rU%3W1xiEjJ051-jCjxDB^m1()!e zJWw}HREIv>R`pR1a1qB$d1uIWLMkg=P7S$J_r5WgB7YQxDN5!F_!uQWD@eaitE5|G zYW@7@qUD8A|1*_HX>%s0V$&LR9Jg~f>ievp^HoRsnZfSJN^=NLo@0sc_l$X%X}Dv- zJF#iYwld<+2&{n}M~mZCzWT`tEmLwJC?wCb3kHHx{P(2D+Ih?=hpjdx%k1twqC$+z zJ?Ggzm`v}_i>*g#HBuc39EJ9P;e`DgdE&gm@i5#ETdB~3AGCOp*_;WHOI>7Cb3bA5 zEC47{WtI2aKS*TQ0&x2ka!Dylktgx?T`iT^b7&P!KrS?dz}V*;wc88(0gu$J-<-@2 zzF*dK&JuHG9_$BS8*%wg!25)`bc{W-RBPyNf>b`Y= zUr(`^9gd5u_-4?7&rNhrjkenA7u+iMf2RLZ3$d!&O8lQVH@7%XT|snTS4w<~51DS= zpL>zu!4rBh%MLvkxOb>0K9gRIIux&4+`7)1&&j+3fi<}X;aAc4lxLS+89LEfCoJ2yDcq} z``8vOE%$Mhs2_jX*7Z@zB51q+Pp$ef0?QE6@&7Y9TFg*2Ir!P+&hV}7vOXHl9i7Ay_;>9B!Kc`cA zd{t}u8QS#|oYSk$|K+fOU!d-A+&dw1v5?Ude&26bqXzkkeXjZ@M6*-jkxLH<0P<0C zE06G%tabQAneFB}6DOw_jBn=J?rkc)(&&DL2Nw&8?mwVBtG3w$UqtT$MOyjE)rU{a zFyGWwm{}b1L*9M@46{;Eo{wiLnlaVU)zNCORSlbz2BU)zRR+^&r_Odi8rX+g3W0d& zry7*kowTq67ZIuNVe}dd=HZj-rjhv{eI8j2>H#Q*X$mP%782U+E+9+WbNd4TqQf?vh7ix;6@1r>r0e*vZpk}FzSn~ zZ(O^nd}p!SqA_7FJ9B%l;!CW5lJrVSEwt*ersd5S)KT)5=mzF=<4y(Qqrgltc^INB zSJxdxKVV`)C-(8{rxj=%uQa5u8p%~B^lyjwpmg}rV z=D-iZxiO6Yd>kIOWZIi~@1~T+Z}y~IUS1wPfCK#|s!$FCv-prO55q;L9U6uBMV?5g zI;`Z(7URm$0T|J6CH=k^n5zqyL1?I4uA9|P!{D;D%SVLFZAEXa1sGC{i!^w7V=31l^5wBPrK-p+an6bY3|Nw4Aehvh?X z_f<7p3VpPsU_3cOhICWzlOFg-mHT|@VSN0!oJvEdi(;(Ly)9T>NQxaUhcf#LTB{4@ zIO?C}3YrulRs?Bm9?yBGtu*B%lQvxtGFprCtHQ*P0~pJv53?<@ZQNqT15TUSRu7FF z+e&n(5Jq{bqF%ot5CwYJvtwCG+Ve&YKWiNk?EXIbau?2pL4@!`${Ccb#D6tsnCSFG zXth7=5kEA5(FXw0?yNecFL=d9Jz zWnbyHtOf5L+-F3Oc%1LLOcSeUbqW5P?Wer?JdWYfpL~_%v(0H0yzscc>RA1|Oydu= zS&P4pePZ)H_NJgskLnlyi=t zeDgE2GxdtcK}5H?pPWIB{mKTnntF`Dx8zb%6OAB;J8fY$R}!&=#DXn>`K5KQBd^|Z z4`v?&MgPIGHcg{vq^N2v0vs4J7@}U#cS)3a7{4T|ca+zCNM`l$T2D=gJdb}8J~EvC zOc-rWSQh24Trzm!KI%kE=U*vr470UCx~d0x`I)y*$5~Y7>HO-kln3Q!C%uRlv&^dO zc!^D1A%E5Qo;x7Dv&wbDP+S?uFD*TpZy6|(zC%z7V*W3Slde!ntDWRY`UBvm)o0>e3e%z*{PaK6xzbY&TN>ZDWiqJw#;{T?_|X1% z$`5{V3c!Q}e|RuipXTH)STZxk-aXvva`9#bwi5A2_V5$pa|=1i%(4n5gVC-uWC17- z?Yt?pX2zt_VJTE9Rwu+FNt42DIZr->RE?Olu?wLB61$f}m``3Kd(0P~DDXp)B-0T9 z#GV*PUW0^#c>;l%(Q0hq4YKSn#B?Dns*+toZOd6sPM25rzw3kzmGCfb_g|^tQ+S2m z=dD^fzPYdDnNbH>j#4V;bl9rL6M9?@7--z!8+jt-HVUaoE)wVo5KwW;i7tr!>SHES zK<$kS^hu^@g(lx;y_0ajkDrNK&C_n{r!1EWr8$}Po{OBXZC5-`CiAuRjTREmG>-xl z%6iIfmfb}5893+05kq3*UMZX=locb{={ZuxazHn~HetT}*l<$hctP#DMKS1tnh)r3MrthJn z6m5=*1TB-7^YaFL%Irf((_$OcAld`BkU=6?zKUpY<$Ez!a1eRrrNRMLxMQQzPQ|3g zl$0|6_{`UHk5D>*%w*^F#lGr9?DLHXb&8Ztfo?Vw?-i+jf|c$LjFw+JHKXovWX^z| z|FD7=gkC_R;Hu(I+~19gQFXBLA!3LmzO+q==;`2$h47$9 z!h^|e20_lMe~nMfglp&dK{Qd`s_Ng|B0Vqqv04R$vhZgXqJPYC!rjN%VCBx+s~%Fn z%)yBl*_ZrQNXcy~z*?x5kRE08WWJ`~{BxuifzIWc>*TXc-`%-N>l&)2q~>ak3EHrE zWcQwU#^}(B<`g&R-cx2>S7r&zz6CIex-hk=uk@iQ-_$bd(SF z+d!8blQtnZ`Tg;60OOb2kk`2}3|r4$2T#P`_rN3AU9X(>5`#Ta)0}AGt^KVS$o<5R z$o7{U_^yMbN}e3|;A%#|v})yt)|D1%)Rr`K@;x*r*Gj@pJ^_9Z{(X-<(>D$NF98nUQ%CR3ni!TQeR6TvSL~tq(JU%^Py8-1eDEF%mTcu9wNR|G z0z$8z6xCca1HnRy!$80(6(T>T_EE$LVIG`z$bU*@gD*{C- zML&DdGINOsT8_2G)(Ee z=@2NW?`)}@c5+I2!WxVvnw6%zKk!^2h5Mbsx+cbc{T66j<3r2nL7EzMe5+0X8~?n7pD!tUIJY^{W=86{5BL8w)MEf^jTqxrX6 zO%5xUX*zxXrb&ct8>+^?Wk@rMP&cXDn9Y@o_MQ$~^dAK3t|v5>>3UQm?MTte%$|fg zI5J>QyT&3Ox{~~Nu%_7s^V!gGX{Yn!$BWVOX$A!;8*-xZaJ7X z{wOjdNYe+cBV{RJU&0uw+%1APU7plQ5$~iWO0J)T&cJ9Dj)?6{OfFydT7IX0quc0- zN>y87as10W?IDif<)Y6kJPGVTh{bil^n^v#)EyzTjh-o!rV;N&ah zqzlp~%hcKO6blxMo=R437$dJ3Uq95X)%ZT7d2V;d5|PVaxrss^z2|KNcta>kDvs+6O-Klt|yk8 zdJanS0Gil(ik0URr!pV7#wkGEr^DflET6pC_}^fN+x64OkAdpfZ{V64`frC_cpnnH z_%uI+{dG=~Iu-&=a}z11{hc41MjB*6$u8qCENfI%a<6SiA%j9~q(DrjL-xll-ZH0C zhJxPg9zh)etx!a8GQ3rJKI9S!7H#$%`^&{2h!`a2uW3f2yabGos*^eF1*MnrFY3!9 z1u?y)Nh6KrH#48X^iBY8yZ>2Vql8A6=fGKK)9i&3`A;>ym`)bke;Y6kxAO}}G6en? z%}326hWTVJuYM{^#*TIHWHO*j5|c23^+*O2925B6KNfdZINN++`4D!*?skSsxG*aFET91mpHbOR1*M7QUK5q&s)F z1K4I=@>iEjgHh52$0-aB zawz_90&W&INiq_jzPq%Cmij5<_`P89S5u#_izZhY1=*{<4}Ph2>mAsP)FQe~i zUB88iN(17<_BlT;`-AQ<-1jitD{Yta?*YU6oMG%K_MZA@=g)!i#OPClPe%|$qyiD9 zlo^G$U>=fzU#W99_${lQD2?WoZHbvH1PIX`2lhx%} zuZDVdW>bS>KktVXi`!3$UTJ0w!g9);V2e?WaJ0`zW0g2D#A1eJ`sumC3xuHNWaxm5 zk5yeGWP0nrMz|>WB4Ay>L=Sdzc3Hq$9GvcPk|HS_yTlqsXk_JgnQ{tOO~E_=`y zGRoatj4D2G)J_gf>q!s0Tey7heIdw=zeP$DPkq7t+i_rABsLu^c@PB9{*>uv)&c$VR%S=A>kYWMcIx?Z*_v%Arm zu7(RYf3dQdz0@-f}l zJI%)F_e)Vq3(z~5V+H?l`uQtOs_O1%5hNDQLmDx3c-PqTMxKAHWKRxB9+(yCv{bN~ zy$0kobu5dHTA~nASv>!9v^ta=Hnmw;8t**H?)Z z(qqH*AntnACOGD+A-dy z#{NaHI;^Ogi<~W8EG$iI{~PSN;ZT0FcSGz}Jhs;7_fKE7rBl=y2L8@#+PduzdgH@% za?B%*R;H#{*O{V>45{qHl95@8*Zm~N@5*2n*`EV#PYKgw(rrfX%7?>zO z@i0z6slzm9C(T6&B1GNSL|f{;x#pB0ka_V%q9n}l2#5DB(Y-rGFEJ;c1+^iZ?l;*U zpM=gfu?E#*wSiMlra&oO$V`T*Dflr=6F{ZXBHB9kT>_n@rc|DGih4!ryF$hVHe%}5 z7m^aj#whlUcdn2mSQW>8o*e&YB>#KTL*_%9BrKR)ZHr7+Hj&8>;_{HdJGa)cEL*?N z=@2OupUA0e-DhBUhsbrX`k5He$`0;qb$M}80&XO&@1&G4e4`H)lkWkNHTsp%<{UQS zxI4L3^FN=`!Gm-C12G|~2w4H0+ad#>UZqi|46;m`qqp1dN>%Dq_3LUT;efeazA(|7 zmL&c)Ped@cRelwikjyEF%+Icl16UWAl~5Drvl&lTJx1qUqTkdUw+%~wmMVL`BJ|$2 z{-J%n#_>z${&a`7+Bmp2VGotg3DNrm<8o*^F?jimE-5_4EY<0ilcg*=N7_<>@{G;m ze$aiJ*jxzg!dK5PXg4e(57D)pNp@RRUY`+SIbw;3>B03-sS=ZA>i&LVuMF+dq)S*A z=HJg`nQ_A81xgB|wo=hE)$vF@GOw$kjR`PXZQU(86Cs{qyXV(-S8{@}TGe$bven*f z>R=fx;gaiVx5@h7ad&s<+`>{~eO@y$Yr3WfNIxoY#;?=e~8pW>gni}+~Sndi}3*&7E9G_AQ_+6&M&G9#Cp$Ew^ zI10{xTejYZs|t>rso5wnk>hes7r)|YqqTb|_WU&Gy*sEloC*(I9p95Od)}Dyvp)z& z)UH*Gg8af&?@KV44n_TCIEws3JjVZW)dtlT2gjGz=Fb9sOXM*{dB5%i2uw@_tmSgU`#kMKGbRzE;$ zV6Xght*7qjtaq*5yHIzd>RL_-wTFxOfp!AVLmGMx-Lff$6wTPIs>3CmyR|~j=lZxe zS|g~srB=(qF-Qp8mDc%%1>#Jt)x)@+L&vw@!>@Mfx#~8knD-sFmYU zL$%Ps2|F_F8bF@pvM6r#eqVgq(viuwdv*?xl+@cCGJrUS!w zLSw#wS0{IJ3mq^bU^igJm$%)50tLfJcJqS=1+6C_cRz4T8YY~^aWRrtZPd7o={Eu> zG#nxvPw)3h?}xwBpas{Z)uXTXNb@HWOs2SPQyRR1=EqU&W1;M^Py?1i)Mp*bVQ5uE zyUk>255aQWaCIMLCqWK(&H?623>N!X+ufj%hm&M*y0K?xui=j8k-!Tx=-?VV6 z;}-2Tx;5M1XdV~Z%V7O`4}DTPZ!a`&a9%{lSYl>`&=Se&fP??=uQDBBeTVtJ zpdGl_+*cW1<^$9RO4MACOhQ}hjYkkewvFos^2XVx50eP$**mk>YD@f?R3?HfM-0>7W2MpPc~m zwbg`@1Uwnue1xu(y7njSAbuR%50qS{a%|sna--1zEhlKz!n<<41rUoPP!#V3ze0qHQPjWS}+vM&ZxQ%ZGZ3M0|@&t zw1m2cR^+Et%J582;T5$b9*JBUnoKW<@020`;WU#Bmc(6zrvx*&reeS6BpkkCxf<)E zO~{W^M=uzCL^(ye0q%)GWiuE;OeBV-r1<{CUAOf0{c0&UKDo+Zbpi!z%QO18C3i>b zw22BR9*{rL$U@})b>;B)t3t-$Yb?k<_jR0rm8=~hBbS<%LF#A9SfR&w-pTL#VdDNc zBqYDI-&DeGW4>LJ2nA3ul}%ioqX$FUH>0+NYNN}x`R@=gc-v95EMUuM8ze$Z^5GR1 zQ*&e{m`On3(P;WnwG1zirRZeAl(~HgMbd{i2t!}u2KN57T2K7RGQqQ35fP0A?J%3gw(|h@Z~5ETTvzMr(oJ*A>^|OY zyRPlvzo(TmFtAnwU1#?J@LqD8lJ!$SOt0)9zc*;A+f*O{BpcH`p_M!LO!Xlw(TrIY zhGR9?2yKcxrcT)lQsex&P3CwefjXgV9aciyr?}o?Q2BJIE%8z*?<#z;yPNi@sEw7H zEnLPXgs!7Vo13UnSeCWuWn}l!?-wiSUyL=Eq3Vk}Vb@InLVag`J`K!-z5m{-@+Htvm5ohrzH z^XZK&>g=@j?W#?$Si9G0m_5(;Q|4D3+i^6kBh3!1DvH+3;F3)%BKfGAS_sL{7n;4& zlbo>%zc0u{XPMtNN2qx{XMchx8-~L!_6fY{Sw_k=B&*65-A(iMq6wmDoj@2zKK2a! zdr$ojUg_F=Io?D93fwyRC_jA%J$!sPQB~Nb!gB$OBYggN$hK2^@+MS{*bQ-)MOZQXO)<1kGNl2y=jb-{w=oa|!J@VB*I*V-GSw zNP?~=cz+F=06NIgRe2C>Y8^dLU$g$Ge7QRkR8bZ8ztk(fWqVxTFi1r4nl?}E$ZTCO{1HSxcY$hH zuVKfl68v??dMrWu4%cytR{zlB={v#j5O3<=+KPBy4mF+;6DZAE_RdN!r1r*AAj{~T zXwxT%GqV%wXLVRb2I;)OSqC7dU_K(5!VjsjHwgi1!lb1@&NCuHJ_~gkAiJ38@Z;_E z%`8E-H>BkweK6pSFcWBV)OH-eco5c_di!kOIbHqn)@}S|Yl#D01CPWow>HL7>!!i& zV-%;d_g3`RJT}>MdLXU@l1@^5%lo9z4TqbQ8yFSw58Un}1q9c{*Kuh0G`ty@nVKuP zxHL6j;k#UCYfxhpC2&06l$yy)kmrB%0Y2M1zh``G9V8x1UC^djg`r4cZi#ukTO2$2 zEZv+Lh`z}wE7QMo=&+=*?szt4oG70a6bWT5 zI$Ve2TeR>~%e(0;JnIPvnY#%or~hw7{DXeR_!2me_=@m(=a2FK*2OQ`KjJ*{{FRO> zoBg%F=21Y%->+GD-nTbjkEl|*Jnp(~dSBlUcYC`^AAp^CBu%ViH!BI%7rZyqp;h`< zH^LNAbWbze#vxGYTqur4q2yA~*|8#zHy0=KhM#Tx{D0-&{Xf1$Gy@jop2=XJpJEOj zhE9x$bS9&m_x!VZx)gp~qwAaTJE)?2Dk_u(UZ%~U9XXubs6aLJ1W=^;+P%Mnhr?ZI zE%rz-u3hH#8uV>{{Hb4~ejI!(xvb!P1Q9+i( z27$Tz9-7As_P3rCwLNj;S8P!ZG~lO0pN8t0ODwUHpi)(*N6Ex|%q|#x#~$I=&-kF? z2wAd3={nt02%_bmYCyKcLvJxN_=i^mhY~~lrO_)6IrKc~C4J71)wnYW7-zg3l4dph zA1T=m0?9J2g|jh2PvGv*eOV?qep7Msb7u0JCKiwxMF_co1=Yto4BJChb);7gkD~dr zduM1qxB0$OJbq<`_Ua$NC2`a0aRhNZ)whTs^w?UKth=S@u&byFJVC8i=d^@LIYr1& zF4M47NM*$6zIN&5ucv=+j9Ei(n4Kj@X%7ym9(#p-+sA^}D65xft*A|1>%M8g-DI62 zrkOjIVU&<~$&dEtE#=gC4!tvS2YTwaYyft1PCC}{gaDzVUTje!15f0v>S1|Akbh?u z{VMHod}jSVoUbSjFE*Lb6_8cACMjY~c8aX<{SrXMbziyp9^ADS_2dbc>lN18{I1$? z$zSdU!)q8tB_y4^M%g};kSm2NR?6x`a2P9qd1se6IUEFD<&jz3TEmTC;c`wU=OL9B z919v6Nz4y)xk;t)8pk${X7)o)1z7sgptAe?Xl0rE;~0tID`r*ksovxb4al}$Ydk%$ z&f+r}#=BL|8pi#l1KIz{-B13~^j=(jD@1wYV_lmLU!n55ke!}h7POUVp^jf@7Eg`B zB0N5h{nt*%@W^$@ctj8m_d3wzbcSw7y0jrK_N!$e!PL{?4%=J*Fv*|@Es`12C$tbf zF{15XotJ^usdBjaCQwbDq&Ha^^TR=aSR|?I>QLgB6!m>MMLn-S49}zlgVcHSPx6j5 zY5M%|KLn{bE(1$o3r;fFY1@NM(;IJ5TF6;!F5cTTr?8jhVwrM-IXf?CYu_!^N5lmd z{Fdsu#wltLz3)19d=PFSByTQctwZR!Mg(Vs=!^W$DQZxAr?~Pvm zvTI7geIy%B5Zg?M|G-UKn^PUoK9~T5#zJ3))^Qx74rr@viRGRn;bVrU5)C7`yjJRO z4&%MWfx%@szkQGfcp{1(ATEP)K{sh(;Q79&^BfYDBEFfxagON9UIB{x#SKO?J$q7BkDWDl2_* z%`}l;WvxIj*ANwZR|4-&uxf+`_Dele^n=qMCfgR3#OQqm)SP~ui`T%qFNdNje>NY~ z?ux}%qEdSjFn7JAT!VSK9~|~uM>07t!Vi;*R96s+qAZQ2tP}{QTqo!*8fTBm@BGGE zXfBkp>{}zU&_%Dxp($fIqSaxq>s5bS;_Bf%(f2~po(Awv_@v-#&>a6+p?}=SvA8D8 zhJK+Zu%c_NP(N&#Ig2Knn;N+g4={hrvMaYy(BcLjbR;sYYJs)Tv(;|k=mTuR0&1a zBx4fu7ux(uU|t^-56=cAz2|k7v0rZx0&9aA>zE{U?F1)PtlV9WRvJY?PnnFnI{|3j z>rj}Cc1_=;B+RdQoBxDJQsn0G)FtG+`ZJpMn#(mZmCHpI-x(iPjuq9`@BvMyHlT>I zpF;Ic>h%fL>|Onk&Yst2dg=2nzv@vj`En;6D!=3+p^OF)%!oSa+y=GW%v~SM52$8C zm*k@be4{0>-P5U23!sLM87q&40lU-%d!wEu*G*dAb6XEBlFXtfDTJ>+9sco&LwT=dwT7#jPTJ+F9|V(o z8kjg#yc3zs0d|KNfL9r~ATFhlzx7tp%G?g)p?@xbKN`d=Ka>`*=3lw5mOq_q^{sAEfU z0TAJW&PfBqy}{B7i#1vxaJp_}^16xO?`jMsm1Rcs4fjI%eVT>Crz9X{GVnGK@dq@S z!3?#H-tf0=_dP4HdrRmMQp7qm%xACRI1!2NdtH~*p*XRI{2>WR0Z61R>_Zsepjq@Z zrs7INhD8Fe-#dWugE8IQ*7`w5q0J#uyb1kD0<85{_pi-FWt-%9!BM(=T-!PLN2pJl6oxnkO=q4Bb}JZu0-cAHod4W`|{@Xg7h zkbeEYEV4|$(5zbib(MD6LcI-SK5nB8err`L9>oxjvavIkw+KPE+bAO|*<3OV?#SgC z98uz@ba!oVb@cC5&g5S(TtnmI9z!sjJzP5po1Ln%ujENx>;|kRPT3l`YOtUd3V9f< z8En{HI)cq%CJ+iS`3{llwVG8KkumyL{gK<3@)*T$BYMR zhp=r{;=rcIzej3_0BEgIc;6;lL)%Cxr-b#Gfk^hLugU*jm{+CNj#Q9aVp1N=`mse} zZOX*Y%@s>@A+yu>aRZsN0B@-epuo6;mU9UEt)+1vd~(0Z*Y^fqV7+xjOui3b|H?YV zZ#(jgAg^s&kp~zVLoZ&olTQphbx0{T{vK{6wm1<)ADM5bOO7|j+fABVz`L!?F zV);EK^CEzE{gaH--6`fzp0x>*-pV^&?RsPwob9#+n}%(L zob7woqLM=nEO&D{2WdXEK`3gh5YL>So7ps1QCd&5~Hj}yQ(G;F?+6JehF+Jxr|G#x-X?kzLzeS? zkK4f0VFmk-MCzrE4*?TPH36akG3pq3<`6y(m1s5GI*T-Q$0J#!VWa6T0W9q2!-(wC zKA?(Ebm~$8m zLOI!RJ3#OeU1&4hriemM6Zm`qtuA`q=E05Pq<6Z@jB2^w4Vt{1cf$#Y!p*R`)Q0=~ zi>>&O6;0!@^`B@Io9+PfkJ(`;A3W!|YC8shR4T!j`>p?rat1;eklZ_FZ|}&7{>Gsi2Ru3sQTlrGq1$|<(k^%7RF*r|A-(yw-r_y>>zEyHyDXEqCy#M1-~U?)VXoT7n^_&sruR=| zlStq)nbB6m0OEy56a|ty2zDlx4c$gy^hc2NIzjHHg9b1vbN+V6J*)eByyiOz6I#68#noFOo{Kq%gj^xcRjJ<;I+EoIP7?MhI)n7g-!4Tq` zS@>8OwTE#KeF9mc%n`NotMI!C#CYv25yFEX4n<_0ewu)MN0QHRPL*V?nQr`RA6S$V zzRLR4V`c$EWSc+4-_}rw-EWCJ59_JV`R@lW8?uJ*FZxDr!`N+)czu`* z`U=0-1Aj;}Z4h_0es~yywo`#>9zA?Gj zAUz{1qH^;hXo5fUr8{0CvR&@I59ajQYX6{$RTt!MQS#6;qOWRANc8%&<+Gc3=!q>gMeG#nFR%$m-+9xWe_R)W(NN z*EPhY8MmC5R^~pYKlJI_?iS=DdSP)XROCXQ z4R)(Nnbj;|axMJK&oAnI_D`_Uw|!C0Dq{!rN;f(W$BYBG(LFwXLVaC*U2pgqc2<{L93_1jYyEC{;a0~A4?(XjH?(XjH9^7pp!JQz7Z_D}jWzVeD zeK8kPZ*^5YTH-Ms$MCsb(dYxniU%q)*&iK(K`+;Do%ni;l;qp4rr3Wvt1|Irg=V`Z z61$n2c=)9mMuTLchu~cy%Gh1PB z`U!{EjCK_=Z({D`SQkt=3Sftz(N>)`no+&A8sVt01M(g^1{-#y-YY$pJu!9p_s4ba~OK<7RB%(vLYcMlP|`tXCb`dXqRs zGS-V?xk1Ge-xw#|Q#T+%a>D{KWus&BQDRis&RiQ_>KpVW<3)u}f2`C>wk?Q^5yR5$ zL3yLm zBjl?>vLtsy*}Py)<{0dNc*==sMLO6L|E>}rI1I5qFj~NU{ zN#N75EhM2(f$Od1_DTK?x@Vwwhm*#}j-vuf3w~`tQvX8#8wr6$RPVbYz}9y?*KSlb zLxGpih!ehN-;y{%bz%fd&HIRi3Ws%cf__mJ&>II{V!3!$a ztICZDtZ8tzxd4$h4inW`CO+p90J&gvD4>FR3RRRP`c6!)2@#IN(F!EMkyoOM4@_bp z(ETwD=S?f6&sn>%sI9GGKkxtoHOKJzVUmEbd;n00vNJ|1_V+Vr{$r zrRU0zCLn@)7rHTNL`gp&KsGqaDw}ij%CYa;rA(Y|;6##h+-aa7;#Mbil!R9({>7ZO z$wiZK*1Ih}|4kZ7j;Jbba-;`rc1;e%Fx_@qF}4eq*V_zdg8K-lAyd_fbG8O_Ng~7J?`gb=t1Y2oT9dsNpb`YOe7`l;-7&@Zs2Vwl+I z_bMy>j13M@wheeq_}Uh5-!BV&2&v1CtskF4(Rygaiao8J+h}&7CERQoR~MGRw3jmc zHzyA|*ihO)f8{tvG3vv zl1)Cxv#~7K!N3mF4UB{~_}~+o6KP>3-V0 zWICeUrs#>B6aX0$I+bD=II8^vfdeu^#_x^BA+_LkQ5j;X?wtMx%S@C&ymPDRM0N`X!M@LJH;caOqTypee|PksiwG^;E4}3*CE+@;?Jo>Ye?Q>x?X#Cf{Dk?te;B46$S&#OTKp3zCr^XR& z!h)v1dCThbw~swj^~qc3?z`KoT0hVp*lljpe1Hj06|Dfm-@@HbGvJMioWQ& zic21{_PTZ}^l zQ3a}+J6(5iIayf{UoQMkg5YzPpJl$Owd2=#r<78UPc@=i2&nh@5|H)08hAu_6Tvfh z0ta3b8nprRjF^F7om>2maOf++uN$VJ>+k|wzdEST1vH)@w2v28)kz_G1GDwOSt{PMWX}Y*Wtn33 zXYjRG@}y?b&}&J5Lo`3UWk-u<0QsYz3^LW56>=E7Jj1kLj2Bd%pPtl5Qe!-m0UOk4 z+RXRUS5sVHriE>qBVknmG>%`XPK*kA&43f21Cgo7NLAcWUiB?;nP)144K-m)4sHDt z=xy7APR6MNTI-t$DPyS_j9JcNd(-!*6Ko@geAVug#zOEPXoIIh0fm>6PZm|Y8fARK9)gz*IChqUf2&t%bJ_qXGe{uM$uN*K|A;nS^D2j zsBUm-?LY|2N~vs54;ZR1N!rnSSE9$coY9Y)i=O3}E)7NM;bEG7m}VRj@CG2%5) z$GOZKIi2R<34`cu#=)3wI9iGXURpn(B+OPo#1tb(02*kWF_w2V>P5OJ4gwHG&H&iQf zJLer{HH$cf@w>$Lf-hsAc&)d%DjKaBR5A_a?}(h^bQo?`vz^M7kUI}Z863Z@6DjZ7 z^$dv3#deVvdlRi~g?x+0rYmcWvYp~x3I#Q9G7Gaj0a7m<@why4qo-XsW)xtvU}tY) zpG&)vx49?UeGk3MIY!P0^UFAg1NreCby9cI=0)d`&h6$S*$Zp z$sh#WTl(ygSV%5rFWzG*dt9aD(+&J1!fmG76!KicF6%=0;uol#o znXdqJ%K`b{-xfUr{`2Nc6USZH(Rd>m(`DA)OZntDks3)nx7UMbn3b#fgBU zV@ynQYC1dDbP$PyT>s(^PeE>fQmIFcvh7lq>ROFYo9bV@|D%&>;C!G_uiTn-{#POY z{|Y+yE8H)rJGpYUUm89!1as(Hi?8p;{BMojXT#`kz_-lloww8vHU|DuoPsy~kyxTG z^6c&8+j-g$FsIy$%;YGBZr#5$W`$uAnsJ)pULHyb;h4Gtk_Ne^R%ZuP#goV zHZo$F^IQ>_t9pxfTC50n#F zK^XKooTUP%2&dFBL}HRf_re#5VCOIImnd^#M)9`Yr9#sD>&v(kDNZ;Z#B|TTPMReM zc0Xj^2OkwI`z2_wVylG;1*8 z>AjEZzub9ecYy*pg40A&YLDT~X~WgcELk~K+X9gw$N3_p#|0eZM>itv2_fo8QhJ(j zds!{UVaGHhqdgw;`RkzK=|srNs{B&;vg0CRRQ{L!6Aq+w;ZS4zKMm~fR~_kL9$Uee zIol2+2J4H9e`xg_1y`nw?sS3tX{w9e%035<2^I|bl3Tv! z5Mtu+oBJGez$<-?J!Ea<1sh47mpSh+ke+O58 z8ivw^fGH?A6gKc!+Ne?^g^vWCh}8%!XE@7Q9HHkxUZ7uDdf;OS1w*-LxbISF=q6)+ zsOdk{e02?_CGNs%D*$z0bYcMeM5;W3X-x)wZno%wkP-&S-KMnN_F6mIEV2#>0K-L4 z$ekt%>bT7otI1XS4AX-$DL-~w?hOG|FEn*qKs4l+5i3`(#I+BUhU43cNzeB+roO}=se((BSbf3=sWzW)ul--Cpfu3kPo00@R zC&myQyeZzo&lw>;xS|q8{t$IEY^<;?GP!GgGPVm^y(+xIqa}E2^PD|c+0)& zFxzWxd4g%CVs!|dy&MLUMp9(rhWPmVqJ=kACv|>PzoTE){Y>)Cny|KKI(8~ycGx{# zQ0n$#Xgo*dVZ6L^yB(fa&?KzMdWw*{L6nQ88q%${qnxUNwnl=yZA$P{LU696s3%(s zMMP`)aMV?QMd0bfDP1!lN*b9;0-HlbE=d^-0nqcazhEoKg4fMgkF{yW}}!V^bDIv*5R zHu(Wrdc%;BqZs`6^94CZuO*r6yo7p4?)GUY3i}aw9Vj#8cQ*8;u?@`XOS4)F;K=v) zb@VMvCg3WuaEFH%*NO7f;E11xzi4#@tI$b+aYlx~;P zT<2F1lJLb|U{@aDe!(UBkpV}IV+aqwX083kLc4z2G{u3{&SprrRc#YK>pb@Ma#^)# zpT5sTW#U}uJb&hZ`#=M14Tqs2`-Z@vs_}fzF5u#}y)?(t>4NIB6qakqQ~JFl#2l}E zOzvN^n8Ty$RUmA9Zfq;wJxdJfM~>UsCz7g^spAs*!aKL>J6GLr&^huOlK}o+|96NO zt%;K5qZX8GId_jLC->HCcUkLFI>G{@5RV}jWqL0hI}YTlWGoKct1W>j$K604Tf8F1 z)bqlXCJZtvNILik1skhggdbE76xT(%&LJagH$F{^&yUPboeZROjo`SFut*^$dgDqb z$Bgac*e2H$o zT9tGYbh;eKZb(5t8#sj|OnYU%qeDp<@q5_KA63o`fuz5JNze#=m+V7EQGUJr z;D|mlKZ=cVZQf&1tBxJHHiROW^ztjA$eG^!R(x0Ntlma?WAI5uV?)w1I+Z=3#{Otta*FnLfD*Z>is{(5^MgxqVkk z_LM!RlcUgKO3pVc>8bUPJso z%d`uj`*GGd>t2Ov>Sw(27kd;2>A3+vpYZ{9bUv@P7Sx^Y>%PIQ6!Kg*o7l%+oYXbW zV&pk-eBwdeO2S&l&UC5iWaeY)KZbnYdy`22#PwhdRO7p@2PchT@Gw>ZS6aANu3no% zPE0dZb9`p3p8}#iSOxe+>07`!8a!=mB(4OhC69pI-odBWKdm`#I**!fc)6G#@7azh zIav9f$a92-#m&cf>_RWnt%TQw*hQ?d!TzoO^)OwFjDx!O^}T%;JfSAS8Tx)c<5@=w zN^@J#5Ttitnr-nmP@c2HCQX(~jCHEJ#W50I7B|OS@#A3$FrLc7W-J(Rc<*&;i9mQr=2Ccz+aZnkG`-$xQEU zF-FLwxs^Ec zet`C&spEA#Tn6NKL(pK5bRSH=ax;$M*XI+c4gq^sY5muOyo3nUe5BLI*8i1-$=(j; z@pot`-8>1g7Kj^ws&P?ZtkBBz`>+m!&=%f$4nnV~2XrCASZzL-yMX+A(moDqu#xZ$ zU=GeQOv=y}A~3d_jP!W0YFh*okWau7)j`>yy};A}H3;qm^iiQ7^#O@3bi}KR3G>!XoI4 zm&eRYb4Ki#L7Fc1T}sQJH;P!gWMAP~iKwohm@_AdI|$^1eG16J#)3?R@lr1v8;7@+ zpkPG8%~7*^a+{d=!Z+9H#^O1{c-6^B0{rv5nr_kY6vAmdiuR;l#X={hOrM#Ppn?N` z7xP^7qkfE_0r}|O->FIU=C*JHhc&|WJ?^J&g3W=mBBjlZve?fp;rX)l>=$oFC#!aC zS-P~i9&$0?LA48?o=fbnYg#j|gZI`BuIb69y|N`(+S8HgVvAtwAD4f&_7x5kOzu?Q zy*n~y|J9EQYmbE9cu}5n{+45T0Mzzy7qfp;vqEQh+p)`jKkM~`y?$w|%^7~nB8kZk zuz9=4@yUeobkyz*_jmMQ#purh1j<@(9e(+Jmmj6lOewGCm@?D9a&Fw1Z%dQyc4xPg z@J8e6um?B5NCP#U@Ejl+GFEHZ71=U@we6r~&UxT9uzH9=>hFmRZBwgO*3vGxVhOma zb9e0@FQ*UF->Zr=7^5_}s=JzOl;DKf5=~(eYDKqc_Cyx)nv)&_lL)!H5?p_k4aVT; z{SENIwQ|UywZTqjQC8rJ{L?qN&xQJPGTDKWG(@nC3Hpa^L5dYcHdES zxt-N5O6BZld6Fd53`b z^V%u)XQ%k3@{#4VVl8R(#M05mlte21`znGb1dyFHQL@T`rU`#Ym*Hn7-=u_}_Knyl zWPzS#b~<(3qW;44CBO<&K8?42t$y)-Q|JiKPyo4CZ55Z)fwJDWV^zs8p%E$i`x*2v zoES0Rz)4Q-RxxrA6(^FIx4p(M_n2{G%Dq6Pc{Sw}MRdNWJ0m(uFPBM?-ersF{-zNNZBE?REYq6;Mzdbg+{g(0OT>H(gta!l)j?yonIApF}1RF%!qe|r}x!7&I zGqE49@+kyJ2@i>L)DGq<+0nU45HSf!ChaiZ-gxY#i-XrkWFwJtMjuDFLTK_tj6;r2;BRUsGfbnB7FvYlV}&Dc94n_^ss)8`06+g$&{by*1d^# z7J21DW%3p9yCj?F!gV+`i|5a2H_vU{;YZm^o7$J_?_0Xk)IL zGi?X-9tk9J2e?D_PAp#2P|RA~Wz_=iAINJ{1v3hnS zou^btDX+6qxV`Y4@&u*GYJO3^5t8XYCBN?(7h`s9T28#h zdgo!{>BtP-kDR>a%1%}qX3)VHVU#hvV?plVF}@3rDS|w~bo8f)!gh^Xe$1Nkm_$W3 z?Zh_=>|GN7t?T&JLRPp`hBc2S@UlR4y&5WO(pbCuYfRkaB1UQI#%bVxQWk@{dVcSS zc)XIo|J^LZI9X7}PW9paTOve`hf`GrjCOm*`fql&ty~EO>PAm>%O`JflKIUow6jDuxR&qOJn#eaZQ8RudQ!_#G^ks_}Y6$(3jem z-E32$bK<-wzg34+g3iAcC%3aTROp1w<3dD4c@t-5T=6IzFzNFxwS5<}M)WV()9pA9 zKhu;`ROL8xEd)59r1Z25b2__*UsK~NYuR;OJ)er+)f5K2j9#NOoE2QrGhEJT2%@Y} zlDeLCuqCt5=Wba?|j^VcAv9Uq8)^AtRk&w z`O*E5JLPE|Jpda`1@U`i&cA^V;#gTB8#kLM{8>u)^z8zd1)j}#~iM}#B$ z+)gZoNaNIFM?rwMa^!&AWih{0)FDsHq=O34$MyPVxD>LDT0KC^@(ud(7YJ8-&`l-+M z--vKxli4Ta!XB^5gg%J&`JDrQV$N=cs%Cp~G?b0$!W#o(=b#m4QSDRt?Etc^c^BdXDvTh0H7F&g> zja_+-!FGXu%`Enf`gZt+43>uYQ8u?DrMTh>0m)m{-W` z&q**}HshCXj#p5)NruOmV}HhR5JlK^dS<)Q$7A|oE2?_xmUhL!K(%^qQ zsVHlYAi9QdWL4eofcBg%^7;eru8#kw-aqAf>jA{zlSlRc&3F9gdoM(Sr?~%&L$CNY zJ~#4zpk=P)dOuUebu4^pezY8@2eN-ly6>aCs{}cJAJ;1RH?(@6*?{8jKpl(UQjWTD z$IBMIVbe%2KJKywmn?5F{c!M(KY+mOn}+N(s?6sbegCvB_vP}`=X;gO)_T&xt6xJe zo&TLExg7CN(f))SMzyi)ikwD z)7kwhf+Ap`YDy@fr^8X_1)r(6d`=>bF#ev;81^&JL#R9pboQ>>b17Mjhy5CKK(cDbL*J zl_P2g(MX@{c_Csyd}_BmEqrEdIUqbkX=S`^>f3G}+P9`{8_Nw$dp} zbvkG7s#^+KSTNB$`3`&O{xC7V+E%m3t#7=O0yA{R=;L1yi)*A%0@8?0jewHsP>d#Q zN(mN``<=#*-GZT++E=Vu$^V5+MqNVvDOd{BQN(NiH5O^shIse-njC4icH7ax1lzyf zY@|MTn5D5RAQ$qWU$i0S23vVJAeG;!)^?Kmrg&V_jdb`s;cGi19IP@f{g@+dqHocy zVYZxlQsN>)VCSxqSYANQRbVq1((~qpWs!8INg<46e3*~+t}1b^y42WGSrC_LXu+*d z>nfWkC+l(h;bYES^XUJ%xn-!e-CaHxd^5}82gt1J4}9L!R$ z6!C`jQ0ciP#&04cFvdR-Ns8XTs728l0&fQJ9VT<)g;vthf>FC!VYPODAceJq$Y$Ol zTkVogOx>_gD_xKJVyFELZ_2WIoCpVe;avsxV#fWi3}E=^i@4DlEzjnPQWxX`y&h5gAPksO<*9BIb}yUrKW17H?eT*s;jb3nCe`kR??#FXYEy?f&nkMa@}{9v}WDb zn$gy*5TIcGveP-c54VXl_%2vLlsg`Mk=xmJET2jw$mqz z-s2d+aivkgANqh@%>GMz!ig*WC-mY|DUj|~kjgyLtp1_HG3`$exHCbR zIyGz0n|jFl3hOL?aNnmnz-Cd9a*b}A2l>2P+#cWKN2xPR>XD7e1DJQ(_F%>QIXLp? zANBC$b{z1EBA>|wv>(H^l}rr}Fog~8i%W}sk3gwVNIlFWG!oefnx=h;xym@7CW^|g8+<&k=oZ<4s zqf3_H`{LZ=XIApj3hAzOwJv|7D~Fq^5F(ajNN|3# zE{~jd8@svx*+B_8cK-4r6E!;t|7PJBXy3-jUh~AtLr3a_+^VBp0_^e`EJ4mn@EG?F zvCn{IuzA=u?{Zzb#1I}9uime_?lR7Cn9iPtf+%t|1cz(s@wg6~m*E9lAp3}?pE05I zRcYNHEnwDVMM|uHJ#E(b-Sr+-h+_Dfjsj$4#vi$<-GCr0WQn#_#AIkyH8fl}&#kwJw4&SwfBS!S7e9?`)__f6O% zVCt-`IM!To)R}}bO9Cw{?3l?MD%2dncVo&lfdMK z`6z{8CQOhaQ9UIFpwkCq@FzuP^GYKi8qqkNvkl=C_5vy>&I7s7+= zgAkm)fA8zjs+-*!Ih||KhQNA%3{8XtCaoeGmT>koPM>crTIVr&vK+@G)Z38M-u=Rd zL1G`@=*N-qSP-QRip9T{3pd-#3mJ}>{iADjj8U!Sh15Q{U1|5dubgH4bcZ0@GKoMB z*or5eczL~}Pp{{y0O#KB3Z-FpU!O^Gh984K5bcL0trMwQZ?1`~pVbNBm++9SB)!or z(Y0%C|I04I!PYtFkg6^dt&hLAs+qI=zTM9-p8+yFd(*_<$OU&aIWiZN*D-vB7+qq= zx)xqUP$(t! z7L2UkUbWOSjWjd||Dy zWyY20Py@dh{!ft0ydR70IPgfS5|uwZF)f%83tB<6r~LN>@^x}#D?)!;&Z@yr$WkWjTWKV}@^K%u7Skq%@On6=5xBco|HRWM1bUdGuBlJ%1 zGqPiN&UgtDIEyECZYNppcBN5cyggIU{n1g;sK=OhV(r~bxBM#^^_$#m|GlDDpf_?% zi1yb1bK27E#eD7$xSnx{x7m;7-j5%rI^i0itI#QbW|0qm4&Qs< zx8X($uj@$P{(}CUhP>UC`~74zlA5oFo@#4kPZvBu9PjU$9F6X|IcT~Ac$1zA{6C*2 z*e(@E|EcS?$%TM>Z0>=69{nFtNo)rH?fml-z=h~Ukla`vyz-Vf>HZYs#^vw#k#d-7 z9qLT&b_Nrq7mzkw3pF8|=%Wz8y+;@dwu#OxmI{OoDqO z%5`z*kb$V^tXP!) z#q`Mpt^z8Lzi=yU&bWiw_eg3TvuPAF-uxt}LVt$fv* zEbgzn`353gf0`1YiK@4MfgATJ*kK+s)v@*cI-NSlF71lphxF?vo-obE_d2tevOkli zIAvCdJRNU56!nPht$$GNe*Q)x;o2Gh%t=1>NyKL`mQ$D9c(*x@f1>j2LvfkZRnjY5 zFnj0jp*P4n`a=P9rI;ufH2Zh7CikD1{bld_QKN+}?`wwm_j`IA{>CYOC_)V8mUK({ z*F>)tlcD-4%$3IBxlC~%=e;tiP_XjT?G6IbF9?RB$Ea~}{i!Z9wMM%!E5Xoix1JX=iD zJEU!Y6vO__WN3xOn>pQZV2<@ifIukL=%D4yvK#96hd~)7gYUNM(iT9gf+OOWBR!)c z_d4i8lZhebGw$bMWu6?+?KuW@t!LNM1Lbc58o2j9PR7Rp<5(?Zd#Cbtw94F&3a&Z1 zKH6PC9V~Dz;uwSLW!B6-YWSX3jUI{} zu?-C9mr{zJCoH_+F=utBB84TLOQB|sP66$dU^P1kcoffn`N4*Zsar1cg7)@Ym=mRT z&!<{44rSBGMXM0V(`habfbv8!QirZ&62mRTjPajRgP#m|q>J3c99`|4j`uQv0wU=U zvgCU?!ruG~RXU?0ic+#aDm)&9$rFkb8 zFQC0SzW;n?^5OsG>#Iq~;5BlT65Jn9XFUc9p&Xwnk-Je}v9@VBH(=a(m?XYl#Xeo` zt~hCH-BZXESW02=BQf}W%03N^PmlQ44z(+Uzo6MWRL}r{?V2jJB^BCOo@C*~4kcM> z-uy}=7KkaH(>B?3@-DVamEAcws-f+-!gD%N;`5m&s4i51|&el@q8^zr@+Q_6;^N!njDsEo)E|{ULsR(z! z>;54X-F$_#vlUkx(F^+%%F5|xQ=9E4jXW`+1ogNRUUMfw) z4No~|p8@!1E-~Je^hKd~!)SBuuH4tT6UW&U9&Y5i3#QlkrxEs>tG{7&MyCkY!!`SX zM~?pjnG&dHnPp$aMzpWm^cihNLL%hwk-cEd^!g3^rwj<383;H@sy~{4Jb=ce1tzer;|xJI^E#Ih}-Vy@#uwn1bm^)%;l$IL^OEn!4{p-gjiIkL!^<=e<*ytpT|9&P3y z@mvYt2b_7%$j_y*21};{gi=7hu2$Ac3EvcM5(w1E=l{Q30QQ{QZITg=bd&e2Yp%MM zbB{zHp6qJ9sAyTeL&V$f`fT0wmj{i8gww=tRWJ+oXd}g zxVLVP>DK9ZXjO9Bz4&@?Z2$G;d2RTZmfNw+k{0RB#P>Wx+$~Hjl&jQ?^e#tN%~X&D zO-2$?PPZgRD$PzpTi)RhVE#62Ol~B+U=W4zlCfx~{X6Vqh$*E7Bnm*WGIS5$G^jAp zJLdX%3It&+ENv~VDE2mQ3C29ZrnusDuFJSd%$M{&Co^Xiv4f9`3z0=Z29uBAsn&ee%!@4YW|74l-m;#be@?AW?}tVdhk{3ju>9tZRfOW z9;J6C8FGRW%E{cc>)L%fKuHIePRs{lN-Xt^53}7^xJEEjBxmkD1&A#w&dgp)CWLq> z(E1$bKL%I^f+s}D4^@wCe*^heO^)ri_qz52e&G*mHmX=c8iSc^rVJBjO7V zAm4Y73T$ieWS!y7iC@B)>f|+LLIuc8#po!_k4>CoI}>Xm+%PV?NwlZVB$*>QL)?gb zx)UBS&XVDo)z=IXg1S>;pI>8w>uB2yrjMTG{~!|s1IBwt!kT4KaC)7-w@x)L;DEU~ ztjKR4D*t48e9~Iv1V#aG)unm8$-g)}?PK({v$#Rn!szF;y+^u}zQK_?lNC}WDLlo! z(Z8ga`6Co_;C5@p{(RQ8oEu?J{+WbAJ18l z-zfde9}Yw#=bhM>6NVQBu20D1H9Uo=zn$G=&MOa382jx;QT$0t+?KA-*-Mt+oHzwG zoNg(L5(^RrWX(P{dnTT4C)+@=-#vunkGBk%(M!@_&u%t3U@mHh~YpwN4UU(3K$S>%qsdtpmx6?#EH@b|CkEYKEh_ zub(x;_v4-Gg_~BJfk{d^A{7c0PEUN4} zgeS`PTOCwijjA>Cg(G0{$LZfzDGsZsp81BHZ%RCT zKTWSQxYDp>NLH;)R3#k$%JKMyen17vLRKqz;BwbfVZs(YJf~?Ua%1~jR31VuTD&An z^A)VF-}q&kt%pR_*QqqyhVw6l^L{|k+svs@x$LDV;?Yk9?a3AzUqpiP(d?PUIMKwq z8;DZOj<^G}9#G5mUqK($BG0kkpFfLS7!=}b=+VD4jF;KBZ%+8&|LW>BFK!)Nnq&jC z?UnVXo|`?A%X<*kc2(lR|queG~wQwT8;6^KH)J zWJ2Zoql{YJA$EU4)JD0e<6uNusu{0zY?HwO1Jr{a9yjqwp+vyh0a6^I9mj<-Bu(C} zS<{1WY~Tv!qv{aM1>;U-CVxy23R_8jeN82XtpelUE^ zlelIOBg+^v%WjjVpidy<_d2p}Y+eK;yZ6cLh97A5M%l=DM#ueRJ*QvUabL;o!W_O> z$?aKsaJOhP@iWXX?RyWNhC~=_GJ8BFcHro~8H8(Rh5Tcmz4h{xK>cDq8`#Fy=CFG* z>wogbq-`3-tMrDlQM|s)t=Cby_HRPh&}2Y(ry}&PA)e9Na<_I^u06T{&QH&PXH;IV z%W9%rr+{Z3LhV3tCr)exdOX)XGj;|2VYd+`lqDMwVb=04)9%@D0o5pT=r)Y46Ss$U zKqizk$;Dj#h=#vpX&O+khP?6yVH8QzJ${3ru!dI5cPd;TAS7Uk{GxVvej0^0Y0-D= z9g}~3e9hzRX~dHvdxB~Ns~!e0W@#iYgIvQsxFeC{P2nQwd zW0-u%Whc46w%8|1ud<&ENM~w1hfWJ)d1HpTnfW9`94vV8^?wdFKVkb zj<^>SQ1z~t4Y3Tq@qx?Xz!am`q!r(O7@wJcYUA-V%Bgs zlD;Vlu&oedr;Hu2u^Rsh1aN!+G=)j-~ z6wxD`X3;(^?lUhEV`khpPK6`3b5xJD-;4joz=Q~l?TPU7B@d$|vQr|DH`kr>h;T*z z|EPMW@XVqv?K-xTif!ArDy$?G+r|@H72CF5Nh-E&+jgEyAMK;P?={yw z$G~N2njcXFe^9qYLX{;Wr| z%j-Yy6AIa1$XnZJldgR@P8~C$pT(}sMfUlwakfF>Md=6oK&^XPmAPPnr%w}x50B9F zlian;Q!Di=A_&+qAN)r81%<#fjB>DeK0XOKwEpV0BS4}ji~pv0(hz&bUdfIywbk9d zrK9U%Y{MDVFA&~JM` zztKECTHW%QR|TcWq;ySSB{7-bDUoy7Tivc-uVlXNUEMo1aR4Mu@DC;-S)vE()5aUW z^|2SyoAEG)?f5o0Tn>6JE_^b1h5pCF&CWI}@`T!Q(iN>hIb|&B>rCR&_KR;=S1A&Q z*Q@mq$^+ghu&__W?iee|-et|w)+zrs-SADqZjR_?o#@h=#R&4g5YN`3-1z=83Q=o{ z2lfq^Aox5s-;d)3qi4s{jP4QS9#Uv>GG_c!k2zBWacKdFy_&`n8(d}nm z&)`4#_B9nnFYA1qvWCW(yJ=^< zmti&WpIHi*mC|!o-ue8X76YuJ!`2y3X^R`G_rYrUE`~g zG~m#tQ4T0=RgIpn#BfD_qafE+_7YKC#e{AswAn0BsYz=@VMdn**Yyt>R~+dWpA$`k zA=#^g&bR?3{OIRkDnCG#_mXnknmp|0At|~)hFk#~-h&zsN0StiTeU3w!_QghGaTo6;(E3^uMQIUeQj&9}lY!Ua7YPlouV^3ku| zyHSjtAMydXY53{2n8_16G+YyehU9~JXz1$Q%X)bQ@A4l~8K0-DHTMuA3QglkNYiu_$MI-5Xz|syP@gX1ITaSMEbXKmWTy&IK`hRC>`Dp{+Kbpl_Wd;-D41P{(lZ@v0$C|a}or7#gi4d`8OiknK zTHtDPdOqJZ_E^(c9qB!br>^sTvEi&We{uSw&GYG{fws%<*=11P(`!j`+CLhbmz_=l zO4teCr1FpZ2}|zZ8Hcm`6K9}RD;WSEIP0WiiWt z38rJf=*+}S!^NU$fJ4;iVWqb_C{F^ZBHQ(mBF~B(!ZTP766A#oAJGGb-<`~f86h(b zk}}20y2CDrnLpGM^rtMx^$9rkkd2L3#~GSW=b>YBq&0lgXbGW?SDsx=WYyA?7B6l%oS?x#DSX^E?B zgkJ6YRld-#_(!Zo_4kio%%cj$`lg3!d+wCt=v}rr^n-u zUx!?risW|Y9=tBJ0UK5Kn%|E&^lZAI_r-zeQ)!q~)2mfSPwuJM8Cg5l$Alde9fHU= zkLjaMpltX%v;kreQKh~N<0(mHoIQfubc5GCppnYeY}aDrZa6I%vRLs1@Zfz@-rY$t z@#5bW;aR4I?^mE-u6CMQ;b6fW$sd*ze6*mr+}5ZK^la0^tkQzH3FJM>+03!MV!F!5 z5<`mCa_3y&?n~V2;J9k8LXYLhO{)e4yNx1BQKK>+M?PJIQP*<-(AJj@ZjHlZo(mah z#NWmb-UgZ6sYnhX$*~cSNdQw4d7UK!TPtxWDTI{3e=ob=tJ%bB-I5LW+&L=TzU~{~ zS@HNfZ-j2xBQtSY&rj{BRM_br({ZGZj@3@Upx>$3+OLy>>&@-Lp2i=dZZ~=uIYw1X zXB(%`r;wE2=|Tm~Z$Nm2y_->TtciMu%rlZHe4kos$O&5MxB2Czf}Ay~0816^KEA%W zoM%~4eVEP$30N9)ysin^B2*j%5}1gl{xKxj_kS6DM8q1<5jfHxXHCmU0K(^|-Yb6& za8t4Yo*hnpUXIPJJ^rfS?!F>=T_x|J0$`{z-kTqDG97CDn01A{8{s}0&vG9OfD-ES z>=ln_H-OfM@gwF@gk{Mx2Ybh28MhEMT8h1>PidfKBIx5Wh~1L-vuAXyOKJ{8LEwd1 zf!-|#zkl1X?1wP}eVS2EK`%Nh>0~;QHcdH2pX;P8Y!7v8PDBU0C|0c`)xVbj$+9u+ z#pa{DG0jtQ7xT?KQJ+EiV9hkiY2NMk(L&H?X5R))%VQgMqjuW&46KF*Mi zsCUTcOlKcOwP4Mgj169`62(7NJ7qNDE%hc_Aqn77BLH_soMqBCHVIKKG;V828nht? zuPV*kHm*86-O%s$QKxe5_KO8wUOakzq|B^Y*(!BTYZU4p7kbFHsi<^U-vC?`@=u_j zYOydfh^Zdvi#7lCkiaRlVph<5tFrAg^; z=E6I$5XKY}ANr(fo+s)wWw zkSI~n5DA2lyjL!pw+a+*&gTOnm~VEO?t{+87idBN*xldbFabneGG0Z=W$JD&VE9y# z{8<9%v&lfqUSdhGV`k^3Vo$|wfgzP>cEXAjPr7}y-^?Qrq(JXN2 zUQS^0d4=?t3XqJ#F497l1v+@E_xOfM78D5>$5OkYF$gNxAPO!P^c_>RUhPe#{#3s8 z`l%5H04c~`)WKJ{HrmTgezX*=TKyUJ-Cr?==k2bW=F@iw%GFj->MBM)bNzB73*(e* z&h=a;$}Z%A(yU?4e8E9Sc_;zI-(%OMI9}2W(-f+SrH&m1cxyx5EwDdm{Z`15Xl9oc zDjQyhQVhR>WR#H9s|H z&g0z_g1cegTUlIfhzLef@lM?)JZ~Kwz~Up7oNZyFW@2KGDM1IeN7>=DZ|KY)OH#%N zm)daAj~)p&LjM|Ih_%doq@xlY8#=OW|BOve;C!+r6Ig%P0)b2lzDLYUeuJ*QHP1N(*`Ntub6Gl3sxvC{Lo}EqQ1ZZS zCi4VHA%Fh|p)(#YJy-7iUbZaWKpAp8t~-HBgzE0OJd?GOF`;kbRLRjdC>t1j?Whqd@=JU824_uXq9U$6I*_McaZ$I{-p zov#g(i<`Bp#ZO<8bStdl$Hg5?uP-2p@ZHDLOE^NgHIU`f%93} z{UdM+OhWfYZaenO4OPqkjcSuZ;{Pflz1#mgy&t;wiU}-RySsE`ny%;nvE^MHEI`l_ zoV_cX9pR1IeEd*IyIk*paaRxZ!i}JsuTe4)7L#fhb12a7S5-U4cwzvD`jUPwe&hZk zC7UjIBUl@%!8U+D`j}s~_ge&E?6D`+@g-z=fDv6X#`Fd8k+i-u*c4>oQ}OxsnT6TV z4;P?vRS*($xkP9v{B6-eD+r8@hxwrQM5z!QgWp_nfIZ?f(ZO=|AC`qP6Mch?3EZO> zx{18RtEE7(I5vQL9lF@Y6lT$CS`>e8mT2s&#eWXk@&7pKUp{5}I%V_EeUmvERuD;r zbyMsncvaG6w=OhC&=L>s2X725w=tU!f|^#avY9U+()|#0wy^b7839I??2K)GO2dops6G7KDH;Oz+gGVQjvX{H7D49fziz@FHzC;>*#|RZn>5z4io2t4uoK}&+=O)5 zPb5E-GnT86?t)U($VyVLBod20WpOsjpZ(w#Xhy)+b&$e`j{{UxMaEi|YN5dCVUoP) z*!f07b4c&Hkxp~SMz13t-(BQD`>wax)qU4ot5rTiDa$5^ln>ZsbD!yJ-*bXr$`I0O z{VQa^c)l=zFz6`v&`h@!^CL7ZFVsPE$M5j$h0j>CQ~T=FjSrw3W48u9z*2}A&@+s2>j+*g6^I*e@AdUwf7kmuYuz1 z2$K#1hu5Qni)Y$n;aAb0$uM>`47@tF-@{;ivQCS=eEpQy=7-dW#Ih4g%X!5l3T`(C z)DHLwHdl*N$%w{b5QbApWh?|z{8aV=iuCcn+$*nj9XP~=_=YLTw?cUHB7rb*AVK6@%m8}_}#!CzTAzGdz8nJ3r_zZG+ zsxvIIS;LcH zsCil*-DEl0Nlkhg1w5GM8RfjQ#!KWfp_2mfEJjXwx@k6jWA5tTJNwM!R(4&)vyjC; zM6L1MW$aC?J!tn-Ac3(5O_IVD$r>;i52rcB4K!jdfK4q$$#L3irONfXJ553V%!;JB z&RHqFeR-LjJW5JTY+kp%$(kYCA;?CX*fl%>OU){DgEEUvA+`L>t{}fv$(y4RRIOC! zWggIWbzWxH5^&sY_rX>Vy2lQlIa-wl3!+6dGMYK(Pkbd~z{U#@`+#KBNED35AsB&m zSdShoW?2H?j!UbNf`UvbuqqX4Muh!Mwix*!#dA{LMS`n)IN9LOkFJmoUy~mz(T})} z^$ZKq-7Ua!>nZhD46{bGB?(?q#gsA9v07m zDEk`0E8qM`35fUXt#6cHo4WO1|B!H9$VUjXq^qzLAfrO>%Y*Lr1B;t6MMqM+9KV?j z`Uh~L9UfV_57|eA9M@YX{kH!ED_j=KSs|1e4nY-GX7AIAI=i|O7E(l~FUXInMoo!P zY0#_l4kE`CDNm*RZHa1&GhLe%tmqAu#CL0K^;wh4sq%I7h;JNM$90aL=k6`7GM(7N zxezIwacjo5?>s(GQ9%266_C_X&#XMR9(u-e7?W!i%am5MJLBG9UoU&G$g)y08U33& z6szM&Yikz;M$}pSgXh=Rz=&ciE>|&x--;{`s-cq0HvIHSKj#_Evm0)HVZ$ARdK>!~ zcO&Qw-7waMGm+Kz z|HQt{Y#qb69aoRYP7p%i3-~C?fsBT~CX^W%|GY7~;oc3`OjiC;VE5Ey|NE(o{cVT5 zk`iQp(cO75Qu4S+g;OIu9_P-l-)EeX>k;zJ1ShvJXhG}@+-}o^vio|{vx|HyCo+|U z_ZuMVX{I+7gE7T)@{m92VX!@WDPc5<_z6K$=YaQX3%}5L(b>mEtF?rR1*YmAA-&5= ziAU`?pL6q_^?F@2-SfLwTfRlmc5{`*EA|Ct{EF_p3ft!0o>sYZkM+<8qkhzvJ+lIU zwN$)KvE(tvBM{b|lRwE?)-Lt&j`x`dBmD8)?|i>%4?D+?Jowatv2 zn-m(@&sv+b>0pCm5#rx;0^s^^5|Y?Q>$8p}Vk9YSF52Ef_xhs=kM zymf=Dlr$mwm2>-svl~Z%X4Y3A@RS^Ukn$3`d9_cr58+CUTqjM1LSM;ABy78?4DE2p zZu5wbdmMQbQN&EeKPAS0D7&74p;f}MEOmOr4%rvnQ&S&}S-_!&(3W5uT!pZVHb%s2 z2ON~TFTc|fHqmp9HR9QphyY&(F~tDGbX>))JtJ>uWcKeiIeRplO{Fi@3Hu)|Q8V@c zwAXLP+_urmW%_5ie&9ybcsq8USfsOox9`gkqRtQ{ zW9`Psq4)jSq{j(dbk@q1_h8p$2yaTU-b~s1*((&d^GQGnli&CEtbKBwDZM=^acy&B z(6NcLO{r9={6;sYkisB}yZARxg&XECyZzqz8lW9!LJKF(^?ccqQm-?Bwmgj%0A6 zqn`8Wu8sHA+^^8d|6Uk-e5&O7GP-|Q)PHj+*-C!nma~9g# zb*T=Hqb7>oaojidXL`9uV`uV=?Iwqu|L?W6opyjQ#oz;pJex3_ z1F{o6b=Vc!nV5#;Bj~@_`NkO3VSr8|FTPADQQSf9sMb`>rsf$#Jnm(g?q7+`Vy4;SqFV~eIZjM)O(cMb3Zkko3@RR;Gd5&|*o zgi#GQve08e8 zkycE*P#35E8u4BR)!?MMuYY-wy&G8id52F<3w34qwQ=}rHhp0$iVAJyjk~^0PJTrT z(h7D?R39_w)KT2Oy@c%xO^f63A;J%nD(q`o6nMru*3IfA`pWw|Q%774Qm8m{GRvEP zlK{u>gfTI!7RPKo4)2#&rpmXAi%2&_L*ZrN7bHvvR3xQYrf=Yh<(QmYd-El!!EeC` z^BmJR)D!EE6R@$d97{mP{!n6#wr4F2ayHW+tzU9`4E>3#`Q0G>LVC4>td^t?zb9(1 zEL-0Lx$T@*e1<9;IR8h4QJkSe#Hu7Y)qsUAc7A*N^YLG z&)OhTpIt2^GSmuGdA9GHD#!%WX2? z8u%OQCY`W1-dEelv0W>v4(9zQS;<|XM&BUOK1r4^$qBOrXZ zy>|DS8Z=+sql_P%_jDk*#_5lSnRS$x9a%c*C=2T<=5WnG;&c_8wCHdTI#p)pfJRbk z?YQjT>wi^69FdCX7`+4xHU$d1Cpce|1lX7uq)PE*Vv-}Vjh|{HsdDDJEBN*Ge&@;) zL5-AQ+pj00^VID%LtyQgvsgye{M%LiGDqpxTOR!Q=lI={;iBi<)Q!FE`8(-2_NRn# zi_2!ytWVTWfC@%iG+c=v;|xwnt?Jk<>5~?@KGbtoC{HCqKGz*5BPZ1jZ2fuK8c6!*p^lfaS*Oy#k$#}++T zXF~C5tw`!Je~|{2$_i;n`77v%E97$X4fcTbYeri{Ps5s>1XxFjy0$-&C}&OW5^88L z_F<2g0TRwOoMOw$bHX_q)X$cAB=v$+lKdY@)^IgE4y*H%nk9#)G*^$qK>(r%2JD=Q z+r=No!8P<2z)0OXD7G`5#$ZmFI9;kTUSzcxLLSgJ<}muVRBXu{&1!8hZZF%OJ)>J88LFt0sx$UoC(JJdu}HA)G+eTJd%yz(sRE3P&Q zMluv^e!gU?`RFw#&~b6eu|9d8UEjH{9h=RMo%zi|Exw+#RT|e=$+%1`a=DZ1QSeAJ zKi@vh4CEEDm}0*%7Q^6jxiPuRQefOJCRnqnwGkKQJABc^ZM{bbsWYKsIihK2Y;-pr#j#r;`hvZ8aoqq#~<9gUZf1;^e5vW_D@LQ z*LaUNI6Vt;M@)>WS*nlB<+3~`Fmk!`7`uTezFfYHyY|ONX8C{mSCwz`yR4w6+1Chs z8w^02OBn?noILSxC98f=*8+LYSWo`?Yz&BgPbnP*{Cvhv@AfgAH{kp3RybLv1x!67 zwf9@S5bS-nzD)w>bk3Cg-F=fXC%D@!uy}QI2Kq3tA7acba|sxI&)t^~ZwD`~roxGr zxN8|*X4DBUDz~v6(FQ5yf;CY4xxR=)VlqRlxu3-V#D zC`5Gy_lm!N&00gYE~g9l)!q@+5fx)pDx>qa83^wkynLVQ?aHY4KK*VoLBIwb=_r(G zFoRsQ%G=>_kNd>x_}H5OdJyUnhBs#-hGa6!GeU6v#dZzS?d|p+%fdJ<-^pW*uoOPc z24icRDMtQumv9;q9cxa`_(3)XOsR~?*bwUo-G%a|>6%x6LXH3rHJTsjUYHm#uMyHw zCF=*y@J)>qNS!nbTI=ZP%y4ZS1U?0y=pKWOy)xhhiht3(%`S^Q`lts@O~J$56rN^g zAh+Ffe~Hv_IR2k1DAa#dL3{EzJpT7%4W1hxz<;WsT|BSzyIx-pOe!r@7W$oZek#Tr zKbOCgXGVfv=L@UvK6|iUZEg(s-Iw1p(U;ZzvfoSXQyBMunxeJ7FZP^YhvQ#lL;>&2 z$5I8}()asuM2oL?nbFrL_Y7dj*8=yufA4SV1>r??n0JTS7=_@Hx1+iOI2dyc6LNCn z*`=zw{{LpcH)C`J`j^W@JY5BJHc*t6XQcCKussgp!4-l`nHX=)UN(1EWe=lPY9$Fd zZrd&s`;;>dUxpY%xFA*s5?Sz;JX?QfT!@vO1biDU+CdYf*1C06gXlwQA}I!XBS>^N z#XWbHJB(S-@&o}-!jo%(@$2!R>+HB6B={PSHD`(Se;`-%-&*{kCZr|qgB?lvn3 zpIo1}aO`@QdZF5mJ1cqCxxxl=KqpLe)j0`Y1=B&5GlG5C=%LFP@4u?hht7q`vP_fE zxNd>XQY??x$RdRj*=vb@8%hVljxfqNgOvT#6K-H&py^%XH={+yJ3(pY2<^PVTZMPu zoDKigdre>q6uE65p5mV|zW2!I3@tV9{FGQ4qYusRgWXOX_$gkodWl`2`Pn2{J^tI` z-tSY24dGxcUNgpuor`Upd>Bcg;zT~Q0(;iSG(T8v!zI_$gc5-EFN9j-GLJS7ezq8i z;+zfKAf|s<@FkkkK75$9?PdBtzoAZw>NU38vHX6jg=jfQk--U`X<|T=nt~@(0)IH@ zy6}5y=Q2KM<4_o2oX=S4f2f`CPg0Uw(bBTQ1w6E?VcF;Hbgj9?_UnVMUH2t?32nv&p&#$9lNF z(m|Pg?`uWCgBhp;O}|PEHFl2xtr;&ZrH0US2}% zCSPhlYbsjZ7-tvbP=Nn=iFLs}^%|hw!bs=aAeEq{6NXZFb9+-LDEtX!q$Y>Je?Y(= z*-H-f6S?SKCV1V0@LnXkhC^Ww;%IzaeFBmxtrE~jxx|f|nw_g(jI{g15qZ@H1|msK zayh|j^C0%44ny!_Sz>Y7K{==Z3r#2P*GF`d^WXL%RoqfrmcHGz1MEU; zhb#W2b-`*K6EUzIj+QZ*Z-^TAxn))#<`ywHGHz6%z=5nn)H1e2j>X1Q2b<(YPq9Fi zc|7J?hyxlp0d8H85PNC$2wfG}1VN4V=S_2O8~;4_Dh=Z#Ii-O(bY~Tf@=CKjo#-tCYLhLJS;Qj*+9sdPVjh zdu6T(&_9TXNlC&Z^%+_>=tbpzgcA+y)Zz%TmS*7=zaKJeRNp^|n4ASr+ zBCPft#dx9)sQm_dy}joT&+jaPy6~2m{#J=lB~Y3sox?K=v0p5WR#B)Vy+t*Hkn1!4PMe&?*`N%u<%SsZ+^Td|wXD?cfVa*P z&4>kEI4Eu&_g$bv;L>nXu{R*+F)vtXoY&V#mD)zat73 zhM9-hI&VNd`CDtk8x*wgn)P0!1*I7m0m4#(aS<&KRMNkQav>8{yr8|Jo>h-9{{HPF zHv4>8fS;7Cp`op!@;bW3uGV-shJcOFY>@^lYXNgxqR7zhpzP?h(9AZ@?qIdf_6r}c+ z$iavD1G)~$Qbwho);!quVX#bfEvSv3$i{p7z!aIK+`1g_2txwNd!Lc~}>at0oqQdL3H|-uu z*`XpkCZ~@ee^`zoIEkUFd8JbtoV-XY?l#r^?>Dze7SXTe{z8{7bFa`z-XX>uBWT6H z)0Kb=gvWCrkluA2%uXR2enFsZSMS(N@VJ%o;WuZ!!g*emr7RQY2r9aP@CnFJ>~fOW z=Lp?1L2Ji%ozC~Vlwh1@>SpGM=gVYkK(L)XZkopbTi3#Wsn63_4&M&SnwIUq}rBf9%BQlnW?~9-@qUjFmZxICkx}Lv1SOFf{{PjFR4U+9T+EC~t0EpXGbQ1HE7F3lMv~`U} ztiZsGAM`yCR-*j6K#2bx-YG9$Tiz4aCsRtodf>#S&B#CV3ysA205^WUdq9&g_4~FZ zxcUB`rF1RV{fyhzB_6AU+1#=3nFp|v&U9GNX?@xM3j5+iBMx#BHUIO7TI3{fdfVFv z9ptr`$q^K0>Mq#2F~C&vrAGEAR2!4e@^O_LXl`!S?S)*oAfHg)MgPd2%tftUcCB6) zSVuG+OlQwAMe6xIR37|LSFf2)XQy_j1g4_d*WFJAp{HUVbdYQ;U1B$o6UKRq;VKT* zXkHn=ztd&X>zb3Ru8-OIQbuRZ-oOjb2~VDy`5cG5n$V5~+I|1eBrMh&oo`Wi4WwRI z8w|?kv0N?%gNVV)!$bQb$B=@5HC5vq7_MSsbM52WFaMhJKP`e{@tFR0uj;e5OBoBI zrlod^j}0(rN9w#tsAf9~UAxGd$IF*|uw)y)x^pTH!_gfCIvdw1P;*PySe9wXFm(NP zl~b#Y0`n#%LKgeX8f#S(!)pYD&fd4lrFprzx%*b;8j<%-u^b=#Of`)}@l;INqYYs9 z8N|-E_0zC1n%7qi4OZCO%NyH{imgPlUl_F%wzEA20TSSmP?(6`+w67zGu`$KZ42iA z^OPRG|#Uz^Ekl4uI+k$8zTAZ;p=HVpT+m7@d7$sh;?tz6m$Vn9A54#di#|| zNX`%SiA)ox{sgw6>_N=nfuf479ldc=5x>ohxlt$m`m5x@3 zl$^WEhJ&q}!=&4&%YQJJiwkcU`N!uov5((j`Zjrjr8mQR_$LY{_q4{(R-OO6?e}|; zGM2rr6p>y8oYL2G16dBVF(^iVtHLgrBs+%s@BHrY?o6j|szFp^8?zz;nr;Ppar>KM~IFnw;n<4wI1s}YrfV(JVDXPgH>G}0Z z!Y|i-d4Oj@rcAq`scagH zZ&Pq?4bU9xB^u3l`|LiN_8iZIaJ;L(Tk68fjzo@?A+bRVa5_4#?UCLsw&NVVR|`B1-+SlB39F ziT6hL)+16z`pYYaN954^C^#4a3-MbOh1R-W3ELCGZ?2F3I| zvkj0+-H~0m(Q#7ZuBL>?86N7|4;aDh8mui!yUl@TyO&xrX*O|%fU65*o&+=mINA&r zZmi9C?ood4MQ-Mzn~BY~tL#HQ)a^QFm0|fKJD#<33TknGj_7AXBfgF3W~QuSjFl^L zT_`vMie4lErJt}$UAOT;QFhLcs?~PZ+6Au|jC^@It`9yVA^l!llV@{wDdU7)Sx}mp zsqI^1GJ<0?Sel#E*6qZ#tS?deskd{sR}PlH=Mpmb*>E3hYHgc6ez^SMhjlu0BCE(U z+LCbob)MIchsDTdlq!f5)W%2QtV`>w@_NwEmYn#xRlEXqSnCYHHuU0{++)PmV81DY z!q-Mdvqqrc-7llz^(CCL@aoAYv(kz2#s#eb^J*>ETIW1Iz3`6*pu0w4?a)W%=nXgY zaP+Qpc^@Fn{L3u*N5JEV(h~q>MlfTPOr|s!J)h(44c*f#zx-72DcR-rcb6iN&5&Nj z-{KX47VnVUMDCWua(nTy8ski-k6$E36)zTVxO$jm1lEPviPb+K?=n7qbT>p72yH{D z&Q#82s&$>S4>7}?s%c(~ijjb>PLcz{lp>=U$O0%J@?K0%z09BLI1hfv!K>Dt)o`_N zInT{2w#|aG@uRiZFD&PKraQlylF^MHSWnaIpXDnj&ao0Zwp|z7^a88(M-2cuw~6@P zYPfAwTnqDt24T0!tdhFm0%O0Fc9?$pyg?&3*7v8usaSCTA=(-ur^2W47-vaYybw>9 zb1EkK7KZAJV3zn(PAXo@SVyZiK|(#FXwo9Hppf+`k)p9-BVWbLS%nP6AJVgEsgmQN z6N?Q|2jt!qp$3$RacWf+=_XOo&(kTB1y%TUl7kr2zYA4P10`fWMLKq%m$Nf zH)RBeNmlTpR%nYKyv_krQ|_()rJL4#x_;X?-cH^T)kO%3nOEkNReC^D1+CVOU)E=? z5ZQN?sIoEmm_|Is#(&rjG+03QWaYA)yas(Kxv~mXRN@Q=iXraNFvV?%V6+DU0H0Ax z&|8pY*6LpNt!LUfU^D+7wmuzKA0KslH9=wcrj_kqz5P$)JI_#VVb%Teo8xGRg~pU> zyBsb+;&yTNr9o1ecy4&&=30FO*=l`)kI99xxxl!VNjop>Aw{3k<(QqjF%Gd?vlAEQ zY0{U)YGgQ_o^)#Pe15U?Zgf@c>&0zpIh?5VnA!8l0MEJX0o|7>GoTe-aBbFM;Ji^F z*FcqC>t}E)MRPS>!3Gk0ToGZsb2$IsK3-=n{we`JQ=?5Z9Mr^ZO~IZO?jnwV`x91= zJFD?{8Hjmp6I>+#BReuTpts-`ZWGJT`HCxxVuntO|BnR#+O~D$gsQFjcKvf|DNFba z;HE(O1OGZr1oQN?=5URa6GmoB(|AU1Et>abK}B&IJ_@NtQK`hAeM=MkuP3$t>ZE+Y zB>xLAByo8kOw>AiKmzkH!Y&C^6Rf1VfPvo#Wn%HMzJHs+jaqKevh-xx)uvtiLgY<8 zL!T^DwY=&wz>Q6Rgz9Vbj~gJ}R9qtj!9*R)l*%sHq)o=AU{t<4A%w1Iq@BikKaZBjeooXxl-0{76DD5Ad9)iGMGjVRgcW`Y4I$J@WI6)X4kIOFnB0Fk+KqmqQI& znSw^um9YbA7I(#G@qQ?!UnOfV(n^#n{H+Wn_3EGD8`7(^;SVHvlk+J?&B!2cgg2}y z+RIcEz2*}F%^;0>x_{pAaZ*F3t)q5~W>51M8m|*GTE+vVw;JpcNyj z`YWpEha2imnJ%c?*V#9HNV((u0lFWaJk1tA-&}nsctQ2r=$))4g?&Yu&9gqe`|fvW zJe=S~p>4f~Ui0;U`|qkv{54=};_tIg59aN2p!HKFz9kZ%aKQ)ZM5F2e_12nIHlp;c zgBH#Hxlkv#HbCrs=125H`F%fx;Bd$r7|4U8yE@bQUwe6L)VD-p=Vkt)b*>ME+bM07 zVqs_CUsnY;1;@`ss8s@*h@z>>h&J+p6z9%42`PbMCQ{hRa+NCwNnS^B47Z=ST)b@h zL-=hE?Q(BF1;$_NL5?aTgBAzr6bXq+qv!3W3}2A2Hnn2T@glLX8J^$KZeFw%1(BaO z&}Ulj_b@;fqx6p*QWaBCyE$4-@A4VTa`%LiehW-o(FgiWoE}re0#3$L z!J5;5f)1zZG)8(`>Rbxv(1CR6cXl2_wx2KJ>80Es!7GS-fr0Q+<#)eCJit5Y#j4CK z*VuZS0J2$prt`9D0`RfLE62-J@%pk^b~Nf4Hy(K?{j0?CmVby_3-N+_`}Q>yG8OUM z4(fC??k=$O!fP{uY`)qYXvv$JR7>!AG>?0EDgBCtZLd^CM(I1Nyro| z5B>6vEenmppbP4P@C{;We?*+df$i8HYv!-g>TreF&W!*k(4F-lQJe zY;x*g1m|+6+$kP#&}tp_O zxEzBnEv)PBqxFfkWzXJivb!C-gp?{92g>vbeP`+KB^^ZjGP$2=QP<=5<0zj#tlrwE zO_#NRk8Xxeq2E{YmyYhA{m?i*hAU4WXXf)B0`}KDupg-N?4@2ivAvW_cDe7qNn6d5 zV9Fdp2j!I(30&zg07SySrG|;fEAcaj(p>ey+gZb5OmnCfo*GG=oPq%u%N?Qu7DWI+ zA>>1dN5a`$5I^LOabeVSl*yE2of(u&@*ld7kqfQ7W$?=kN_ozIyE3DzFzT6ms|A^e z7CZsdK>pCNy7N-L=hrHpJr}9JDlaIQw)M1)hKI)xogf4lCNp)ejw(Xh)UBGsb*PFx zk(n1uAh4SlrD=g4PP9B7RY7?8kO%Uaa-kF4yVWY0;tl#HM=oN!o$vg~;fOh4 zP%*0)9-;a(Mgjc`ad>wdMMY7}!7@32!>z>I`*H5ZpoK=iZAJyoo!F^<9ROqc#C_kb7pXy5(GQaGNN;w5R?aN zRHYt|!)`UooRBu;<^085aCW<-U{!T%g@+-1QbZQ_jt zU2mp`{Dv$OtUCk-nJn`U!SCu3W84^!jelcK8Im_-ulE4eP3>%giq>9NIF1VX*TF$Z zoBvL8f#BJL5^o_f2b&&JkWDF1fIh9=Y}i@U&fhHA@Vk7@Eb$@3AShKO$heKzWbH|Q zCX|Ae0KDRVb5;bZaZ#iU@gm~(fgYpErKeL>3Ed|rVgp)CJ^B(J1*nC4@UM|1dNka| z%cI{wx5P>}xvo+9%mqvzR#fH>hu=$`#rj||R9-9ZApSsIz-FhqHXf&nQ+r_~Slz_0 zC}HmJ*=?$PF(O1TQq_D6cgWaNvhA6@Rqp&!{&I3zN0Y9e6D~yifhxOh+*Y7+x;Yay zJ}e?E1cZIHt~MOm_?VgtH^2rkGg zjc^VwU$Q1~8^*>YM8W3p*O>oO56^2-9-k@v+TP zH^{&sP4XDi&X31~Qf9symlOhEXiYYxAE-CaLt`tvZ6+~J0KJ8xQ-f%&&1ojg?$GBc zhV{834$nU%LGz>!Fpy}fP3wC&_I{eDEK)1YIj9kdmv~T&1Sb61B`?h!5F^_XHA%by zH7%MR#j{LVnk4Y#uL;;QX{3c!^BVrz6Q^UGD0YoS-ffS4xRM*fC?w}had2BYGMD!@--QkuiU zf#K%o{kxejURvr8YtIv~uFc%oV*~0Kdea6S?=ftd-rT%gNvC&|2Tyg7KRMIsPjOhu zGx}+`-k19_^w-BKySklMncABD=wz<-&O`J9@tUOWnilKMAL>V#uLlkG2kX@jDy*O8 zx`&CL#6cf-1A@aVaL;&o>AWroMO!na@?~|z*K`WMy1`~#U1&}s5@p{O?1cjn+bEyd zmxpqcN^{I<_`Un_a@xu>ji(%Y(xxp>qM$S71qQ{m;U(JzL2XVnny2##@*fB-Q9w_y98<6-CY_x`Df1DJLk2Y>S5Pc zYcKVoD80Gc6DStju#G!q@ww&ZQGZ3AW79g#*1#iUP_3LRp&6tdp1=7T*ol@cQG=AH z)}Fnmnk;2l`Epir;>V`e>L`8VZ_p%l^jq?rPimG%M2dfk{`I37nJz39NM0|LJFgL? z%RjdR*Ny(5ou`o3lt3)ebF#oKcR^XZbY^_fP-uSDq*b%!^@uOaC()H(-FJo*A6C!P zRaSxib&X$jc~NNybgG$RKFa7dI5n%{DLce2cArnYyScDH#(7^8RMD{)nYoDpml`4e zbn2|#WVT?X0)HDcKZv7wM3{C|sQQ%;pF5kO?CY|;`hnBpqn7DfLG51-6KLy zwGD!h1-wEY?PBF@{OsZ-mCtb&g?mrNM~c>*H=pTL>`m-$KC2xHReZ0egETIqZ`nyh zqWALJ1H7KO^Im0HTr7K}2U@@tJv#oOK{>hg@u#ZVe{DWTK@<)>2a|ABuSy7{lox~# zx33h9tMSvbCXy_e!c?Ej%J}nv63#4YuPPITg`+gU<+15qpi#N2T578!hLkt@SJ8dy z8#nQ(l>7w$C-DxV>NDX{4<#}vs1-$Oh1?a4%Vz$|lSu}Y!w;>-ugtYrM+c9sZvVUl z@an&FwcJsi))~75Gc=WQHt`LOS6A88rBjej7LDNzP?K0$C=7D6ZDSTH}9NhpGaX z`$fD@!gW$aH#%EDp8v|R;-{)LK(8bp1&VW+$^j0(H;~v!p@z^Kw+?1*&C zqtmWvz39Rbo0d)sA{h(e1;Y#6g@{Irwr9?Si8(T}&<2G>7Vsy7!a@I?UX%0V16LT5 zM#?FzB(eQ=%U?oG$IiDS6ZnOE*t`6!*FVH`YXwPvto}El$^4JBsWIJ*H`Ry9_5Q@o zs_>uR>VF>n7jBb+yMT0;i$V{|cc#2AV76ezymR6}a{a*fn~j~Z1A(=d71#`KQz--( zE_&T2@uM-bBl5D5;v?a}H)-!{?@F&1{CAh|%g4)`d7GEb?5a0txOXi1>x(ZVsQ8-Z zaI|R$deM}j4hLk)H(i|3i{hFp3IZ zcQZV~>F%nu4+&!%rX9;98i%F8(>&4Dea#XpJ=Ll&XV*nPgkBB}#oJ_S7?g;;J`?sN z*`?1Si`V}$LHs((8>hHa%={Ksv$Mhi9Zh1EY8)ZozqTZL{U#vV;7yIe@g!60sXpHK zXjO)kTdJe_q5ZwCbE>shY1!m}p8M1YX!vO5Q2pVv6foK;RGIDo(t&?9QA?dz_S3^+JZii0iktL z-4r?(emlV2eE71Qyh^l|+}O`T^q9mIBO;1kB^$Cse(D{SjocZW^;(?sKCd=AuC8jj zvqZEMk7aEUNMm2EJ)C)Qdzrh^6e=P?W7Ry;Ep1x!@BU%^cd!+P`RdaV3i~=14`c1* z64m?@l>?QX9D9<-8fK%V{w!V-^c4L|V$yNcb~ySfK%{xAOZ;$@K$dbmg`b&&kQRnY zc?KPtH1H?nwog6Evh@z0h$oL`0zKWWXskC3=#m6amDrH5(J%FjUW9n$)S5>MVoBIw zOVzw;yF{$M2Cvyfckb$^2!m;^noE3ay+(hruf&V8gh-=tT-E+3)wIcDY-w7f>m;H9 ze`?YC=QzuEe^R*zOMpU?Z9Svw+O9{+^|*=mOeNQI=x1Qgt(=O--LIdc7eLBJvvHI3 z+lg<+rjKP5#Ca;9}iOE2>&#;20ZXM(|^=h8Ozi9%eb6D9iNpD?Tk@q!c>92E=YD7$@l$`YRyI3^V)EWa*3O z49f+`*&x^ZOeE&8Tg$lbjL~Y;sfuYXyBXl4tvf5^*tllN9&D36TJkGl0ly)m#;o%M z_ib*1!+ytR+WT*X&#Ra$l{xibwMB-Rqob$%K9-6WM^;r!7v+HvZQVaZ*junilU759 zI^?XOSV9-5TRpBcH_{c5-|Qm6K8O1%X;#|Ru-cc+e9v&ZBO7>hlG;>gZzZ0N#zVpK zn#!)a$q12sk$%rtc=6MS0(>N~E32ZTum-3-mKzjrsC-)Lpi*4jRuNjUA$DU3et227 zuHNPvF4fzk!q-}6i+*)W_S#PNOR!Sahko*KsK?UDbgidtHxO=ywcQSl^PASi4h)(* z9Jx>&n z;YzG+8^xBu3n2izs3}0Hop~-G(*STgi*ne|#qkX@N^zOP6G2mOej7f;hTmsEExg)s z^xN|yq7OqqQajGG)S9PL2q~GI*ybXC&o2kE9`5x70^t@d(B;!uG8^n){v9=$GnRdL zy~fY>M~r>&@Nj%yaJCt$>Sja^-9Jh7nf95C7(AL_uq09G@1<0Sr(~mGW&j?dq?-?D zz(NnHCpJAv=}w_zB5kLE(8wWJXl$+ZfsX)!ir7EFGd~*_c@0X1`M`s`=2Xu*x}|$o zVp{8qaSFqS`2ogzg1CXNYo+D&d=*7jbTI5V8$ zGED#&8`Q%g7pyPzIcIN~#ZeouHSIrjbwMg*6b{fZ`^6?mLp}6L@-9Q}++)l)om-S0 z4`FGByb^q@2*+oG7E8eNyhTwBFgW>+Ioko&`Xqc*WCioYLql7;MCM zIC?3i{4-Lk<%IN}2NX{gJkiJ0o}Z|$;}gSZnc=WNieRnMIqD;x_8t&=X(0c$sTKD$mkR;AjMsVPB+ETWJxijX z2&Pq{Kg8sZaGV#5$?7FEw*LaVT8WtTMl@-e<(5R}r6&u^dt~u)jOyy?$^~Z+ZL2Cf zT8SWtx?x-XtajVVI#!p{gmAR&-{XTW4WEsyCND>I!gb5<;_io)Df2sx&K`To^m#kr zDySVZM_IwfEOIOmCFPsmqhO*opZZR zKyduxywD0^P$OuL3VH2MKRcVdS|gN9N$>*Aw!y>?aVGi%{Zy~Iw&;(vp4ZM8FMJkS zw-tq(?+kIk`af@7*Kx|6VziYK$sOYgsK+#9cX9l1EGob1xXL3zG0jSC>aY>% zq?Z$9>@d1sA3q-s$q;%=`?FUrV7H3hrVHdlTK~d}fULM?L!do51+p7`Oa^(7#ymhK zSA3=s6x{8bz>IxtiS{f`9tuGF$el6t&7(B+%_l-O2EMLKL>E?MVczRzF9Iv-ns)7lE(Oq-R4=jz+}(SD1r{LDlC3OnNUH7$f_0dnB+EYvzTA;82l z^H$~+<14rcUif;?eeh`@BtcU*78?- zTi)_hTs+^}eX!w_Gy&y9PWrGk%2BZ~r_lCSL9Fww7D-PgqMGdDO|6wf(usS$)Yi(a zdQWsO0ZuQKyH(>6hRoZFAyOuhWQ*v3vkQ6v4U3})>_g@vYd7nc`RX=@Co>RBAN$t4 zHEex!nuIYHaN1gxCHH^hS26UNLp#x>m=Kj6**XzW(8&li9ecr)J(0dZ+0WC!FIXe$;>c1TW zB1&+?{&_YhO_Wq3J$n~n6A!PaH7?8Ftqda8oT4HdR<4Z1Ym=W*N23)KYeycw7$@JU%va(QA@nVZscUXSt2Jkw4W3pL+$*xc;Jj%qqwJjZ zyk%6OECzKKAy=k7hM(SFZkG$$+h?hBZwy`WMHSF5f>eFN4K~F#nDmx#*fHE{=ah!G>5Dql!2ic=%7Zam{x0 z{@M-Ccr1t4^_VNs|XvpUhtbG-y`W`4fO5Qo0{&SBm_{Cm+ z2T_)dW`T}{cx^G@Ak-==fbQdG2cJ*pONIyEvX*VV6BNVvCn6`p=(4tlX#1(UakdaL ziLdL5#d(oT;1~<#&DT2MN@R?_MOK7)8+4kOu*^Bq zM7P8zHxdceF$l~g(*9XJ&RS2%kLY*wcX%7NFD8e)SP$bnxb@rFz?Q*%#cv*=Rq@pb_F0eG zfXV11YjxFavXoe|?m-&78_Dly#2QEFQD!CXM<^L+goQ;Sigl$2f7%;E>lx1P;4t~X z^f^zF7_v$(VCs0#RIuFI${sq5>w~yQ33HP~;ecM)YH!fuLwM{@a&4#D-VKHIPe`wW z6*4jrfV`SrP060ZoYb;sx>B|JY66TWiLW@T0mG%ODpB6^d|O7DC!!*TUzX*PJz2fI z)3|Ux37C<$g$)^$PKA5heD;sD$}yE_JYWwV^{9GnpObGhFMYAYp_-5Fyfys7OTL%Z zb-g$1#SPT}YQZePXY?YPb<;e+s>1RBWMGCl^=X(W0YmpiAVJzwD*m2@yARGvt7zVV zwjz@j-j5ByQe@#LUdk&~!>_o>tqMo}%uyfO%ar!2ZJz`?7N_p2F!lr`Lo7!>5`~{t zG|wdO^j%fN!AB{JCbJ7QYSo?-bF!cZ_AR8dD9boBjh0&dmzU5i^&38I+ zCh}TuLG)gHT4%wfofwrudrVI8<}3C6OtP9`ebsNho}3tvAg|8>Mbk9EaUf9q6qFpx z-E<-Y?9glb6dZl+Zog}%6ntAC5WHrui9har`w-i z*rjTJ$MoFwZwZMxiLE#nDd3zT5#SF%(6#-#AFgRqo?H!+*VQf-UEFZfw#Wf9>lee) zWWA?bslSXUVr01zf!o6eU$-97DATV9bcjHPC)z4_RK~;_M!|;qSPKh&v8mZb zs?NUu7{U^=)`>O!Bg<$s+Y7z=mN?yU6-MGC*H^+!IDhfFYDe$<0XfY*Miqk1D}Je( zm??PJX`6rNw${?Q;{K1fiI;_@r?zy@-t<)gyvrFYots`ZTnaqNnT}bi#rF`{-VgA!gX*Q`Ey~$SuqDmfA7fcbD#3f+SY!^Zv#4N{8VYj*>itssdDk94#YgTP& zq|9cc9YKNC^utFQG3IQfKkUcsoSp))|G;ysr)=kuju}RRMN0W#$35cD6Y~w~n4^qN z@CUK)ugyWBig8#=R>iBeOUqwUCboaS%W!gNEdye7I}pEf*0cLfwXV*F}+ey2v0u ze#Sbi08G|E`$rTfK8dE8K+gfAeO@n{I6!1wG;f z*C9=U?^L4F+9rfgDR>k{e?kD;2tKSIU+>Qoe(TCVe!`}oW?C>_1ZP?4a9$R_Elg8K zbVj*&3GNBfANVv(H4KtcIPBwqShq7Mr_$gWs{7uqNL(l%lkUPe_69`9jrdVAZT;=X z&hrjt&a0H$^OZzeiy6Sr^UIy`x?)_cU%!2?zSTW7b{PCUe!v3B4z8HZk3S6Lu)_vs zUr7nXEC*=l-b3W zS}ol1Ja{4D>52-S{tNZ{e&QkaE|jb5ITC*o5H511^FTwFU2lCjJB`qd79}bXRnNK5 ze9H~WGL!~)Xr3TJuKM!<%krYilvmJzS3YEJ=PT zXrcp&(UQi{ZJj3Axyc+H`bjTZ*X9(0kvar)RpRTJNK5ttTW;8S=7v|1V%G-Wa%S_o zy~eAUmJ32<2T44YW4bn9SN*1A)w{$TV2-?iF+tKvw;eO=yEa-P#c5gWssXq)WH0en zI(-uDl?HhuQfi%6-k+RB(xP4le$%ZDcU~2}bOZ=KC2g{)!Zi->L%Z*1q6#DJ{&ud> z@sLEyUdYA0E|AQhaAc>5?vx#1oY_T^52bo8v-1i#vL{JfZx0b9M!qm3+6?MoUA$M+ zkrxF@qvr&N%8&n#3-rGj(n1)Gz5ih)|9>ocsc63W;{4`tfpVDilrQ>}ykR)gb>A+0 zrZes8-_V5;xVrwHF4VO0|-) zyk?FxGk4HlJa)7|UeJ6CD>WZKHjQ{Ldm@`E59pp1-M+jU-2c2dFyFV1yU%H2d`zgb zVi7!QVem&WeIutae;vD*_8M+Vf}-_`>O^7T^DC_t`NO2ivKPC7bGWzGIrNuTR%|Uh#*mzWxi`=SfEuyO|`gj|5ZPo`Xk-U~~ndMsNvdg)v$?nP2 zj4706T{1VhqH|~Ez0@1KsbMp-^C{BS^yMs6<2d}T##;Awp9x*RDh?g$@N4D3jjp^A zHVt(cm&ifkj*{GVZ+td_ynx#p?CBNIdr)-oY4L{joV2M3Bh){EN6r+1FymQN&WC0; z&sUmjIv*YaBS4$^U-b3s`(=|il;Zpu@9KU6lT2;IWc}A*P}EP8IBUy2{|Le+p3pT>2}DrJ|P6g;Rb7Kk{z(hXLHjs_oeV)I+n5?pz_ zaSw`(To{}SHB+HO)>&aO#;fXFI0+|CgFe=)5jJGUwk6EdZj?`%=}@7&ph$a&rI-** zJN7ij>NwqFzoNVK>FV(JI~iA8t-OycUwY7;{ZirSce7x~%=2UJa^Hjs&=O=3Dx$oP z!%|vf<|7rRjq{mg=zue041X-`%{BG)dAb?Hf5t%i3;z60^+M9`ShYm`4rd!cF=F8i z^VP-^bB$sgq_j0~qo1zDC9m z9_DXMD~ub%hSsO08jN=d3ruwwxptqFzIx8R)MnB#*S3_Vv+98J-%Ew?S+21QWLtRW z*4)V5!x$Yg2|A*_8L%>6<~ZVxcc+5KVHR+0kv1oMaAqQJbdO{%DZOr~kM*9tkq^Ij z|6G}8TtTk%f+xIId#0u(XY|pg`!^`L370H_B)iOKro0JPHbhnA=Ooj*x_0Y%McUN& zn`zM_p^58DYwvV0IHR?mRceKwQQTNPit8$9YMRzgj0}burB`?yDsk!aDj=q~T&C0v zuD=Daeof}V8#e_ZBfloS*|rJjqxXf;cFTWf(!y^}0_z~S2pNvMXf^~KC71eJkNiaE zpO+jxlG|vw|7-ZL=PWfDwZOAn5td?5Oe>nG$mzE=uo&n^DD&|f1or$f&@4$DH>@<_D`lC-&hbcuXw@jCYCjHmV6gJ<#pY{Tg zVSf&yjN!Av=b~BTK3b6`!qkMFC>%yBo%3(K>N`4N%7i(oAo(Rsu{LndiO0n3k6Y%i z&3;pp$*FIY{vMg*A%4gPKt;hT)834s;Of?@a_85*7IQ}`8RLy1(SN@qw}ah3O3nE^ z2=m&1{#zM=Lx1%nayQ-U>U|)^Sp+np<6m|PhqDO#taa!;+8AsCyx5Bq%g0w*Hg6X?H*`EM zn7uD_%J0|*w3gE-Y^r?x3l}d1EcsNnD0mg@;$7tWjO8|jA58wzCy2y&k*@58!v~?) ztHkwE-N%Y}jA!hZZgi4t?J-&Fsm0*a0L;h!Y4^gw);K-q%qRnZH6RL*;9rzhst4)j`gljbOcvd5STFOj-lLT%=a~!JD9>I zKvm3|nD|x0ySQr_LQG%GjCAkKhBhJGi~4u{qsIz4YQ7IpCn9uMXqe=4eb|}dsv4^m z-souah&l;b5>w!r)#SdaonW94vIYuq6ef7;>F|OC^M_|Ia^a!<{u?G6C0?ag;0g1W zWh$;xKJwamb*1jVahO=YMHPBED{BQoAs;Nyp%}qW1bvQE9*Ou6{ZZJrhH6ecowaHP z&W(!i8iRob-My6Ze_HBoe5ZB2S7Q{E_WJ}a=ZLf$i>fOj?Oc1e){br-gR5g6j#Ki2 zIu?SV5#~dT^rAFP8;psoQaGLj^NtWvRtw%ApR?+)wnaC~P*+r&8h;zZPST!NWsbQVGY8BZrDzbHJjY%-fGpShL-Y6a)ODO#tm-D_XW z?JNjTkb4d!cNww{dwg$IdR|0=7$PIDHC|~wgd7M!QYOO_#Jg?=*tswGr1Q0J`|OdM z3`0F3r|}uqmE|R)Hce{#YGVMqBmStc&fB{)`e`<#F;$Dn#0I*X?|?&o&(-*$)N(df z^G+|%Mz;Zm!>oX;D&FS(T>CCMqjM zu>P&(3f^I~vvarKcGm^m=Eekgl~D&q@NU~$G*=M_c zLL}ohi82s#fIkqR$3HYPD0f`-s`@wsuCIF$p6vmLjV<#<=*NO+jy3@=3IB3Vj-%kU zY6VCI7&cE@18C{I7N4B*^eWKgG*RA6Z<~yDA=85rSohToH!gQjWquafhK*%fNXJfg zRC?CxH&3Um8C96ArQJwUFD?Z{)dO*4`$dI2rcQ_~D5Mf}vrSqNB8A(?oA<%xg`Xzf!b@6YU4^uSVo|gc-!M<4>jpP6JixLq15IdCD z{9m-`e+8ZViTK`L9yAZU54_j4d&&RR_g8xDGn7kJ_2 zxQZPB#+}6vqUCfp@`Tgc({1f32wsD+>0h@Wo$20L&s4V%3($I-vRR7rMGGrm&HNq^ z^4=fW-mdU`+0Y)h!o8cJOOW?8HufhhKQ^%w2t}vZ-B51P!cJ3$*HY<<+0))IA94g0 zi3t2np=pS;F)3>oU#2%dac`^!&e*~KV)&3;kHM|PB{%=VzYm54IXDqIg7}tb16PQ}p3Z_a4pdI5~!S$CA3li7gvv|%K89>kNr!xP`K~eh2TieRa(Zh>=csHvmtG>&jd{r0TMj~^Vk;p>ja*9E`&=qs{6q0Q?YH3Jt$r1@yw#Ya-lncMzwI~ zmBITb1GSajMFnmee|QXn<2U zF>8wUtlKuRGhSeYi}%N2zf###k!Y!jD@(HXi9u4No~m#t-Eo$vL%HSZXP^+SOxEQx zuB}{ZXfj`~F>(hP8{FgGh;FUrmkCxya($+vEalt=bQ$>yFG9IKFsnOEJ^SUttTvx3 zkj%Or%(=a!Zlxk@{Lelr7$14Pn1;`=t67(O^=aVM3l8v|IPOI4c3tR4I`pUJzB(Q+ zYbu*#ZvGF!0nW9FoWGn zpk(*LTadk0_$c&ieQsIzG7Uyl3q&HyEG<| z%2N1t+b!0rxi4O32SxSVA)Q3;+QfR3P5G)PrX|`8z<+|n3CzUR+5F~yv)9l*`#jF; z#|y7pr!7norK)ofhJM-3b8#@|eCq<{yA2WA@_*HAkaeOi72#-_I4(Ul9#9vb^XV%4 zVXb=V>}=-L_YAiBU9QtdBX4FIFYV710%RpyKE zSuL=QCEd-Cs)H}bSzw$Ld_g1@YLVWs1;FOnoVoMqjxtlUgT1^lY>(M|OykD%47RtD z@a=aZpg;%_XV{H=k!hfzx+TpYZZsOEqbwI!`qU>qLt{E}<>X;Mb&V@3TiGR4a41if zzkA7vmDbZ*$O!q9gR;;Adu7Zr+>G!=xfqK3W8f~4?Nk}qskRkFm4rZzCdr-ON2yQl zL#xFkuG*)y#t@ra7-3JTomaNHmB{FjuT=WEH#nGhg)j-`+b=NuDk{;H$er~^C_i0+ z9$(^RO~{OtLV!m?EaS)w65&27hF?Y10Y_Qv@vNrw8~$;7WE3{20_n7bqL%^g;WN)8 z@&isTLK`_aujNhvu3>!>&-d#eYuakL1IC(pbVnQ-^-W?J^&~2p;dl;E=PizW&nb>; z?~h!WJ9+1B|NTlNBQm$Nm!;R^)1MUB+PGNNP|OoME6Roi-kUfp8W`smmtXW9E!UYu zBW7OEG<(5<({Cp}T`v0o!(FrFV4vyiw(%t|XVPC3AKPpbyJ`m?5---J`MB{Ha{Z0|>HTJ0u7#C3y0V8@2yM4pc znq0Zz+|0RAg~X6XhTO3_p&fchzCA_+EHeUEoGE03xLrGzfwAr&DOkzCfT=Qdsdfq4 zY~N#dTFX!O-v#&3$`?Eic2QQPnYlcc5OIgolf3YmYXlc zdi2f>l^Ssp+q1M{7WqhLNly3l`u0{V469XZ*K2yqSe5K-hSuHt#=3No&YdPqy!UPb z;%)>Z8UY-V7jt^*PVH`tg;I)AoS)8+iwY$U3HJBphzB*771}rGu%$uLbXYwp)(R{mIlN__0m8LO(bh*4g+Qbfdt5Apovf`(YJhm>(w%v|K?q@5~Gui&4 ztFo-n!Cw0TEMm37>zJ!WRJ2|aql%$nPm~G2MyZN#nk|9=(=#n}F%Yys7x52l>~2@v zes?5I6t`14J18Yp+@(ZuYb@aWsR!Qi0ULxI@bMD_^jt@vN7DBibgA7vo3+SN>85gC zk`Si$bW67o+qrpk`a)lvqnUb84ynM>yXs9#_L)I&Iv7B#!Zg4?DN@krY@%~Xsa^Sxc5bm&y4#m^FR(+zrRI` zrVWu;zBzTkWCm|NezSmHhYz=SE8Ua;UMm+9YN_`57jt0$O+72jywi3HFm!YuRRg^n zTKV2GL$?`#{xibp>)6jigs%`7uB!wk5o*Ou*Ojh)$jJ?PrPuvE=!S+4q_a=#-nny2 z?AaxD7w*{pRB3H)V^3_A!uE3(`jne%2LgUv=ogq zm?+IK+%&&@TtM04MKC^{U=L3Q`+=1h&S929)|`5)9{0fa`70U!rmS55>UrNKDpuX^ z(ZD7si!z>1Kq=~OL}V627mIF?`bqsNb3`R4si?iEB@Uhbep`>S;#Da2d1*pT#pR2J zfVP-PzrBs0V^{OP236N$k3_h;JA)lxcGI3ZB(WV`>rl2NIL|I!zS%PN1SxD@r3pBZ z0X@I{LL15RrQ_B|GW?u1mZi~gcKH%aWxdnxa<@l&DSYdS+WH?uxoty7k~0 zg|0&EkN$7?JG(hZ@OQuS?*ndO%pZRz%&zK{*_6R#aW0V@0?i{~!bh%hL{)}tHdknN zL-b)}MEXs@6BH@iNKX#1 zLR-P<#>~ZrSM}9d#qO-!1L(F(9}=LrmBgplxv%5nll3iqHUmJ6lEHY)^sdESDcLjr&%=o0L!K8FNU)+p-~ z2Gg1FX^2HI;FW3dl zHCrjN-@7!A2ZXjuO|8}NGu(HC91c;U%ss~4g$X%qg4ljbk}MHR5SnRX7k6%sqvLwe zrl+_vONl~jOIPx#fwT%nfsC-ivZBC-)5!A!2JriITSZIW?=?GONHTOSZsg(iM=9kMde$VMBmGmE9{;|qy<&aCKa5~kd`7wONF)j ziaNNeT@tF6A8lwquo`y8aH;@m85w$IegGp+tk^&e?=F}UN|_+2v8M)IG*StgG|+zm zxiuo~*zh&M%3e|4Jk$~Zg`Uw;Q5l(ZARrenf49Xl_(E|D`%f-E^pi8~0(ZA%g<#0g zZaM%o__1_1)t9+orG{KX;qMRcp~x}eC)$B<)JS}b8Wrn7LTcJVO?Ozf&WP2VXKS@| zim-lt`zRkph>G*dfh%8pjG>CJiB)QU^lM;U?~dk|zwcCdFNMHCQ+!saZmpjDjNx;% zA)I3Oo~TgaP5g=Qvmy`1I=v`6$!Ge8;#4>?zjs2h*Kqs{jVIX6=fIbeDTYm2fFIJA zEs~X6i)H=kPbP6#lDgk+Rf>ALoVuy1Fn*y!arayc{QZd?Uky_R~%4*IK;>tunBS5N)hfGB5uu25<3G5 zd`RF#9tgwO$J?+sjmdBRappyR5)A*-1u&vlp$8}8{pz1=hmef&)g~s%?P|{Hz#a&P z8}N3IF4oAlQPBzAF87(<@cN^t>p5{l&4x3bgoB)^Lh`J09PvKK+ql@0c*W3M3j|J} zlnqmx{$(e(rFE1MoW@*-A#2wLb6oS8&2gMcGzIBe*d7Fa_-nu7cpB))AiXiT8T~t0 z4|lR=hhS~tN73nUS1f6H+?@~IaP~i}IXFv{vz~V46r9!ZdQ3H#rbIfO;Tftem`tfa z2L1A~*7`HgyeZN$NEVz^R<5E)BQ34YOO+-;b3UkM4o=QoVp^@u1d}zQ)BAsz$ky*S zJ8rRfv{c*xm0Z)jTSS%46e%S&sUVYGu(C{ot9Ojf+#Y! zTrl8&3faLB+KQY~N1K)0#d;=uk*!1d7?6Rwro?m@-45i>`3l=i5oB=tG z?+c5w+&5cLfVSDvqI_49RwgI;@3yE+AYm|j?(Px3mHO0W{o7yciR`+v_R95A+cgGi z)IzL*`risMAmnY%_40b!wWy5p!@sDP5G5orVu0JyH1`y`i0G>Q_4DTwB8@^@NY!%( zJ`dJ2UCHC_Bq0&0{tcJ0mN)wpvP;!Pxm?I%+_-L)S#xdW@*->$re0O>4^{XCrB*KP zjYLt`PtjbR0Lh%z_U0A6XUj#lR`2}M`gSyRNX7Sq<4hNX_&3g`Da=QQllcl?C{G^%5X!B_K@bjEO zB~2$~WAb{8ca4CcprGwaf)e*jlcF6Kk8rWRUM*mmp-X1 zKbz3&3n$<(TUVi}IInH8A$vEEsMEIhz}LM~yJO%z3ZHI~taJA^=&tWyR}={4YjylI zf-T5vV0ml8QwaxuF*BL9W#JDx7LfS&3VI?&=1TOVY6oqOrd$-pyite#@>4=_qLl?#^CxbPv(%OeH0L;j zBq6tLq5a$q*tDs>Ihy_CVqfb(^Xt;B;(c~cJVAKQ#tUgfQbJPsS&!|-L?OFDi0-TD zrF?MVRB%kRq@Z8B!x*oh>_w@HyQNm5?8B4hp1a8F*OvcDe*K39zWmTZ|LcE~#s3u+ zo3-eUJdTE$_I`eN&qjcM2~|5UJ$S$9dfw?E-rdmbCvkY=g}m>7=HCDbKh4jbK37(b zlV*>T`t-83e^65PsugT2demASZ!_-eYC@v-aC|lJ`tU4Nnw9VdJ$21-@SXF1@_w)O zD1E1)^LQUCB%i!}PH6&4ylZ;DO*P8Qz1wuY(Urfy&1Yj?wupYUz0&nuUye+#R(_2f z;G4aM!4>_v`wZN9h4H8N4!BxT^FEbH6Mx-DgK^mBrQ9e8N)7!V`$P1C4{-u?D7B*t z*Nf`_^mTBtPmAB^iwTz7L8Coe4~8d#vlemsY9G$U#I0{Ec;vjU@8+m{j0 z9!qOc8HqvEg=HUi<=BesGWKfGX^TjJ*$b;3Z~;p_PB`oBNVU=EZQ!x1%WL4By>-E< ztt*8~{#**~nY*TXs!Kcb?aceqXEj;PGn);h-{`J;o!1x)F)(mS{Wz92i=&NrKJl zNii7E9>yr;zGh8Uktbln9r0J7nQGC`@OdG%pQ-gM94YBoWXEDodgUIuB{Fky}1fsXIQ}oN+GmL;49mi|F-g&-uE6R+KQXPWOLN> zG{cFrryOfwcLvPBh@$2o=P;+|Ze@lAD()WIubvi@z~aENexAn`hGcOKRQp1jE-(kfNeZsQz+z?UK0Abzz z0O!4-Ju`29#Saewifa~@<;5SFV$w$(Z-OZ%HIbfJHPVZw>$NYMD-6mCUS6KMT9_*J z9{reME>e}V>^_KroV34(q>uiquqjjs{hC73H}%byUT>d%_ z?+$0=MQ#b&lB&C9=)a+O>l9|Gz}7OW;~{zMKr}}4VXb16MmnVLJT|(LBzjti_op7s zGZ@?+&AM9A*Wdb7&TXMPpD<_fOhpOe-M zYX_enAtK^~UBym9HMt5?$;Sh0ew!c$^%v`q z2hqmN%hBA!e@X`u50l<+qVt+n;Msqa zt%mYs1#?PxcTMdmDd*nm)O7bUH~15kMstl;Gpp(fVeX0Y6Qot`8zD__avkdWCm*kb zyXH;r-N~^W_?XXBdmIieThZ;ohje?Tbf$f1pofDDpX0>^rCB;hd7DP!_CrC~RvZ?# zX3A=#-iB?N`s}@L-koz}L_d>ABycwdS^1M}r~z+F2i1UFFscB6v&Zod4m8BT%P{~{ zF7!{3>%Nwc!>WfUo9GsIz>||csVx1hk848S;@sQVSz^`4?BV@*rhO1g zp^ljNmor4w|3lVW2E`F@-MWJZx8Uv&+ye}fU?DgJ3-0c&gG+FCcX!tS!C`QBcXt^s z@BQT5Q}F!yz_S(~-U$~U!X_`KQ?ev% z?fg@Ju6MlbHbmshdV>`Z9i}kLnuIH`HL4qh$caS|vZ#;Rc9Y1|+fYe+r67ybtfVLw zx_xF*H1>@ln!)Fii)kS;ob^3HvoPwH<3fgF-7aTaX|ldLXdyue&z+FV5<~ZKNctO^ z*2-5?6RodwL-O23!ej_Q`=KE7uQEPm(k|Gb*W@@bH7^%70}ZeAx?3BMqTYhb?1J^!I?5bxc`xxad>w318+P-r%KD6$MF9|*-pql9RCgtE;*LmpR%wpvJ@ia5&Ty*m1y}9FM z<^GK>O>NK{TB?@e;~SILQ1S|on4qG{t;u^0C@HGcW1vx5u7Ain{4uY%qvMO7j}A55 zr?>6i_(|{-1Fz2+z9<68C!S(?h0qUpf{&3Pv~M(OZoI;fprKMH!vXU~>TJsV1%JPb zIR8M@nLNC(!;+eVz&S^glQkdf8me_(5xS*7zU2kX^_TX#aqO$|luKJzgDy88aV|F7 zDM|69l9$1Jv712a?Q;^M6@f=79x7)3(nrHFGf@j!zYQN;Lp2SPrLs+yf`9midYriY z`u6`>vHsr-f_$kTTp)y@vGwxz|3MM_N06eRc0BgITUUSl*RVXgwhHOMbPtst=&nQB z=l0g*RX;wsbpyP<-EB&j7u}AQdnaEFbA5VMlD73vueN1eMS(xFH#iJ_n(}Yj z9DVb87>>sE8r1ax0c!-EolYKtj**%ebSDl*ULmHf*DF!0KPyTQQ*qKA+89}~r=8ijjpTo(<%zCbPE}X?!GB5IjGVxOL!K8z z@PvxHl;K8w{#8IDp5I5UzdJJxgG`XlWfa_8;)EtWA+c9^%|G|!jX9f`u~I0roOc+9 zw=6xQzCUa*n26f>o2q+y*LT_^RwXop%p_A>ZUbJv=9#YcT~#F}=I_JPHTCV<2{U*qz1+Dm%)Q$-shCdgq2Ji-2D5pv zWwngNO9#oWf^I|x<@a%_w@LlH(R-gMm26hCULiAUR3hz?2{ajF82gdcJPu7#9ga6g zlAYxU2ngeTKbV^gDA=4nN{PA)SZ0SyWI;~A@ewni%s`w1^c-`VFs zHMSzaOWadi5tZy@ogloMWq#~>LSb*o31ypm)1o0SFOGL*3=V#X6C>!FIT4gqD;Zf* z;WFAv&<(n=S{M$L?mNA9YZ0o8Rev7{mj1HlMU9#~{_fKW0chJo)S@uZS-I35EKr9&k3kQhlTtdL(ZnvJ;8`@I`$i^U@oNhz*M1u$z1Aj8=hHx^0Pl z?+Y&x2Q#m8*`m}bG_JZ_iE^=`)pkYD*(Oa;Hr3Z&9Agg_j^avZW}4@rWUNL+&P4wi znZbV;UARD&o8LNq;{r{q5uKQD=~@hyyHd6N%bpxI@ZyS5C^&AnoYs$K$8jG(kC!4p zQm?4i5a;ltbV*aaR8xsng1$eG3}K;Yv~vC!sHV8*k9OxWS+a~~HoNvlJE$1xviBEX zp)$Q6GgK!K=J*{VewU-U8t5Gd6TyvpbgpEzWj9>B8C_ zl}=kJuzs+hU?|y}{^;9`u?}ipGp&$Fh9T_Os0Z8FLfTyGCD^2~si0m>=2(y*{O*-+m*94qa> z$e&@`==0C;M8xj!agv>JN{_l}=2CbMdLy5E^L`6sMMrNdIww@k%npD4Ve}nK#L7a~ zaisJDgFq?N$?*%hk0a9jWi!_MspCDE+c)9lQ0kK1S4n4#%B&PXc(40h#~PPoweTlP z)ytpdC)!Dm`4vhrKpg8L<)@!LsxygXgPak)8sFZIn<3E50oDvL1Iz2fyz)H+*vbJw z9@)^-LQpl1NQ=i~Gg(jzNEmZGe5!lJ7^st&8QchIupM9QiU!S-w7%3BVKyZ4YubL( z8iC#5ME24R%Yq0wV8v>ewr&R|5 zXKaE{JD)-^VR7_ip7We3(Y*xc-sC8 zo3(#4Ev{J|KLv;Zfoa|Se`f|Q72M0%9{w_Xv`c}hp!b4V=0Y~jb#Y^b%y9H8NaeoP zzHAdeCwsZ}u5eA*fWMmK>+IS`WWWq~{5>kG{($9tm|d(;N!lI2acL4c*eg*}U2n;^ zQ-LlmS`m&OLp8wEhC|u$-oiq8x^$2Ff}SLtG4iSb(;U#&6TR?cx9;xb54cH8XQf_; zI_DH;;^_V!?-OTt9@dip$P}oKTemksT%K9Fg2l89DP`?GA^ebzMoT|EYj-ewX5}xR z#!-tKbtqr}-0}f;|2}cOnJGWVZOX~3$S&QQ%T0H7=c1aqCJB|V_~I*bd{=Jp7QRkS z-!cPI^S_x3dmh)39&gR));r9}jmdlss8G4K)Gb z^NNO<(>aZZYKIR7wQ>sP2K&qgZ+C9%D>f=z%Pv{f$1_xCiIol5uy2^8h_le?bZP=^6@l=S9S(Rv)(cK?pLyUU5`^v z{+{^NgmrZRRCkew9{n4v=QtlRNHx%4(`n}aghVtD8q(c_=?N^-&}{haJllT9cJzHp z>gEqrQkB1|rROQ;h!)+qHDy&`WqwNR7<#~nhq^H1Kk=Gle^RenaX%IJun>S#Ps=ji zhQ7m~S1EIM-}-|W@J~=J@t$F2X|oHdkGq6liSKsHrG1s7_2fjmyz~whn-1N z>%k#+Q}?u1tD(jEZ!2Y>ee1#+2OskEKYz3JBwc%IjxTX=X{%A+M{kY<4m(1aIMe&H&|x&T1iQ$9ScUI=R=lwk}yjdymMICOfu_|$p)lREGRgD#(t&yzK% zI^aVg$Bo5x$h$)0X^YoegaVsxo%ey4%~@XO$Q7_=)!506Fs!u=g#mO=bvt?uFG$n`_p`8S_*WyV^X1Yva_=jAuI$z0%6hGwOOgsk6=Ont%?t!U{F&TOvNc4{Lok$|<2y`U3go9SrH z5R{v4teVG^XNIb*XinW8h2|Y0xc8vJ|FahM*k#sZYnE*J|FcZ7EjH)K-W++#-`8QH zpncwV$=;R%9%;7S2{F9RhY#9CHj5n|%nvSLvPJ`{i%4~zC@txhTQEK}HIDSIs#D#! z8KdC#n11IT*sd0fHkU}B4etET_V=gb@#n#EUNzzU5I?XQUU7H(vnJj<+ve@yq8rCY z6k!`Q9CqkG)qSD&XYlqi!|kqq%T;KwI6&i;%VA5Oc}^q z_U1S=^oa>(g?i#BC*qIWYOis8KaYFus>wZw9izJm9SQTeb6@b9?{x zX1XaJA)D_??>K`SXY#1e+GlIdk0fo}Xg0OXs9B-_F_>Ia*fL}xAEg*eV&39Iaaf82 zhuWr;4~C6^_Ftlx+N{(5iLpvGYf>r)7#T^2gmKd?P-j0v7PqHj`(#t2F@E8BQQOah zT-9yh`aq2P?SyU>StIT7^O5z!s(uDsAtm)xIC|S_P4`K0eYC^Hz71wFgO7HAGHD;|B=&j$2a`gzMS}pTXaF z9bFFg(QLKcm3~)K+@^y9N4rbEgT1xIrll$KC^h0Lz|_qQ6Ye8f{J*Ngx<)JFB%idQ z^DY-UMlz2~cVkByQ1@IQXsx+&z1uUjNjY}GjN*uvNQqSGOykK!gZ;n!zJ5uV@mgj3 z(5>dzUME~c!d2^&Cq!PizbyuN-P=?UW5CY}`YT;|1Rb+* zuXXM`ud*~&p2MCAQnGoLj4H=gU28mnZ@iwL_m3{V6Dr#~!4ndf&=44*}aZK!p88g~{esyf8?8h^1^WFFZ=$=P;;*;z$n0^nO;>etV`-mbpMCAHsA`g&#P}^ z^0$_(-V*ywyS}c@vPIwV0GmcD@~ncRv|Kli-5<1F%$#6SsrY6q2LND8Gu^@182)JC zgYF(d9wc%;K1jwVnR_kT99W;Fq-v%lgFk$l-ZA?(Z@>9?gnR)pkljQto*M} z8fObph~lC6Rf#PZ#4utlUUdzxI}s-AmMq4LU0(_Z-T~X>h9ad^RMy26EAS=wpq@?N z5I7978+fR1s!-VhBYZGgo*rmF&@hr5OjaqgKb8V^X}v0cS&;(>x4HO!=o#g$iC`X^{2Zs& zO3_10f%K3IVDM=AXD;19aGY&cDn+J0J=5R6w<|FXH%iRq3pQIBw&wu&bh(M7A11o^ z4m|IQtJ#4)1Ya2@LB|VfPmf}%mQx;PfHWufE5EpOwRI$XJckfG*SfNBOrh=04;pV< zraYu_=MWESF}Z45ep2PsIZNP_^FG$Y{zsPN54D9PP!0zJlP}HkV!WBG!kQ~!_WbMk z14)~d=9I~7mhcJ9A*QA*WU_R@xA5@cIIamNh1x(zr&XU>;mfA5?rt1J>)M^8lj~uY z6^wF;yt&e(htjnJr%#^2K&0o{W4Bzv-@4v0mFn&P>e^6jO|bG2%Q^l8mvtQ%Jcr!H zyY(>632V znO}~1WyNK6S%A>-_RbtN*L!E!uyebT11HSNj2U2DQDgVZH1dk9C(tR7g;RAhQbhEw z6ZewlG28(Owg_?t9(VmRTs36Lks=M%{3SmPQ+Da!(316rwZKsf>1G;RNa0km`!cl*-RPEW1GW!dIj4F zEMM2b;`oWf`23NViBQ-D@huIBK|(72s;JY8G%_dd=bnxrEj^!qQlIL4{iBVz(i z$AlIL{U5X=m-THv`KQD?;fh@evVumN(*x&)#ZmlUWRrRD!FXYF2s5_~A3$=rw(;;=wVrC_;NN@tOcI85bCpTeZ z60dC8ZE+Jx-?)|$O>4RQ2lP8NC^AkGe@l^+N&*zxjiVB{rPd_M&+teEa>G#NuMbo% z#q9RDsVdLr)l$3vc;!q+Lv1`?C%P^+V~ZRv8`52KOUP&@unXZ^;>~Ib)+eB$QI$sq z6Yn|;Qrj)z!N9t$1DuwJuybVN2V7!=zjOM<)(ae3jq6uP^uJyr; zx^<|uJ|ZnENXEq~o@k}F-sKScDK39|=Z)>uFBvdi44t64%-tN(Yuz$S=}xU82e$!T z;JQeI=9o+FlyqNC_3f|)q3Xp9*>6+hr4_QnQ*}GKdVsh#mTRdqpTwPibV&0O!Q_xY zq(;zMk#`gK&*Y8w@WaU-w$1FcCL2t!RD)WF?$qtv{=kiV1Dz2^zQYygAeRW~3vPMz z_{3tb!TG>&Jp5zJ@`3DuH=xBpn&h{<9Zc|c&v%g@9D}ziA(It>g|_+XuD<&Aw;ve5 z;+k&ADG+cA20eZuzXeP}{quxw`)G_JDRUT|*>^y5_SVy|b>|zOD`c(2^gY*R)mv-< zOvbv8haI^BHJ>PxJ?G_*hmGrwZ@*P#HHYE{$flBXRb^TUtP#e4!Q{Y8d2J?zOFxjv zJ^^M9-q5Orm>Y088 z?&PSBV|{Ldz!9^lEV1C$^+^gLeswrjX243DJy?^yUL=tlh4zXH*vdK0Y@0lNuDXr& z$YRlhwxC_Kce1~3F3~;)EPYevnK=Tr=E}6ao`v_t1{{6#BurOwTWW&NCNDA%if*^g z|7LE~7IjwG4T!j{bVj~hp457cJg6^!40m?_*Dw`_*+56FvC{ePgy;X)N-gxe*?5}i z1UNmh0&b&c>WDVqce>wq5`B*jbh6ye%|ApwS?6Q0<%OF3)4nBLvi(eQ)h?2(cczNZ zQP^n*2Psz({*QaP=oP=b&2;W=R3bm!vDO`F?a}6X-SIJtltY0Sl5Qi8P59YNMN>i+6bUdi&tkcLCax6nusiHZaN$7k-^NG*|Lr zyleK?;%SH2(`8;rzHLtn#cv2*y#$E4hCIf%y2=#iE$*{cZ}VNt@JS2^M%_Hn%3}uV;x*BMLnOu_lK4{s{(6Ypka=%Jyq5v?M2hqIAcLQmso6Y%knn(=jw#Gek#SL zwXoFE%4bYoFAVZK`kz8uX|MS|xAdKo=P@NTs%72EKjkB2_eNP$!HSKBfrw|5bSPm zZ&S7oh3;lIkVa6$q8B0+cFV31)#8kY{wPS>%)S_6=_)UN)Q&Jc#1I0Wgw%}K1tw-8 z@5+7N!(rPAJILbqpj4pjp^)DQAPU#!3=>4R2G zj}h!AEEVrgLWVGq@5yyW3w`$fO?M;f_m~|`xMf^t(|yc+g=wl=_9y*0EDy9jXD$@$ zMWe}mDLB(pr#mj5E}EQaew1xK+Pp!Rd}Yi!9YR-kZN^!a&3cHsTX#WpP?+ECt65Pn za1SkSXa#i{Y)vl^zQ-5;Lz=>E3+)moTn28%egSbqC_bzFQ2=+#6vYn8&G!SA$C?)F zUh-zY#jF1*&yYouy`z^Eal%azfMzj;PY9Rs%~(&zh)ys9*tnYM z{RcYwH@jA%ijT1)BHMu5tM$RIwHv@OVF6nSjBlz`73*q7ETAP@&7rIcYB<$O{hYWq zVHlLua>lzICaqBxA&=oT_*eVBx(`>Dbx6_WHZ$#uaIK0b!I_)I^VWU7Q_-Eq!mk!{ z=O*O*?;-L0b|W^hCFEQ2#c@?{T+a~5_Blzs+#QZ|eN+;20J zG3*SHj5ca~u=ZlPZW$?HBY=`TcC4x=-b51$2W_f;AZoC!P zL}E|uoMAqZ_#1&k2G-3fY=A_T-cduCl=?32qXh`}kr1PWyztiWm?-@R_LfGv-jk)z z0IT^hBQcYALl&ESxMP*3eL-VI$@M1@#{ImBk(LnjD4sEts^wsP;ItxH@I4I(ytL88=+D}`jGVzVL8 zzT+M{KdvII3pGbX*08<@666q_;CAs@XZrjiV)*1^2!pW4BRoP(PVf^X@-Qz6xGaTz zDY#Gq4DiLSyuA8H%G$V_euLjofzA*W{3Iy$<`>E+m6P^t^P=*C(K37N?D05 z#{pZXT|%3?rU&Pw=Nwz_3*-LL?!f~d00=74yyGS3yQW##E0?4i1x%_MD#T8|Xne?#i^}EvffUIx>iO2#zq;KA>3fQ_25sxd zt515FY@pHC%Ov;hN)aboi{{m+wXOx(v)&Q;35%grUtmH7Je`<`F6TH#a?ynrUTg`O zJb5#O1xiL3#tQQKkJI;HwFSJ!798Ip_;G(G%7);ZkDbsbEq_VZtZn?wRSV^w;r?k0CW|)Z0H!U@2$l-peKWyf6;t!Bp9!w;4E?Y zJ#63e7Sopr;-y+_h1TNAZcoWB+pq3#YpBJU3k-*RIGJwN0frSex5N9)=zvKw8*}-w z(z1yL?0XU?p5xkmE0wFes{Pd;nkr}f`i8I0=bNj#Y~4MMcetr@nKu%Q^J%fX1b4K* zY{d59VcJ?tZJ}=CD>|=Gvtu1S+APN!^tuccq6HCTbtz4{DqLB$H6zsClzMylaf$y4y05eFjclW5(kidsRa z&Rt`nH`i0<*GGu2dx0)lm0J$~f1Ou>$*%I7VfCqNeKmc5`wQFs9&&&-D=L9u>{8kLQtX@!_!Yi}7u!ZchlKFl7zHjw6 zpe}dN%RBr^3>^GC)m^Nzu!P`#G`^RNY|sr(w@~9xF^ovsvw?2eU34-ZwmWpnxem7y zC;dMQbd)b(L`1VVV1@91eX~b?!k#py0kZdV()5NwgI7Tx*4sjA4Yr(#N3s2n*6T|qiUMmgyF7RCfd&4*f(_0pnq{hy2LW#i>QWxqo z?Mcq+PkAtOZdZjceKs3P@N>sICE#;6WFgl9@+|%KmK4K3EMiJlJ&NmcNPT<2s_R{? zvh}i=YdPA!$F<)Whla`0Tcm^JO?MPTB-DOc?z`Uxd=%CnH|iiyydzhTz)IyOw)jMD zMv7e1BSh5CJm(a7dF1Z4zZsNSUxN+PhX*!PN^qj8ZSwk@yUNbs4Nlx zS#{mHG2M+UxYs-D&Hd-!;Oc4V4U__1t;U=QU%M=W;Lx2X`|W+(b(+0HGO>oJd|brB zBiO!pI5EsJC*|wfPakFG_n&+{=^noEN|l5Fw^meG?C8h|@TNTKb7p4VU_Zh7vJ~|x zzf(s0KX!;qAh?fNf&)P1ESk+BHd{E=1_~H@9)k0M6qn z%&I!H@kkTQu4{QHZQxA47+BbodfBBjP7T*C{3VI;n|G~F#WogI@bTApZtonj;#yJS zJlBLMe$HPkG6b1ThRMN(wVik(`c0iF-;(3cKf93;yLh14O9r8RpdEdQ39qkWc9>s@ zmq}jiCA?#k1{OG?zsFQjs}=2iz_T>v6S@c;;!-4Um_doQ!}9O_%1`cx?CY1)Cc_7= zB6ty=iLXgP_r$(UxW1q<7&wVF7%lJ3gbC%WXlT_VcX22dr4TmEz~$!RGQ0yL_Sc_( zN&fzpr&(fZb&w7SuR9@q`iOV*0FWH{M>0@>?)Ujit$JSL za3E|{D3=j$AU?^+1C!iS5Z0-G?mlLIUX0h!$_y~}I~-HF5DX*D1h7wN@fX|b;7txH zCpQDYa3ibkFn~H)54Z@buLzU1bjr4S%=mTy^YZsalU6BZqHuMg6~89bqf?}@W=Aak zs_pL+XXvo^%)52F>&x8VcF~=(1fG{C9!%n#G${~`OWhxFw`^e90c|V%-Mq@jsv;>W z-bi4;q;VxFv{yyE&I_0Hnf?BL|3%Aw3cGorvY9$1zcKC)n>R#y2@_6az}k$W^1=|H zmZPA268fYJBQg z72S2p3#A5A<0FE$;tOcTzP|o7O$0D#PKGA1MqZ!Sp2K69%vA9Q^BV?)ViV4$rVrVD ze<IPm=p-eNvHW%5-tCWULhoDC}sYF`fEy?W(`WCNB3oa0&c z;eubzKesNE#=xQ-e(jzzHu?ar2a zfmW)SruRDU>W8anMpX#M@$kX$ zDtbl?c$?8NUS!+RzQ!98*-SDD0kq4bJ4cTXsTN{YK|)?v`BC$R5Nah#9?2 zo7XKL{rq}%?L5WiI;E)u{Nla`ZC&K>unKL6a%(FF?+6m@PFT!FS0Km-pzQqZ21`!Z{o(=h7Ion7@W?NfG~M7s|G#;KrJgETr2 zW~kGxtMzMp|GJilj-k=M)*=V8QFmzOWS6BYliqTapiP6^U7r85s!?^7uhK|D6(!zP zZY7z9#(LPE+qFhGH1>D|^&;IF*Sr^Wo+Cfd48aXC-Rq3J$>P0ClR>SI?f zg@xMKS^0hT`B;$^sNcB0S?Q*J2lIYJP;Pb3BBQgF&WbxmIPEK=1^x|a|J3Y0ON;&f zXxe3#+;h;Zi9mPjq-G`So)`CFH2A}gy7iA|c8_jyG-PXF0gUt2o`F)Gq2XQfn!N}A z^YZY7LXx^yYA>fFcIb8U=0B}^-~QuACKup+W*3F;`#wq!mt*ycGGN%o0*?Moot!`M z6v&qT_SN+pou*BQN1O6^DTfPx)O-iIwe#n^eeNuu30Y9>#D6p|(dJEZhA(7w2F!=q zDKb0X8D`EqmVa&|sNL}q9(Zf>J2>M3kdQxm`pr(<#V~(p4JgAE9y8W^zI`aLjt6vm zIzdLou>AmCq{?D^!j!ddkXuk#)&AbDp(uA}&YWV{=E$?0e>U;6X!|6=<4@jr zUX?*}@EMlxxx~keH=w1Z1bfnZ!?DWMR3JxqM0c~IxLMa;>BUpdrrRMZlF6B>nghKR zu6*G^d-n!zy(x$|RdV?zmKj&_iL#(d4LYZ~`1SX!+pcm~>9`A0-WQs^U?WJoAFKjh zsxTIAbWH{ahhos9faf0XG|mpDfZO8x!pVXbOg@BiFRx3fI)7ccd2ZtSU&m+p-`@)v zkcErMn0*Hf+Fi!-Q;QyTYZ@H`jBX63Z_ZhHSXn{n zBF{5)`JUUa*>6W=wvZDLn_v)M>>-^Mq^(}l-=h2QveVRA@jO@KE<&f$C+x7Mrc!1~C#O`9}YBMKSfqV5qU z650DY3($b=k}5e zD@`+KoN1JoCSY1@r}a1k0kV+7_*9og&86h(ekL5|v$~Tn;Z(<#(GcPFCwoqU-ZSzh(P+0D7Z8efhlkvI*G>wr$t0@w^o>ei(KM zBU@)DruJ)d84f+?TGtDu6Oa?+qW4yBQuuixTphs*tx9_mH~FV8>kmonErXP3O18#) zTw%5pAACpzOTKl4V%}racjqOi;`TbzEjp}r9hv4r6(RFJ&?B86ZKT*ElMmt=z5A;; zFxmR?cTCs0 z@#%~_hDj>l-u_5xY9@#w=DeQqR2@e6b!*D9*A8WV4p~1OHAQ49qx4iW3*%}{oVcK| zJx@5Fpm>-3?uq!ALn%kUqz>FytcbYLpc;Un7Dl>7h8M5Y(?2)aAWd1s$0VgZ!e~j!ge9PhkeHfhCtP2sah-8M;hMS|U?=4ao5FIh^J1Q14E2eUd^hPIgqJT8Q|uEwk2|H^ z3aB-8{@>;Cr2Sl~f;F1IH+*On32p?78AW;{8?D@P6Q+0#QoOGA<(EAgFxp#+C80a$ z_^z~JV{CvbWbPo^=GY4M3cn|2Dy-reZ0OU5qR%$%y8LJKA>+`iB*qC>yF%s|ce98H zK&*%$nQnPJW(UBC$Ud+FD&KrMG(Yj@vZjYt0AfB;^pJf!oGn)L70VnPQHzPWBV!n= z4pPNEISrF;ds{53{$eS&w>+QLwf$1MHe%*MncA7>K+ym}XSps@Pox&U%e{p-4v+^4 zftUv{%^3cgAJdT28(8S`BR0bLwqC%Rw%`kjr2m!0qzng+agU*RJpT+1SU-{h6BvH_ zDe)HwWoDd@=mrmkU>7f874>OaeUfX3JE==JzU4aIqnY3S*RnJT3X}{Gmi3( z5_k>P#`Q(WL#IH`S&BDG5t_LkEnvI@-9FSRh6zRc)Z*XGTo=y4f~tOS`_`}h>%cw= z7uVUY-6PHkeYjjt{?oJjU?AKU=veuGSOB@4q?7V%#6L05lBLi$uy3h1SFfnandK01 zw2V^3N`n<7seL+RDqFU&Y7H;u@PE@ksJ49nmi3Nk4xy%8vS4Is zZ9LgpQm3jU{co82@*)ZJ6YR{{;!1mvF1Q zDxgK+2DjpzG4U;`&7sQn@AQpK$hJB6;fa6zWGNmG`H%_LXC8C&0QBW=qgF2;iRiQ8 z13sMjds~`4US?R`AdR91W+$H!fq1&g?Cf}Sy$4O6hnAq~&VReL6h|1UZuYrZ?1xr8#v}m0)=6AN4xum3Jm*th2P$#Lz#CnmKY_xp zk{DxQ3{PVdomxoQle}WTSNB=RINq5)CefMn&-&#dGmlZ4(g3? zvJNoSX>9+bTAms_pTzW)?A?5d;*8s~z55u!i6!{hsHGVvo$M^XiGQe2Z zLvWN=$}5!?Ksrz<`VVrer~O1PbO7!2H0-9@MjL8l;a{z(^7^iIic$j-?pUJ2$3n5S z@T5>VeeG6Oadc`&aK6vy`csXX%R`3KE&6kua-KerSAzie!3kSly=h)NUn$m!EPdqc zDP?gR%h5#?_;kxP&qA+d0@B7ShGIpbbjjNcGH7Q>b((`E@?|#b%F-`2AjXE@-XRqH zIvV{XOopbPMi;T5CfD$FZ3!-baKF6;&;&M?m9nr85`pcAcvS2?P6tVXc+Rib#Favo zL9iyM&eXLWd--RCKHt}tU4qZH-K)r}jj%siZ#w#iMP7l9>fHlc} z3c+K%gJ;L@Eb|G$Ss!%ieU1xwCU}Sh+$tYO)foC6cFkPLNAYoI*3MKJcpM1ZI63-% zw=D%vYkNq){;Xtf-k9~|xES#YaFV+@g*)4r0SkNnWjF+Xc)NgS#}k*aK5GgYiHvw1 z$K(Ih&BEQj9nYaNvAQb+-0-=zE@i-`y3{!2L>Edq`RM80%$00XaIig^9KI`TJ{xEI(NvD#w5IX9% zlOhTNXZn~E%|cqB(sCR_N!}YBr7`#~)Sr0b?hA<_@hp{^Qw;6>b-i;$A?`v0<# z|4TZ1JrJsYJKX4$Q;Yh)bThgF3@hkCmsBeUBGCPE@WK1VUg>M+6&_)j0lmGy@{-9? zY`)&zo2GYnLYm2n_N0@uTS&EU@M@k3aVen()oOfX3L4<4QOU}WKQ^4CX>o)LIa!WA z5g0-IjN4v4MI{`ydO5m7G}A%XPwx%! z6=dt(Z$Oa~ew;UXemCbS-<)_;Rvqivsq5$KrS8R7Q1g4)T!xEMJLwJP?0wIMT*t8} z6X}Ve{XsfC7X)+W5-5F^kAAg?f4gJ%gt-AOpDA?hm(?#f{g0Wh0z)?0GqHFJ)n9#twl3FQVflOHQ)C~6x!bzRJaF9c29hgLVqrY_A zSU=dWlU%be=o^+kXm|{wD>JgwXh@v0o%JS~NLQ1n9=Q&=j@az?_ja5ZOKOA%j$g&# zlQffOcZ@gha%7`xW10*pG5i#naTjimcmHF_;}D^Q2ZbG*1w)ev5wU|4 z`ezz)bW5Jjvi13^JK7b;souVPpxjtj(t#aXh&qsFhoj@|jC8v`xRUU(jW9%0pk&dgLg)^A#kP&c zI>hn~_kQ-+X?UHN*TmXz*?K97DY1M+Evi9Ct?P<84zJMb)9K|m8#B~NlGvEc>_a2E z0@7YrlP=M#&&^0=^>~5VaXY21Q>3yH3~OcYUB%EtL$HRYH|(4dv*CY_OT--X6%ze? z0aM|+*kZ{eaj>FI)Fddk$gt$yN&P|phST6)s(#5}>wPn+)UHsH5L0qnVu3YmvE#Ic z?asl+Gc&2B(F@naMb3h5X*CD5k;CE5$z9ws)zY%=%?2q$7!vQw_;=Ni%bZ487q`a5 zReclp#T97Oa3%gSY_ZX&Ze9Xpr^lA;z}J^ea{U4dAdLJ&r}z!U#62O9cG6blk>yvnGy>b&q{R8XRxkLt3?Ve zQIj`Lf5MRT^UBfG*HmCO3{l5AOOf~<;_jDB+cucqlm~zJv*OGhN#aXc;-5J!e|~w( zFu9Kw*$!`;NstZo3tGI$-3m(&8rK(Txi%1zr7`;#{|sE3_sN_AlL$1ZEDFd29XK)Y zj!pH2?tk!btD4zr_g8B(^C5ptM!!Jh?AR$_>$1|Ax_}TC|KboenYo?;UK5u_O3o|D z&Ps_ZurPG|7DmHMh!cO?S7h(39l|9K4YzhI`yC(*Pi};vxe1LEHyhOMkJJk!pqD=4 z)+4cc%=8txT__$ffx&Vf$-JVVjKSCcTzvQBY*lWqlu+ou*Y3)F(YZ-S*7raK%$5OC z(i?O6htllG`B!Bk$*4}!jLZE>K#q;wvt2eZwFAr_682;L^`|b++@toSgd;+N(8olz ze!^$)Exie^2Pg;T$F(9?wQ{0pMnnI$Q%)9ZWDzdRN^mRw8f*26uPB}d%-ujNpB*W@ zkkX0X{*$$-6-yvqN+O+oVL-10NGx{EVq+-B9=Gs`b&ro{c_DpgYS&AO*QeSSqIjWT zliQVtJCnAce)8b$lu92H0&BlF{5VV}O+*Di&(>{x{>n{9O=T-*K1Z^}j$5O@<|VR+ zbG|y<%4$Y+-r~CqcZEBd=uUk5(2$Pc@_AaPjs)wb+}g$@qTptK`f>LQFV7e~X*~uR zQ5<#&l!k3%43i#(h>L56mN(MS0AFVM*VZB3$ykxp6UMiX zK38PD-46Eqcp11d#N(403ObBuxF@bpBulfU*GqWNMj;_|OTl=QUqT!`QB<{lDd3b! z=7*iU^52iQB}VYQlN65$e|i}UyHu1=VYhLC zvH7l?ggx^qqmtZ08&yvd&^G;v?v~sYx zLT)_?geyYc?`Y*e=v#Mag=gxg@BM)V0YZ=Y*G#pGW|od8d}l$1!mm5Ad&SakEP)P3pD<9bH< z_bK!?3(&f7tOja|=Mg#9C6Hy<_1{^_@Y|2uocOYWR4gANd8fyejV>m4QX?ES^vWAt zid;xUdkMdb{JjrxmE1&qRQRA7?i*y zxWT=;uj**>ZN|Tp6{;PnLvX)qL+_aPV5}W1S952@($~|Q5>Z*N6+zT2H!w?GXN>0O zbv1MMg=s3mqaj}Dliy8a1x$V?N_nf|6ZU4b47b6QA^XX#{ZnnlJ}&k^y;mMDEjb@* z=C~U0n@bfF?i) z!7aE2cXxMphY+0L4#C~s-CdjJF;+8Q)%y!~SDm}|+DjZkYc4q^y3b?*RjnJyZrWmZ zSz?o3yqN(0>aB@2d~Na;T+W+l39Xo^XZw81;J5EWv_0d9`5=fj{D<7xHMU*y{LBd)2o|{XQ>>p_(H^~OL{kQy|C0^dIk+A3)tbKN#zr? z1sz1yslY`xE!#GN>koh0p%a>b*Tj^Ed5T)fI57NJ^#- zeTJLp&4+dfD}%@5zp&PSLCmFjKy~1M9Zmlq2G@rB7ex7ebvz&LBtZQm18H%P=ZgIO z?GnKc!ttf&u&epGDN~~f_{z?(`S(Cs;iDwX^Smetb7U$t6T!lSedej@L1z|WHbQ|c zB)D@naqcj_Q3Q#J4wkk@F10%-c+)Lw*0md9E!{l~Y_3;#O&F`c6ulGr?%L$rB^OZ0LTtH338aU?87&&^CwC$E z->DT(TIrXjkm~=`bZjk3!rTw$yhy&3$`z?cv7B!r%N>Dd{ZR;n1dB;~G#mIN4jWzs z*Qw_45SC0rosD@$_42cZm}Z(e1Vc+8IwY4Hu}Cd_o@~Fle!#kZZ7YfKb))kwwdhT# ztD^$llmnD90mXE@UowNCXT@V6ExTLvjgF7)pKJE6oyEDBTtLGt=v*Zs4FKTv6F z=t}pWZQ0_W1yj#juYeSGI+CBlYz>Qs119b3;tlW#gco;Am6II|?fhM=?cy$V-q!5Z z@o#XfdvxjT2zrYzZ6zm=Xg>-BZnehwgINCYH#fE$=lrSxJ$7- zISc4=fo?v=*ri75p*V&0osrlFHbz6FAN8 zxw_Zlxq_Ji=u&i;I3b*y>pnzxqD=!Ii6l=}&=SAQd>yQ`Z))A^&w_*iU6_*kip(9o z9(sAdmHxZ$E1eWv8o5d)K#|uC$^}4^zJ{|-A$4;?)B!J*cu!?%`^i<;Z_Y zbsw?L#oAN}i--%9VkHJY%&aQHj2ZuZAFjM(MP_5S8$Kvl(AufaiqHxGbsDzFJmnoV zlr;Dy=5W#xe)q$>tx}2FKR=>~!w64~R{slq4=Zgeko{=tnO&ES1Od45B`0z&^5Z@! z(OBn`z=FJ{Y1Mn&eC_C`WukXAGD+aMs@lYS2zH57 zaZgwZ`}uvT&bp6i@b`?p*=22?-m&tL;>gK&_$a1tm~_m}QZ(5f zjkX=AWl}_;nz%Mvhll|va9=-!PJCvr0PUs;1oKE}r*d)`Lnm1jtUECtcvx#+z!89o zc6>+;6D9`_9S=A7p4WkH(|XB|xJF}7-X0;^>5E$BFDbTi>`iW&rGHB5w7>QH95v@g z1Y@^b-9Wu`{Yn!q*4Gt@rfLZc8 z{qt(=rtoc3+bpCRuJ84tUM~2$$Kny5%A+9aQ09mlGTsOqG(R zPk2oBx__Kx6e%L!Cfo^J!83?8lo$9p+C5y>AQg2*pRE2b3gVkf=x#Eh&Fa0DzS9UU zlMW^mvf4OL4y8&xAs#zT#cHLs`3-GcAO9UUpI)RWKnzspru`=1%DF1zA=IlWi{JfU zc;Y2oLDy~n0Cb_O%-+Ot)ONU%4MjeEfn_0F36expHj2w`SH`)3bs#cImLz0}zDFV8 z28BWj`c#;&PVH%ImIdM6NG-e*C&^pp9ZPZWwq_@sO-PP#n+65LCcE@x-LdpSiP|k* zpgNE3{Gz3C5l26}-ckRTa20)*U?>J+$I|{{=Y_CVp0Unb176**xAH-md66F-F&3tU zwxL^?5@qyT_+sRcd7nb2tX*l6zE40B`9&?<+8i0Na<*Db=5Os2*E_NiD7MS%Ds0j+ z!ddEXfb^5O_cE=x`fgwC6(qs-o`W^$3ruEOKYJvxCJ}9fm1iM0OcC2b%^-Sa`u3NJ zJ*3{W>h||^qD+~ZKB+wiGJ}@C;R}C%2xQuIZEE&07Ku4FmO|(0>j4B?iY|o%uURft zxCyyyTY7jmdN+BqX1yxvD!k${L`%zZp>TzK;eU*w!Tp+qjmDd*JZnB?;PdE^)^A$n zvfT(a&wQAMUenlA>d-!HsUUNg6QS-14hOL$Hm3JdV7$34vE7rxZIi*pE5DcI%-cgv zLs3Heh`0p8?UdRN2n64j{h+@;veABE?O+UM{2Cko@9?ALoy$~V8ET5E6+Qn z=AG+a5TskTBskVr+(fK)#fhx6Uh(g=BAGg1zyprhaiGdca$e$pot7m}(8CTMOiY5v zNqqflLt;#$D5x_kV(xUC$Aod?L`|eDXXJ;~9n!v}{IR`nc?)I0u2 z8)(B#qncEKc^)`je%(t>)Z7%pN%_B z+Afni@U&#Ysim!T_j@AU#&gIyiMJ;g-JUk}o53iE%NEwD?}z=^*4THNBxtQcb7Hjv z+3z$IPRP4fxsUkXTn<)0=Pe#e$1Fg6lK>B(?}QAhb=_^& zYdXN`WWmR@%i+S!k-9reZD3Q+W~1HX13$eT+`kg}K?Y_A)7v;9f~mh)_e-Q2;9+Y> z=2M{8d|b5X^I#<2!SyI&hXk3EzIz|Dacy}%lU>V&2|7%2T1`$h-XYy@HFQjQ)EN3G zJDSwDM{avOU4z~c3D*^{O$XjGj;{rS-8a7gT{cX#B}IiyAo;kjLC$$?*Se_gBi=u$usHt3>Kced*1ADP4ScP{rfI0K(^ot5aUrKw|h z-;1ohsEstaav|}P^hh(ZDB+<LsX^fiuS?IFt%rE;`Fm# z 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�b&jHY5u;I3RV8)krg61OMIj!fSY1{((Gymy7 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 z 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 MXkN%TfBVt@0fYxuh5!Hn literal 0 HcmV?d00001 diff --git a/docs/cugraph/source/index.rst b/docs/cugraph/source/index.rst index 6b2d62fbd..5aba992ff 100644 --- a/docs/cugraph/source/index.rst +++ b/docs/cugraph/source/index.rst @@ -5,12 +5,44 @@ into the RAPIDS data science ecosystem and allows the data scientist to easily call graph algorithms using data stored in GPU DataFrames, NetworkX Graphs, or even CuPy or SciPy sparse Matrices. +.. image:: images/Stack2.png + :width: 600 + :alt: Alternative text + +Basics +###### +.. toctree:: + :maxdepth: 2 + :caption: Basic cuGraph Information: + +General CuGraph Information + - `CuGraph Intro <./basics/cugraph_intro.md>`_ + - `Blogs and Presentation <./basics/cugraph_blogs.rst>`_ + - `How-to Guides <./basics/coming_soon.md>`_ + - `Performance <./basics/coming_soon.md>`_ + +CuGraph Development and Contributing + - `Getting cuGraph Packages <./basics/coming_soon.md>`_ + - `Contributing to cuGraph <./basics/coming_soon.md>`_ + - `CuGraph Development Guide <./basics/coming_soon.md>`_ + +Algorithms + - `Current list of algorithms <./basics/coming_soon.md>`_ + + + +API +### +.. toctree:: + :maxdepth: 2 + + api_docs/index.rst + + .. toctree:: :maxdepth: 2 - :caption: Contents: - basics/index - api_docs/index + api_docs/c_and_cpp.rst Indices and tables ================== From 29f6ca7070ba764d9887580f45856666cd770cd7 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Thu, 15 Dec 2022 05:53:46 -0800 Subject: [PATCH 219/384] Use pre-commit for CI style checks. (#3062) This PR adopts `pre-commit` in CI style checks and updates a few of the hooks (flake8, clang-format, and the copyright checker). This helps with the ongoing transition to GitHub Actions by centralizing style checks. I also applied a significant set of changes from `clang-format` and `flake8` suggestions in commits cfe6395 and adf0741. To minimize the diff in this PR, we can split those two commits into their own PRs with some small tweaks to the `pre-commit` configuration. Let me know if you'd like me to do this. Authors: - Bradley Dice (https://github.com/bdice) Approvers: - Chuck Hastings (https://github.com/ChuckHastings) - AJ Schmidt (https://github.com/ajschmidt8) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3062 --- .pre-commit-config.yaml | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 61d21fcba..a075beea3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,13 +4,13 @@ # To run: `pre-commit run --all-files` repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.4.0 hooks: - id: check-added-large-files - id: debug-statements - id: mixed-line-ending - repo: https://github.com/psf/black - rev: 22.3.0 + rev: 22.10.0 hooks: - id: black language_version: python3 @@ -18,14 +18,36 @@ repos: args: [--target-version=py38] files: ^python/ - repo: https://github.com/PyCQA/flake8 - rev: 3.8.4 + rev: 6.0.0 hooks: - id: flake8 - args: [--config=python/.flake8] - files: ^python/ + args: ["--config=setup.cfg"] + files: python/.*$ + types: [file] + types_or: [python] # TODO: Enable [python, cython] + additional_dependencies: ["flake8-force"] - repo: https://github.com/asottile/yesqa rev: v1.3.0 hooks: - id: yesqa additional_dependencies: - - flake8==3.8.4 + - flake8==6.0.0 + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v11.1.0 + hooks: + - id: clang-format + exclude: | + (?x)^( + cpp/libcugraph_etl| + cpp/tests/c_api/.* + ) + types_or: [c, c++, cuda] + args: ["-fallback-style=none", "-style=file", "-i"] + - repo: local + hooks: + - id: copyright-check + name: copyright-check + entry: python ./ci/checks/copyright.py --git-modified-only --update-current-year + language: python + pass_filenames: false + additional_dependencies: [gitpython] From 1b7c43640e4bf7ba0223b5e8c153eadbb76771b2 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Fri, 16 Dec 2022 02:28:32 -0600 Subject: [PATCH 220/384] Adds parameterized benchmarks for `uniform_neighbor_sampling`, updates `benchmarks` dir for future additions (#3048) closes #3034 This PR updates the top-level `benchmarks` dir to better organize benchmarks (and future benchmarks) based on package name. Additional parameterized benchmarks for `uniform_neighbor_sampling` were added as well as re-usable fixtures and pytest param objects and utilities. Other updates include: * Bug fix for MG graphs related to invalid internal column names after renumbering * Removed redundant `genFixteurParamsProduct` and refactored so only one copy is used for both cugraph and PLC * Cleaned up some import statements The "breaking" label is used because the `benchmarks` dir re-org changes the location of existing benchmarks, which could break scripts that call them. Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Alex Barghi (https://github.com/alexbarghi-nv) - Vibhu Jawa (https://github.com/VibhuJawa) - Ray Douglass (https://github.com/raydouglass) - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3048 --- benchmarks/pytest.ini | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 06a67a060..5c2290fae 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -1,9 +1,13 @@ [pytest] +pythonpath = + shared/python + +testpaths = + cugraph/pytest_based + cugraph-service/pytest_based + addopts = - --benchmark-warmup=on - --benchmark-warmup-iterations=1 - --benchmark-min-rounds=3 - --benchmark-columns="min, max, mean, stddev, outliers, gpu_mem, rounds" + --benchmark-columns="min, max, mean, stddev, outliers" markers = managedmem_on: RMM managed memory enabled @@ -15,6 +19,32 @@ markers = tiny: tiny datasets directed: directed datasets undirected: undirected datasets + matrix_types: inputs are matrices + nx_types: inputs are NetowrkX Graph objects + cugraph_types: inputs are cuGraph Graph objects + sg: single-GPU + mg: multi-GPU + snmg: single-node multi-GPU + mnmg: multi-node multi-GPU + local: local cugraph + remote: cugraph-service + batch_size_100: batch size of 100 for sampling algos + batch_size_500: batch size of 500 for sampling algos + batch_size_1000: batch size of 1000 for sampling algos + batch_size_2500: batch size of 2500 for sampling algos + batch_size_5000: batch size of 5000 for sampling algos + batch_size_10000: batch size of 10000 for sampling algos + batch_size_20000: batch size of 20000 for sampling algos + batch_size_30000: batch size of 30000 for sampling algos + batch_size_40000: batch size of 40000 for sampling algos + batch_size_50000: batch size of 50000 for sampling algos + batch_size_60000: batch size of 60000 for sampling algos + batch_size_70000: batch size of 70000 for sampling algos + batch_size_80000: batch size of 80000 for sampling algos + batch_size_90000: batch size of 90000 for sampling algos + batch_size_100000: batch size of 100000 for sampling algos + fanout_10_25: fanout [10, 25] for sampling algos + fanout_5_10_15: fanout [5, 10, 15] for sampling algos python_classes = Bench* From 5e3c76823eba1fde81e4727599b175ea1dc44ba1 Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Wed, 21 Dec 2022 10:16:05 -0500 Subject: [PATCH 221/384] Add API's for dgl, pyg, cugraph service (server and client) to sphinx (#3075) The package API's above will be present in the cugraph docs Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3075 --- docs/cugraph/source/api_docs/cugraph_dgl.rst | 1 + docs/cugraph/source/api_docs/cugraph_pyg.rst | 4 +++- .../source/api_docs/cugraph_service_client.rst | 12 +++++++----- .../source/api_docs/cugraph_service_server.rst | 5 +++-- docs/cugraph/source/basics/index.rst | 5 +---- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/cugraph/source/api_docs/cugraph_dgl.rst b/docs/cugraph/source/api_docs/cugraph_dgl.rst index f1f508754..9a8b3ba6c 100644 --- a/docs/cugraph/source/api_docs/cugraph_dgl.rst +++ b/docs/cugraph/source/api_docs/cugraph_dgl.rst @@ -12,3 +12,4 @@ Methods :toctree: api/ cugraph_dgl.cugraph_storage_from_heterograph + cugraph_dgl.cugraph_storage.CuGraphStorage diff --git a/docs/cugraph/source/api_docs/cugraph_pyg.rst b/docs/cugraph/source/api_docs/cugraph_pyg.rst index 0184a4a07..b2772450c 100644 --- a/docs/cugraph/source/api_docs/cugraph_pyg.rst +++ b/docs/cugraph/source/api_docs/cugraph_pyg.rst @@ -9,5 +9,7 @@ cugraph-pyg .. autosummary:: :toctree: api/ + cugraph_pyg.data.cugraph_store.EXPERIMENTAL__CuGraphStore cugraph_pyg.loader.dispatch.call_cugraph_algorithm - cugraph_pyg.sampler.EXPERIMENTAL__CuGraphSampler + cugraph_pyg.sampler.cugraph_sampler.EXPERIMENTAL__CuGraphSampler + diff --git a/docs/cugraph/source/api_docs/cugraph_service_client.rst b/docs/cugraph/source/api_docs/cugraph_service_client.rst index 8947bc83b..1ea727bd3 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_client.rst +++ b/docs/cugraph/source/api_docs/cugraph_service_client.rst @@ -10,12 +10,14 @@ cugraph-service :toctree: api/ cugraph_service_client.client.RunAsyncioThread - cugraph_service_client.cugraph_service_thrift - cugraph_service_client.defaults - cugraph_service_client.exceptions + cugraph_service_client.client.run_async + cugraph_service_client.client.DeviceArrayAllocator + cugraph_service_client.client.CugraphServiceClient cugraph_service_client.remote_graph_utils - cugraph_service_client.remote_graph - cugraph_service_client.types + cugraph_service_client.remote_graph.RemoteGraph + cugraph_service_client.types.UnionWrapper + cugraph_service_client.types.ValueWrapper + cugraph_service_client.types.GraphVertexEdgeIDWrapper diff --git a/docs/cugraph/source/api_docs/cugraph_service_server.rst b/docs/cugraph/source/api_docs/cugraph_service_server.rst index 7e90759ef..5f4c6aa5e 100644 --- a/docs/cugraph/source/api_docs/cugraph_service_server.rst +++ b/docs/cugraph/source/api_docs/cugraph_service_server.rst @@ -9,5 +9,6 @@ cugraph-service .. autosummary:: :toctree: api/ - cugraph_service_server.cugraph_handler - + cugraph_service_server.cugraph_handler.call_algo + cugraph_service_server.cugraph_handler.ExtensionServerFacade + cugraph_service_server.cugraph_handler.CugraphHandler diff --git a/docs/cugraph/source/basics/index.rst b/docs/cugraph/source/basics/index.rst index 9260169ee..46331fc6c 100644 --- a/docs/cugraph/source/basics/index.rst +++ b/docs/cugraph/source/basics/index.rst @@ -6,7 +6,4 @@ Basics .. toctree:: :maxdepth: 2 - cugraph_intro.md - cugraph_blogs.rst - cugraph_ref.rst - nx_transition.rst + cugraph_toc.md From b42d3f281d289965f060cfa2b43b2da104e22777 Mon Sep 17 00:00:00 2001 From: Rick Ratzel <3039903+rlratzel@users.noreply.github.com> Date: Thu, 12 Jan 2023 11:25:44 -0600 Subject: [PATCH 222/384] Adds initial cugraph-service client scaling benchmark, refactorings, performance config updates (#3087) closes #3109 * Adds additional benchmarks for sampling performance as the number of concurrent cutraph-service client's increases * Refactors and adds various benchmarks utilities * Updates various dask configurations for improved performance Authors: - Rick Ratzel (https://github.com/rlratzel) Approvers: - Alex Barghi (https://github.com/alexbarghi-nv) - Vibhu Jawa (https://github.com/VibhuJawa) URL: https://github.com/rapidsai/cugraph/pull/3087 --- benchmarks/pytest.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmarks/pytest.ini b/benchmarks/pytest.ini index 5c2290fae..b61fa92d4 100644 --- a/benchmarks/pytest.ini +++ b/benchmarks/pytest.ini @@ -43,6 +43,11 @@ markers = batch_size_80000: batch size of 80000 for sampling algos batch_size_90000: batch size of 90000 for sampling algos batch_size_100000: batch size of 100000 for sampling algos + num_clients_2: start 2 cugraph-service clients + num_clients_4: start 4 cugraph-service clients + num_clients_8: start 8 cugraph-service clients + num_clients_16: start 16 cugraph-service clients + num_clients_32: start 32 cugraph-service clients fanout_10_25: fanout [10, 25] for sampling algos fanout_5_10_15: fanout [5, 10, 15] for sampling algos From 74ba81bd5239d565cc2f6a31f3406250becba8cb Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Thu, 12 Jan 2023 16:22:56 -0600 Subject: [PATCH 223/384] Fix documentation author (#3128) Fixes docs to mark NVIDIA as the author. Authors: - Bradley Dice (https://github.com/bdice) - Brad Rees (https://github.com/BradReesWork) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3128 --- docs/cugraph/source/conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index a9e3e2d6c..597389300 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright (c) 2018-2022, NVIDIA CORPORATION. +# Copyright (c) 2018-2023, NVIDIA CORPORATION. # # pygdf documentation build configuration file, created by # sphinx-quickstart on Wed May 3 10:59:22 2017. @@ -73,8 +73,8 @@ # General information about the project. project = 'cugraph' -copyright = '2019-2022, NVIDIA' -author = 'NVIDIA' +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 @@ -176,7 +176,7 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'cugraph.tex', 'cugraph Documentation', - 'nvidia', 'manual'), + 'NVIDIA Corporation', 'manual'), ] From 0523e84b88e88aa02b29a633a2ab4df9c0c05354 Mon Sep 17 00:00:00 2001 From: Raymond Douglass Date: Mon, 23 Jan 2023 10:48:15 -0500 Subject: [PATCH 224/384] DOC v23.04 Updates --- docs/cugraph/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cugraph/source/conf.py b/docs/cugraph/source/conf.py index 597389300..4d39e7d8d 100644 --- a/docs/cugraph/source/conf.py +++ b/docs/cugraph/source/conf.py @@ -81,9 +81,9 @@ # built documents. # # The short X.Y version. -version = '23.02' +version = '23.04' # The full version, including alpha/beta/rc tags. -release = '23.02.00' +release = '23.04.00' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From c2b3adcc9f71e609834d7e29b709e7fdeb9b25cf Mon Sep 17 00:00:00 2001 From: Don Acosta <97529984+acostadon@users.noreply.github.com> Date: Fri, 27 Jan 2023 15:19:57 -0500 Subject: [PATCH 225/384] Create a notebook comparing nx and cuGraph using synthetic data (#3135) Rapids visualization group asked for some data comparing cuGraph algos to nx. Used Release notebook as a base, replaced datasets with RMAT data generator. Closes #3134 Authors: - Don Acosta (https://github.com/acostadon) Approvers: - Brad Rees (https://github.com/BradReesWork) URL: https://github.com/rapidsai/cugraph/pull/3135 --- .../cugraph_benchmarks/synth_release.ipynb | 868 ++++++++++++++++++ 1 file changed, 868 insertions(+) create mode 100644 notebooks/cugraph_benchmarks/synth_release.ipynb diff --git a/notebooks/cugraph_benchmarks/synth_release.ipynb b/notebooks/cugraph_benchmarks/synth_release.ipynb new file mode 100644 index 000000000..18979f3ec --- /dev/null +++ b/notebooks/cugraph_benchmarks/synth_release.ipynb @@ -0,0 +1,868 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Skip notebook test\n", + "-----\n", + "\n", + "#### NOTE: This notebook will take hours to run.\n", + "-----\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Comparing NetworkX vs cuGraph using synthetic data on various algorithms\n", + "\n", + "\n", + "This notebook compares the execution times of many of the cuGraph and NetworkX algorithms when run against identical synthetic data at multiple scales.\n", + "\n", + "This notebook uses the RMAT data generator which allows the creation of graphs at various scales. The notebook, by default, runs on a set of selected sizes but users are free to change or add to that list." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notebook Credits\n", + "\n", + " \n", + "| Author | Date | Update | cuGraph Version | Test Hardware |\n", + "| --------------|------------|---------------------|-----------------|------------------------|\n", + "| Don Acosta | 1/12/2023 | Created | 23.02 nightly | RTX A6000, CUDA 11.7 |\n", + "| Brad Rees | 1/27/2023 | Modified | 23.02 nightly | RTX A6000, CUDA 11.7 |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Timing " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When looking at the overall workflow, NetworkX and cuGraph do things differently. For example, NetworkX spends a lot of time creating the graph data structure. cuGraph on the other hand does a lazy creation of the data structure when an algorithm is called. To further complicate the comparison problem, NetworkX does not always return the answer. In some cases, it returns a generator that is then called to produce the data. \n", + "\n", + "This benchmark produces two performance metrics:\n", + " - (1)\tJust the algorithm run time \n", + " - (2)\tThe algorithm plus graph creation time\n", + "\n", + "Since GPU memory is a precious resource, having a lot of temporary data laying around is avoided. So once a graph is created, the raw data is dropped. \n", + " \n", + "__What is not timed__: Generating the data with R-MAT