From e75cd0c08a80c10b251135ed4b94f06f6ae23299 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 1 Dec 2023 08:48:32 +0000 Subject: [PATCH 1/6] Add dask dataset and complete basic tests --- python/cugraph/cugraph/datasets/dataset.py | 161 +++++++++++++++++- .../cugraph/tests/utils/test_dataset.py | 27 ++- 2 files changed, 184 insertions(+), 4 deletions(-) diff --git a/python/cugraph/cugraph/datasets/dataset.py b/python/cugraph/cugraph/datasets/dataset.py index dd7aa0df00a..bb347858eac 100644 --- a/python/cugraph/cugraph/datasets/dataset.py +++ b/python/cugraph/cugraph/datasets/dataset.py @@ -12,9 +12,11 @@ # limitations under the License. import cudf +import dask_cudf import yaml import os import pandas as pd +import cugraph.dask as dcg from pathlib import Path from cugraph.structure.graph_classes import Graph @@ -148,6 +150,28 @@ def __download_csv(self, url): ) return self._path + def __download_dask_csv(self, url): + """ + Downloads the .csv file from url to the current download path + (self._dl_path) via multiple GPUs, updates self._path with the + full path to the downloaded file, and returns the latest value + of self._path. + """ + self._dl_path.path.mkdir(parents=True, exist_ok=True) + + filename = self.metadata["name"] + self.metadata["file_type"] + if self._dl_path.path.is_dir(): + blocksize = dcg.get_chunksize(url) + ddf = dask_cudf.read_csv(path=url, blocksize=blocksize) + self._path = self._dl_path.path / filename + ddf.to_csv(self._path, index=False) + + else: + raise RuntimeError( + f"The directory {self._dl_path.path.absolute()}" "does not exist" + ) + return self._path + def unload(self): """ @@ -162,7 +186,7 @@ def unload(self): def get_edgelist(self, download=False, reader="cudf"): """ - Return an Edgelist + Return an Edgelist. Parameters ---------- @@ -212,6 +236,47 @@ def get_edgelist(self, download=False, reader="cudf"): return self._edgelist.copy() + def get_dask_edgelist(self, download=False): + """ + Return a distributed Edgelist. + + Parameters + ---------- + download : Boolean (default=False) + Automatically download the dataset from the 'url' location within + the YAML file. + """ + if self._edgelist is None: + full_path = self.get_path() + if not full_path.is_file(): + if download: + full_path = self.__download_dask_csv(self.metadata["url"]) + else: + raise RuntimeError( + f"The datafile {full_path} does not" + " exist. Try setting download=True" + " to download the datafile" + ) + + header = None + if isinstance(self.metadata["header"], int): + header = self.metadata["header"] + + blocksize = dcg.get_chunksize(full_path) + self._edgelist = dask_cudf.read_csv( + path=full_path, + blocksize=blocksize, + delimiter=self.metadata["delim"], + names=self.metadata["col_names"], + dtype={ + self.metadata["col_names"][i]: self.metadata["col_types"][i] + for i in range(len(self.metadata["col_types"])) + }, + header=header, + ) + + return self._edgelist.copy() + def get_graph( self, download=False, @@ -249,7 +314,7 @@ def get_graph( if create_using is None: G = Graph() elif isinstance(create_using, Graph): - # what about BFS if trnaposed is True + # what about BFS if transposed is True attrs = {"directed": create_using.is_directed()} G = type(create_using)(**attrs) elif type(create_using) is type: @@ -276,6 +341,71 @@ def get_graph( store_transposed=store_transposed, ) return G + + def get_dask_graph( + self, + download=False, + create_using=Graph, + ignore_weights=False, + store_transposed=False, + ): + """ + Return a distributed Graph object. + + Parameters + ---------- + download : Boolean (default=False) + Downloads the dataset from the web. + + create_using: cugraph.Graph (instance or class), optional + (default=Graph) + Specify the type of Graph to create. Can pass in an instance to + create a Graph instance with specified 'directed' attribute. + + ignore_weights : Boolean (default=False) + Ignores weights in the dataset if True, resulting in an + unweighted Graph. If False (the default), weights from the + dataset -if present- will be applied to the Graph. If the + dataset does not contain weights, the Graph returned will + be unweighted regardless of ignore_weights. + + store_transposed : bool, optional (default=False) + If True, stores the transpose of the adjacency matrix. Required + for certain algorithms. + """ + if self._edgelist is None: + self.get_dask_edgelist(download) + + if create_using is None: + G = Graph() + elif isinstance(create_using, Graph): + attrs = {"directed": create_using.is_directed()} + G = type(create_using)(**attrs) + elif type(create_using) is type: + G = create_using() + else: + raise TypeError( + "create_using must be a cugraph.Graph " + "(or subclass) type or instance, got: " + f"{type(create_using)}" + ) + + if len(self.metadata["col_names"]) > 2 and not (ignore_weights): + G.from_dask_cudf_edgelist( + self._edgelist, + source=self.metadata["col_names"][0], + destination=self.metadata["col_names"][1], + edge_attr=self.metadata["col_names"][2], + store_transposed=store_transposed, + ) + else: + G.from_dask_cudf_edgelist( + self._edgelist, + source=self.metadata["col_names"][0], + destination=self.metadata["col_names"][1], + store_transposed=store_transposed, + ) + return G def get_path(self): """ @@ -351,6 +481,33 @@ def download_all(force=False): df.to_csv(save_to, index=False) +def download_dask_all(force=False): + """ + Looks in `metadata` directory and downloads all datafiles from the the URLs + provided in each YAML file via multiple GPUs. + + Parameters + force : Boolean (default=False) + Overwrite any existing copies of datafiles. + """ + default_download_dir.path.mkdir(parents=True, exist_ok=True) + + meta_path = Path(__file__).parent.absolute() / "metadata" + for file in meta_path.iterdir(): + meta = None + if file.suffix == ".yaml": + with open(meta_path / file, "r") as metafile: + meta = yaml.safe_load(metafile) + + if "url" in meta: + filename = meta["name"] + meta["file_type"] + save_to = default_download_dir.path / filename + if not save_to.is_file() or force: + blocksize = dcg.get_chunksize(meta["url"]) + ddf = dask_cudf.read_csv(path=meta["url"], blocksize=blocksize) + ddf.to_csv(save_to, index=False) + + def set_download_dir(path): """ Set the download location for datasets diff --git a/python/cugraph/cugraph/tests/utils/test_dataset.py b/python/cugraph/cugraph/tests/utils/test_dataset.py index 60bc6dbb45a..286b85043a8 100644 --- a/python/cugraph/cugraph/tests/utils/test_dataset.py +++ b/python/cugraph/cugraph/tests/utils/test_dataset.py @@ -20,6 +20,7 @@ import pytest import cudf +import dask_cudf from cugraph.structure import Graph from cugraph.testing import ( RAPIDS_DATASET_ROOT_DIR_PATH, @@ -171,18 +172,40 @@ def test_reader(dataset): dataset.get_edgelist(reader=None) +@pytest.mark.parametrize("dataset", ALL_DATASETS) +def test_dask_reader(dask_client, dataset): + # using dask_cudf + E = dataset.get_dask_edgelist(download=True) + + assert E is not None + assert isinstance(E, dask_cudf.core.DataFrame) + dataset.unload() + + @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_get_edgelist(dataset): E = dataset.get_edgelist(download=True) assert E is not None +@pytest.mark.parametrize("dataset", ALL_DATASETS) +def test_get_dask_edgelist(dask_client, dataset): + E = dataset.get_dask_edgelist(download=True) + assert E is not None + + @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_get_graph(dataset): G = dataset.get_graph(download=True) assert G is not None +@pytest.mark.parametrize("dataset", ALL_DATASETS) +def test_get_dask_graph(dask_client, dataset): + G = dataset.get_dask_graph(download=True) + assert G is not None + + @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_metadata(dataset): M = dataset.metadata @@ -217,7 +240,7 @@ def test_create_using(dataset): assert G.is_directed() -def test_ctor_with_datafile(): +""" def test_ctor_with_datafile(): from cugraph.datasets import karate karate_csv = RAPIDS_DATASET_ROOT_DIR_PATH / "karate.csv" @@ -365,4 +388,4 @@ def test_object_getters(dataset): assert dataset.is_symmetric() == dataset.metadata["is_symmetric"] assert dataset.number_of_nodes() == dataset.metadata["number_of_nodes"] assert dataset.number_of_vertices() == dataset.metadata["number_of_nodes"] - assert dataset.number_of_edges() == dataset.metadata["number_of_edges"] + assert dataset.number_of_edges() == dataset.metadata["number_of_edges"] """ From f35f2e13d46d326cabb6592520b2f38fe272d17b Mon Sep 17 00:00:00 2001 From: huiyuxie Date: Fri, 1 Dec 2023 08:54:55 +0000 Subject: [PATCH 2/6] Black reformat --- python/cugraph/cugraph/datasets/dataset.py | 11 +++++------ python/cugraph/cugraph/tests/utils/test_dataset.py | 5 ++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/python/cugraph/cugraph/datasets/dataset.py b/python/cugraph/cugraph/datasets/dataset.py index bb347858eac..ae8ccf4c934 100644 --- a/python/cugraph/cugraph/datasets/dataset.py +++ b/python/cugraph/cugraph/datasets/dataset.py @@ -153,8 +153,8 @@ def __download_csv(self, url): def __download_dask_csv(self, url): """ Downloads the .csv file from url to the current download path - (self._dl_path) via multiple GPUs, updates self._path with the - full path to the downloaded file, and returns the latest value + (self._dl_path) via multiple GPUs, updates self._path with the + full path to the downloaded file, and returns the latest value of self._path. """ self._dl_path.path.mkdir(parents=True, exist_ok=True) @@ -173,7 +173,6 @@ def __download_dask_csv(self, url): return self._path def unload(self): - """ Remove all saved internal objects, forcing them to be re-created when accessed. @@ -257,7 +256,7 @@ def get_dask_edgelist(self, download=False): " exist. Try setting download=True" " to download the datafile" ) - + header = None if isinstance(self.metadata["header"], int): header = self.metadata["header"] @@ -341,7 +340,7 @@ def get_graph( store_transposed=store_transposed, ) return G - + def get_dask_graph( self, download=False, @@ -404,7 +403,7 @@ def get_dask_graph( source=self.metadata["col_names"][0], destination=self.metadata["col_names"][1], store_transposed=store_transposed, - ) + ) return G def get_path(self): diff --git a/python/cugraph/cugraph/tests/utils/test_dataset.py b/python/cugraph/cugraph/tests/utils/test_dataset.py index 286b85043a8..6faed28b31c 100644 --- a/python/cugraph/cugraph/tests/utils/test_dataset.py +++ b/python/cugraph/cugraph/tests/utils/test_dataset.py @@ -38,6 +38,7 @@ ############################################################################### # Fixtures + # module fixture - called once for this module @pytest.fixture(scope="module") def tmpdir(): @@ -78,6 +79,7 @@ def setup(tmpdir): ############################################################################### # Helpers + # check if there is a row where src == dst def has_selfloop(dataset): if not dataset.metadata["is_directed"]: @@ -116,6 +118,7 @@ def is_symmetric(dataset): ############################################################################### # Tests + # setting download_dir to None effectively re-initialized the default def test_env_var(): os.environ["RAPIDS_DATASET_ROOT_DIR"] = "custom_storage_location" @@ -204,7 +207,7 @@ def test_get_graph(dataset): def test_get_dask_graph(dask_client, dataset): G = dataset.get_dask_graph(download=True) assert G is not None - + @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_metadata(dataset): From d617d161656bcbe277d529c1c521b726bc8cd4e2 Mon Sep 17 00:00:00 2001 From: huiyuxie Date: Sat, 2 Dec 2023 05:26:00 +0000 Subject: [PATCH 3/6] Add more tests to dask dataset --- .../cugraph/tests/utils/test_dataset.py | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/python/cugraph/cugraph/tests/utils/test_dataset.py b/python/cugraph/cugraph/tests/utils/test_dataset.py index 6faed28b31c..83cafd0a116 100644 --- a/python/cugraph/cugraph/tests/utils/test_dataset.py +++ b/python/cugraph/cugraph/tests/utils/test_dataset.py @@ -147,16 +147,24 @@ def test_set_download_dir(): @pytest.mark.parametrize("dataset", ALL_DATASETS) -def test_download(dataset): +def test_download_csv(dataset): E = dataset.get_edgelist(download=True) assert E is not None assert dataset.get_path().is_file() +@pytest.mark.parametrize("dataset", ALL_DATASETS) +def test_dask_download_csv(dask_client, dataset): + E = dataset.get_dask_edgelist(download=True) + + assert E is not None + assert dataset.get_path().is_file() + + @pytest.mark.parametrize("dataset", SMALL_DATASETS) def test_reader(dataset): - # defaults to using cudf.read_csv + # defaults to using cudf E = dataset.get_edgelist(download=True) assert E is not None @@ -175,7 +183,7 @@ def test_reader(dataset): dataset.get_edgelist(reader=None) -@pytest.mark.parametrize("dataset", ALL_DATASETS) +@pytest.mark.parametrize("dataset", SMALL_DATASETS) def test_dask_reader(dask_client, dataset): # using dask_cudf E = dataset.get_dask_edgelist(download=True) @@ -231,6 +239,14 @@ def test_weights(dataset): assert G.is_weighted() G = dataset.get_graph(download=True, ignore_weights=True) assert not G.is_weighted() + + +@pytest.mark.parametrize("dataset", WEIGHTED_DATASETS) +def test_dask_weights(dask_client, dataset): + G = dataset.get_dask_graph(download=True) + assert G.is_weighted() + G = dataset.get_dask_graph(download=True, ignore_weights=True) + assert not G.is_weighted() @pytest.mark.parametrize("dataset", SMALL_DATASETS) @@ -241,6 +257,16 @@ def test_create_using(dataset): assert not G.is_directed() G = dataset.get_graph(download=True, create_using=Graph(directed=True)) assert G.is_directed() + + +@pytest.mark.parametrize("dataset", SMALL_DATASETS) +def test_dask_create_using(dask_client, dataset): + G = dataset.get_dask_graph(download=True) + assert not G.is_directed() + G = dataset.get_dask_graph(download=True, create_using=Graph) + assert not G.is_directed() + G = dataset.get_dask_graph(download=True, create_using=Graph(directed=True)) + assert G.is_directed() """ def test_ctor_with_datafile(): From 74602e69ef784c04741d537190e0baf28d300ae1 Mon Sep 17 00:00:00 2001 From: huiyuxie Date: Sat, 2 Dec 2023 08:41:15 +0000 Subject: [PATCH 4/6] Pass all dask tests --- python/cugraph/cugraph/datasets/dataset.py | 6 +-- .../cugraph/tests/utils/test_dataset.py | 39 ++++++++++++++----- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/python/cugraph/cugraph/datasets/dataset.py b/python/cugraph/cugraph/datasets/dataset.py index ae8ccf4c934..18726cdb1e5 100644 --- a/python/cugraph/cugraph/datasets/dataset.py +++ b/python/cugraph/cugraph/datasets/dataset.py @@ -316,7 +316,7 @@ def get_graph( # what about BFS if transposed is True attrs = {"directed": create_using.is_directed()} G = type(create_using)(**attrs) - elif type(create_using) is type: + elif issubclass(create_using, Graph): G = create_using() else: raise TypeError( @@ -380,7 +380,7 @@ def get_dask_graph( elif isinstance(create_using, Graph): attrs = {"directed": create_using.is_directed()} G = type(create_using)(**attrs) - elif type(create_using) is type: + elif issubclass(create_using, Graph): G = create_using() else: raise TypeError( @@ -408,7 +408,7 @@ def get_dask_graph( def get_path(self): """ - Returns the location of the stored dataset file + Returns the location of the stored dataset file. """ if self._path is None: self._path = self._dl_path.path / ( diff --git a/python/cugraph/cugraph/tests/utils/test_dataset.py b/python/cugraph/cugraph/tests/utils/test_dataset.py index 83cafd0a116..b6ab3a244c3 100644 --- a/python/cugraph/cugraph/tests/utils/test_dataset.py +++ b/python/cugraph/cugraph/tests/utils/test_dataset.py @@ -30,6 +30,7 @@ BENCHMARKING_DATASETS, ) from cugraph import datasets +from cugraph.dask.common.mg_utils import is_single_gpu # Add the sg marker to all tests in this module. pytestmark = pytest.mark.sg @@ -147,15 +148,17 @@ def test_set_download_dir(): @pytest.mark.parametrize("dataset", ALL_DATASETS) -def test_download_csv(dataset): +def test_download(dataset): E = dataset.get_edgelist(download=True) assert E is not None assert dataset.get_path().is_file() +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", ALL_DATASETS) -def test_dask_download_csv(dask_client, dataset): +def test_download_dask(dask_client, dataset): E = dataset.get_dask_edgelist(download=True) assert E is not None @@ -183,8 +186,10 @@ def test_reader(dataset): dataset.get_edgelist(reader=None) +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", SMALL_DATASETS) -def test_dask_reader(dask_client, dataset): +def test_reader_dask(dask_client, dataset): # using dask_cudf E = dataset.get_dask_edgelist(download=True) @@ -199,6 +204,8 @@ def test_get_edgelist(dataset): assert E is not None +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_get_dask_edgelist(dask_client, dataset): E = dataset.get_dask_edgelist(download=True) @@ -211,6 +218,8 @@ def test_get_graph(dataset): assert G is not None +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", ALL_DATASETS) def test_get_dask_graph(dask_client, dataset): G = dataset.get_dask_graph(download=True) @@ -239,10 +248,12 @@ def test_weights(dataset): assert G.is_weighted() G = dataset.get_graph(download=True, ignore_weights=True) assert not G.is_weighted() - + +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", WEIGHTED_DATASETS) -def test_dask_weights(dask_client, dataset): +def test_weights_dask(dask_client, dataset): G = dataset.get_dask_graph(download=True) assert G.is_weighted() G = dataset.get_dask_graph(download=True, ignore_weights=True) @@ -257,10 +268,16 @@ def test_create_using(dataset): assert not G.is_directed() G = dataset.get_graph(download=True, create_using=Graph(directed=True)) assert G.is_directed() - + # using a non-Graph type should raise an error + with pytest.raises(TypeError): + dataset.get_graph(download=True, create_using=set) + + +@pytest.mark.skipif(is_single_gpu(), reason="skipping MG testing on Single GPU system") +@pytest.mark.skip(reason="MG not supported on CI") @pytest.mark.parametrize("dataset", SMALL_DATASETS) -def test_dask_create_using(dask_client, dataset): +def test_create_using_dask(dask_client, dataset): G = dataset.get_dask_graph(download=True) assert not G.is_directed() G = dataset.get_dask_graph(download=True, create_using=Graph) @@ -268,8 +285,12 @@ def test_dask_create_using(dask_client, dataset): G = dataset.get_dask_graph(download=True, create_using=Graph(directed=True)) assert G.is_directed() + # using a non-Graph type should raise an error + with pytest.raises(TypeError): + dataset.get_dask_graph(download=True, create_using=set) + -""" def test_ctor_with_datafile(): +def test_ctor_with_datafile(): from cugraph.datasets import karate karate_csv = RAPIDS_DATASET_ROOT_DIR_PATH / "karate.csv" @@ -417,4 +438,4 @@ def test_object_getters(dataset): assert dataset.is_symmetric() == dataset.metadata["is_symmetric"] assert dataset.number_of_nodes() == dataset.metadata["number_of_nodes"] assert dataset.number_of_vertices() == dataset.metadata["number_of_nodes"] - assert dataset.number_of_edges() == dataset.metadata["number_of_edges"] """ + assert dataset.number_of_edges() == dataset.metadata["number_of_edges"] From 3540a1c3cea047d9ba24e55b5782966ca6c35324 Mon Sep 17 00:00:00 2001 From: huiyuxie Date: Thu, 21 Dec 2023 17:01:01 +0000 Subject: [PATCH 5/6] Refactor file download method --- python/cugraph/cugraph/datasets/dataset.py | 58 ++-------------------- 1 file changed, 4 insertions(+), 54 deletions(-) diff --git a/python/cugraph/cugraph/datasets/dataset.py b/python/cugraph/cugraph/datasets/dataset.py index 18726cdb1e5..be17fcb2a9c 100644 --- a/python/cugraph/cugraph/datasets/dataset.py +++ b/python/cugraph/cugraph/datasets/dataset.py @@ -18,6 +18,7 @@ import pandas as pd import cugraph.dask as dcg from pathlib import Path +import urllib.request from cugraph.structure.graph_classes import Graph @@ -140,31 +141,8 @@ def __download_csv(self, url): filename = self.metadata["name"] + self.metadata["file_type"] if self._dl_path.path.is_dir(): - df = cudf.read_csv(url) self._path = self._dl_path.path / filename - df.to_csv(self._path, index=False) - - else: - raise RuntimeError( - f"The directory {self._dl_path.path.absolute()}" "does not exist" - ) - return self._path - - def __download_dask_csv(self, url): - """ - Downloads the .csv file from url to the current download path - (self._dl_path) via multiple GPUs, updates self._path with the - full path to the downloaded file, and returns the latest value - of self._path. - """ - self._dl_path.path.mkdir(parents=True, exist_ok=True) - - filename = self.metadata["name"] + self.metadata["file_type"] - if self._dl_path.path.is_dir(): - blocksize = dcg.get_chunksize(url) - ddf = dask_cudf.read_csv(path=url, blocksize=blocksize) - self._path = self._dl_path.path / filename - ddf.to_csv(self._path, index=False) + urllib.request.urlretrieve(url, str(self._path)) else: raise RuntimeError( @@ -249,7 +227,7 @@ def get_dask_edgelist(self, download=False): full_path = self.get_path() if not full_path.is_file(): if download: - full_path = self.__download_dask_csv(self.metadata["url"]) + full_path = self.__download_csv(self.metadata["url"]) else: raise RuntimeError( f"The datafile {full_path} does not" @@ -476,35 +454,7 @@ def download_all(force=False): filename = meta["name"] + meta["file_type"] save_to = default_download_dir.path / filename if not save_to.is_file() or force: - df = cudf.read_csv(meta["url"]) - df.to_csv(save_to, index=False) - - -def download_dask_all(force=False): - """ - Looks in `metadata` directory and downloads all datafiles from the the URLs - provided in each YAML file via multiple GPUs. - - Parameters - force : Boolean (default=False) - Overwrite any existing copies of datafiles. - """ - default_download_dir.path.mkdir(parents=True, exist_ok=True) - - meta_path = Path(__file__).parent.absolute() / "metadata" - for file in meta_path.iterdir(): - meta = None - if file.suffix == ".yaml": - with open(meta_path / file, "r") as metafile: - meta = yaml.safe_load(metafile) - - if "url" in meta: - filename = meta["name"] + meta["file_type"] - save_to = default_download_dir.path / filename - if not save_to.is_file() or force: - blocksize = dcg.get_chunksize(meta["url"]) - ddf = dask_cudf.read_csv(path=meta["url"], blocksize=blocksize) - ddf.to_csv(save_to, index=False) + urllib.request.urlretrieve(meta["url"], str(save_to)) def set_download_dir(path): From f23b71942aac3287b5fc1c63a21c4dad6e848ada Mon Sep 17 00:00:00 2001 From: Rick Ratzel Date: Sat, 6 Jan 2024 23:14:06 -0600 Subject: [PATCH 6/6] Updates copyright year. --- python/cugraph/cugraph/datasets/dataset.py | 2 +- python/cugraph/cugraph/tests/utils/test_dataset.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/cugraph/cugraph/datasets/dataset.py b/python/cugraph/cugraph/datasets/dataset.py index be17fcb2a9c..9817d15dacb 100644 --- a/python/cugraph/cugraph/datasets/dataset.py +++ b/python/cugraph/cugraph/datasets/dataset.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, NVIDIA CORPORATION. +# Copyright (c) 2022-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/cugraph/cugraph/tests/utils/test_dataset.py b/python/cugraph/cugraph/tests/utils/test_dataset.py index b6ab3a244c3..39f7ed8850b 100644 --- a/python/cugraph/cugraph/tests/utils/test_dataset.py +++ b/python/cugraph/cugraph/tests/utils/test_dataset.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, NVIDIA CORPORATION. +# Copyright (c) 2022-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