From f462ec96e8cd80aab86eb9803de29ff823fdf20a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 17 Apr 2023 20:21:10 +0000 Subject: [PATCH 01/37] select edge props --- cpp/src/c_api/graph_mg.cpp | 21 +- cpp/src/c_api/graph_sg.cpp | 22 +- .../dask/sampling/uniform_neighbor_sample.py | 9 +- .../sampling/uniform_neighbor_sample.py | 13 +- .../cugraph/structure/convert_matrix.py | 6 +- .../cugraph/structure/graph_classes.py | 85 +- .../simpleDistributedGraph.py | 78 +- .../graph_implementation/simpleGraph.py | 102 +- .../cugraph/tests/structure/test_graph.py | 20 + .../cugraph/tests/structure/test_graph_mg.py | 23 + python/datasets/dolphins.csv | 318 + python/datasets/karate.csv | 156 + python/datasets/netscience.csv | 5484 +++++++++++++++++ python/datasets/polbooks.csv | 882 +++ python/datasets/small_line.csv | 9 + python/datasets/small_tree.csv | 11 + python/pylibcugraph/pylibcugraph/graphs.pyx | 28 +- .../internal_types/sampling_result.pyx | 12 + 18 files changed, 7146 insertions(+), 133 deletions(-) create mode 100644 python/datasets/dolphins.csv create mode 100644 python/datasets/karate.csv create mode 100644 python/datasets/netscience.csv create mode 100644 python/datasets/polbooks.csv create mode 100644 python/datasets/small_line.csv create mode 100644 python/datasets/small_tree.csv diff --git a/cpp/src/c_api/graph_mg.cpp b/cpp/src/c_api/graph_mg.cpp index 9b7206702ea..abd8a9e3fa7 100644 --- a/cpp/src/c_api/graph_mg.cpp +++ b/cpp/src/c_api/graph_mg.cpp @@ -338,19 +338,22 @@ extern "C" cugraph_error_code_t cugraph_mg_graph_create( weight_type = cugraph_data_type_id_t::FLOAT32; } - CAPI_EXPECTS((edge_type_ids == nullptr) || (p_edge_ids->type_ == edge_type), + CAPI_EXPECTS( + (edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), + CUGRAPH_INVALID_INPUT, + "Invalid input arguments: Edge id type must match edge (src/dst) type", + *error); + + CAPI_EXPECTS( + (edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", + "Invalid input arguments: src size != edge id prop size", *error); - CAPI_EXPECTS((edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), + CAPI_EXPECTS( + (edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: src size != edge prop size", - *error); - - CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), - CUGRAPH_INVALID_INPUT, - "Invalid input arguments: src size != edge prop size", + "Invalid input arguments: src size != edge type prop size", *error); cugraph_data_type_id_t edge_type_id_type; diff --git a/cpp/src/c_api/graph_sg.cpp b/cpp/src/c_api/graph_sg.cpp index 5267516f89b..4d0c73f38d1 100644 --- a/cpp/src/c_api/graph_sg.cpp +++ b/cpp/src/c_api/graph_sg.cpp @@ -513,26 +513,22 @@ extern "C" cugraph_error_code_t cugraph_sg_graph_create( weight_type = cugraph_data_type_id_t::FLOAT32; } - // FIXME: The combination of edge_ids != nullptr, edge_type_ids == nullptr - // logically should be valid, but the code will currently break if - // that is that is specified CAPI_EXPECTS( - (edge_type_ids == nullptr && edge_ids == nullptr) || - (edge_type_ids != nullptr && edge_ids != nullptr), + (edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: either none or both of edge ids and edge types must be provided.", + "Invalid input arguments: Edge id type must match edge (src/dst) type", *error); CAPI_EXPECTS( - (edge_type_ids == nullptr && edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), - CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", - *error); + (edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), + CUGRAPH_INVALID_INPUT, + "Invalid input arguments: src size != edge id prop size", + *error); - CAPI_EXPECTS((edge_type_ids == nullptr && edge_ids == nullptr) || - (p_edge_ids->size_ == p_src->size_ && p_edge_type_ids->size_ == p_dst->size_), + CAPI_EXPECTS( + (edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: src size != edge prop size", + "Invalid input arguments: src size != edge type prop size", *error); cugraph_data_type_id_t edge_type_id_type = cugraph_data_type_id_t::INT32; diff --git a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py index 15d109452eb..c4e0c2da9b9 100644 --- a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py @@ -141,10 +141,11 @@ def convert_to_cudf(cp_arrays, weight_t, with_edge_properties, return_offsets=Fa df[dst_n] = cupy_destinations df[indices_n] = cupy_indices - if weight_t == "int32": - df.indices = df.indices.astype("int32") - elif weight_t == "int64": - df.indices = df.indices.astype("int64") + if cupy_indices is not None: + if weight_t == "int32": + df.indices = df.indices.astype("int32") + elif weight_t == "int64": + df.indices = df.indices.astype("int64") return df diff --git a/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py index a7dad6c01a6..f363aaca4b3 100644 --- a/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py @@ -233,13 +233,16 @@ def uniform_neighbor_sample( df["sources"] = sources df["destinations"] = destinations - df["indices"] = indices - if weight_t == "int32": - df["indices"] = indices.astype("int32") - elif weight_t == "int64": - df["indices"] = indices.astype("int64") + if indices is None: + df['indices'] = None else: df["indices"] = indices + if weight_t == "int32": + df["indices"] = indices.astype("int32") + elif weight_t == "int64": + df["indices"] = indices.astype("int64") + else: + df["indices"] = indices if G.renumbered: df = G.unrenumber(df, "sources", preserve_order=True) diff --git a/python/cugraph/cugraph/structure/convert_matrix.py b/python/cugraph/cugraph/structure/convert_matrix.py index 1b46f7db970..85c4b9f6bd1 100644 --- a/python/cugraph/cugraph/structure/convert_matrix.py +++ b/python/cugraph/cugraph/structure/convert_matrix.py @@ -77,12 +77,12 @@ def from_edgelist( if df_type is cudf.DataFrame: return from_cudf_edgelist( - df, source, destination, edge_attr, create_using, renumber + df, source, destination, edge_attr=edge_attr, create_using=create_using, renumber=renumber ) elif (pd is not None) and (df_type is pd.DataFrame): return from_pandas_edgelist( - df, source, destination, edge_attr, create_using, renumber + df, source, destination, edge_attr=edge_attr, create_using=create_using, renumber=renumber ) elif df_type is dask_cudf.core.DataFrame: @@ -99,7 +99,7 @@ def from_edgelist( "(or subclass) type or instance, got: " f"{type(create_using)}" ) - G.from_dask_cudf_edgelist(df, source, destination, edge_attr, renumber) + G.from_dask_cudf_edgelist(df, source, destination, edge_attr=edge_attr, renumber=renumber) return G else: diff --git a/python/cugraph/cugraph/structure/graph_classes.py b/python/cugraph/cugraph/structure/graph_classes.py index 5fd398124b8..03d55bc4dd7 100644 --- a/python/cugraph/cugraph/structure/graph_classes.py +++ b/python/cugraph/cugraph/structure/graph_classes.py @@ -107,6 +107,9 @@ def from_cudf_edgelist( source="source", destination="destination", edge_attr=None, + weight=None, + edge_id=None, + edge_type=None, renumber=True, store_transposed=False, legacy_renum_only=False, @@ -137,8 +140,21 @@ def from_cudf_edgelist( destination : str or array-like, optional (default='destination') destination column name or array of column names - edge_attr : str or None, optional (default=None) - the weights column name. + edge_attr : str or List[str], optional (default=None) + Names of the edge attributes. Can either be a single string + representing the weight column name, or a list of length 3 + holding [weight, edge_id, edge_type]. If this argument is + provided, then the weight/edge_id/edge_type arguments must + be left empty. + + weight : str, optional (default=None) + Name of the weight column in the input dataframe. + + edge_id : str, optional (default=None) + Name of the edge id column in the input dataframe. + + edge_type : str, optional (default=None) + Name of the edge type column in the input dataframe. renumber : bool, optional (default=True) Indicate whether or not to renumber the source and destination @@ -176,6 +192,9 @@ def from_cudf_edgelist( source=source, destination=destination, edge_attr=edge_attr, + weight=weight, + edge_id=edge_id, + edge_type=edge_type, renumber=renumber, store_transposed=store_transposed, legacy_renum_only=legacy_renum_only, @@ -254,6 +273,9 @@ def from_dask_cudf_edgelist( source="source", destination="destination", edge_attr=None, + weight=None, + edge_id=None, + edge_type=None, renumber=True, store_transposed=False, legacy_renum_only=False, @@ -280,8 +302,21 @@ def from_dask_cudf_edgelist( destination : str, optional (default='destination') Destination column name or array of column names - edge_attr : str, optional (default=None) - Weights column name + edge_attr : str or List[str], optional (default=None) + Names of the edge attributes. Can either be a single string + representing the weight column name, or a list of length 3 + holding [weight, edge_id, edge_type]. If this argument is + provided, then the weight/edge_id/edge_type arguments must + be left empty. + + weight : str, optional (default=None) + Name of the weight column in the input dataframe. + + edge_id : str, optional (default=None) + Name of the edge id column in the input dataframe. + + edge_type : str, optional (default=None) + Name of the edge type column in the input dataframe. renumber : bool, optional (default=True) If source and destination indices are not in range 0 to V where V @@ -308,12 +343,15 @@ def from_dask_cudf_edgelist( raise RuntimeError("Graph already has values") self._Impl._simpleDistributedGraphImpl__from_edgelist( input_ddf, - source, - destination, - edge_attr, - renumber, - store_transposed, - legacy_renum_only, + source=source, + destination=destination, + edge_attr=edge_attr, + weight=weight, + edge_id=edge_id, + edge_type=edge_type, + renumber=renumber, + store_transposed=store_transposed, + legacy_renum_only=legacy_renum_only, ) # Move to Compat Module @@ -323,6 +361,9 @@ def from_pandas_edgelist( source="source", destination="destination", edge_attr=None, + weight=None, + edge_id=None, + edge_type=None, renumber=True, ): """ @@ -334,7 +375,9 @@ def from_pandas_edgelist( of vertices. If the input vertices are a single column of integers in the range [0, V), renumbering can be disabled and the original external vertex ids will be used. - If weights are present, edge_attr argument is the weights column name. + Weights, edge ids, and edge types can be passed through either the + edge_attr argument or individually as separate keyword arguments. + All three are optional. Parameters ---------- @@ -347,8 +390,21 @@ def from_pandas_edgelist( destination : str or array-like, optional (default='destination') Destination column name or array of column names - edge_attr : str or None, optional (default=None) - The weights column name + edge_attr : str or List[str], optional (default=None) + Names of the edge attributes. Can either be a single string + representing the weight column name, or a list of length 3 + holding [weight, edge_id, edge_type]. If this argument is + provided, then the weight/edge_id/edge_type arguments must + be left empty. + + weight : str, optional (default=None) + Name of the weight column in the input dataframe. + + edge_id : str, optional (default=None) + Name of the edge id column in the input dataframe. + + edge_type : str, optional (default=None) + Name of the edge type column in the input dataframe. renumber : bool, optional (default=True) Indicate whether or not to renumber the source and destination @@ -376,6 +432,9 @@ def from_pandas_edgelist( source=source, destination=destination, edge_attr=edge_attr, + weight=weight, + edge_id=edge_id, + edge_type=edge_type, renumber=renumber, ) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index 4b33cf4c847..74178ab300b 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -86,33 +86,30 @@ def _make_plc_graph( num_edges, ): + weights = None + edge_ids = None + edge_types = None + if simpleDistributedGraphImpl.edgeWeightCol in edata_x[0]: - values = edata_x[0][simpleDistributedGraphImpl.edgeWeightCol] - if values.dtype == "int32": - values = values.astype("float32") - elif values.dtype == "int64": - values = values.astype("float64") - else: - # Some algos require the graph to be weighted - values = cudf.Series(cupy.ones(len(edata_x[0]), dtype="float32")) + weights = edata_x[0][simpleDistributedGraphImpl.edgeWeightCol] + if weights.dtype == "int32": + weights = weights.astype("float32") + elif weights.dtype == "int64": + weights = weights.astype("float64") if simpleDistributedGraphImpl.edgeIdCol in edata_x[0]: - if simpleDistributedGraphImpl.edgeTypeCol not in edata_x[0]: - raise ValueError("Must provide both edge id and edge type") - - values_id = edata_x[0][simpleDistributedGraphImpl.edgeIdCol] - values_etype = edata_x[0][simpleDistributedGraphImpl.edgeTypeCol] - else: - values_id, values_etype = None, None + edge_ids = edata_x[0][simpleDistributedGraphImpl.edgeIdCol] + if simpleDistributedGraphImpl.edgeTypeCol in edata_x[0]: + edge_types = edata_x[0][simpleDistributedGraphImpl.edgeTypeCol] return MGGraph( resource_handle=ResourceHandle(Comms.get_handle(sID).getHandle()), graph_properties=graph_props, src_array=edata_x[0][src_col_name], dst_array=edata_x[0][dst_col_name], - weight_array=values, - edge_id_array=values_id, - edge_type_array=values_etype, + weight_array=weights, + edge_id_array=edge_ids, + edge_type_array=edge_types, store_transposed=store_transposed, num_edges=num_edges, do_expensive_check=False, @@ -125,6 +122,9 @@ def __from_edgelist( source="source", destination="destination", edge_attr=None, + weight=None, + edge_id=None, + edge_type=None, renumber=True, store_transposed=False, legacy_renum_only=False, @@ -161,8 +161,13 @@ def __from_edgelist( # The dataframe will be symmetrized iff the graph is undirected # otherwise, the inital dataframe will be returned if edge_attr is not None: + if weight is not None or edge_id is not None or edge_type is not None: + raise ValueError( + "If specifying edge_attr, cannot specify weight/edge_id/edge_type" + ) if isinstance(edge_attr, str): - edge_attr = [edge_attr] + weight = edge_attr + edge_attr = [weight] if not (set(edge_attr).issubset(set(input_ddf.columns))): raise ValueError( "edge_attr column name not found in input." @@ -198,21 +203,38 @@ def __from_edgelist( "undirected graph." ) - source_col, dest_col, value_col = symmetrize( + else: + value_col_names = {} + if weight is not None: + value_col_names[weight] = self.edgeWeightCol + self.properties.weighted=True + if edge_id is not None: + value_col_names[edge_id] = self.edgeIdCol + if edge_type is not None: + value_col_names[edge_type] = self.edgeTypeCol + + if len(value_col_names.keys()) > 0: + input_ddf = input_ddf.rename(columns=value_col_names) + value_col_names = list(value_col_names.values()) + + ddf_columns += value_col_names + input_ddf = input_ddf[ddf_columns] + + if len(value_col_names) == 0: + source_col, dest_col = symmetrize( input_ddf, source, destination, - value_col_names, multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) - + value_col = None else: - input_ddf = input_ddf[ddf_columns] - source_col, dest_col = symmetrize( + source_col, dest_col, value_col = symmetrize( input_ddf, source, destination, + value_col_names, multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) @@ -227,11 +249,9 @@ def __from_edgelist( # Multi column dask_cudf dataframe input_ddf = dask_cudf.concat([source_col, dest_col], axis=1) - if edge_attr is not None: - input_ddf[self.edgeWeightCol] = value_col[self.edgeWeightCol] - if len(edge_attr) == 3: - input_ddf[self.edgeIdCol] = value_col[self.edgeIdCol] - input_ddf[self.edgeTypeCol] = value_col[self.edgeTypeCol] + if value_col is not None: + for vc in value_col_names: + input_ddf[vc] = value_col[vc] self.input_df = input_ddf diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 7ad694e62f5..e15e3e852e3 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -24,8 +24,8 @@ import numpy as np import warnings from cugraph.dask.structure import replication -from typing import Union -from pylibcugraph import ( +from typing import Union, Dict, List +from pylibcugraph import ( get_two_hop_neighbors as pylibcugraph_get_two_hop_neighbors, select_random_vertices as pylibcugraph_select_random_vertices, ) @@ -46,25 +46,22 @@ class simpleGraphImpl: dstCol = "dst" class EdgeList: - def __init__(self, source, destination, edge_attr=None): + def __init__(self, source:str, destination:str, edge_attr:Union[cudf.DataFrame, Dict[str, cudf.DataFrame]]=None): + print('edge attr: ', edge_attr) self.edgelist_df = cudf.DataFrame() self.edgelist_df[simpleGraphImpl.srcCol] = source self.edgelist_df[simpleGraphImpl.dstCol] = destination self.weights = False if edge_attr is not None: - self.weights = True - if isinstance(edge_attr, (list, tuple)): - if len(edge_attr) == 3: - self.edgelist_df[simpleGraphImpl.edgeWeightCol] = edge_attr[0] - self.edgelist_df[simpleGraphImpl.edgeIdCol] = edge_attr[1] - self.edgelist_df[simpleGraphImpl.edgeTypeCol] = edge_attr[2] - elif len(edge_attr) == 1: - self.edgelist_df[simpleGraphImpl.edgeWeightCol] = edge_attr[0] - else: - raise ValueError( - "Illegal # of arguments provided" "for edge_attr" - ) + if isinstance(edge_attr, dict): + if edge_attr[simpleGraphImpl.edgeWeightCol] is not None: + self.weights = True + + for ea in [simpleGraphImpl.edgeIdCol, simpleGraphImpl.edgeTypeCol, simpleGraphImpl.edgeWeightCol]: + if edge_attr[ea] is not None: + self.edgelist_df[ea] = edge_attr[ea] else: + self.weights = True self.edgelist_df[simpleGraphImpl.edgeWeightCol] = edge_attr class AdjList: @@ -115,6 +112,9 @@ def __from_edgelist( source="source", destination="destination", edge_attr=None, + weight=None, + edge_id=None, + edge_type=None, renumber=True, legacy_renum_only=True, store_transposed=False, @@ -144,15 +144,19 @@ def __from_edgelist( df_columns = s_col + d_col if edge_attr is not None: + if weight is not None or edge_id is not None or edge_type is not None: + raise ValueError( + "If specifying edge_attr, cannot specify weight/edge_id/edge_type" + ) if isinstance(edge_attr, str): - edge_attr = [edge_attr] + weight = edge_attr + edge_attr = [weight] if not (set(edge_attr).issubset(set(input_df.columns))): raise ValueError( f"edge_attr column {edge_attr} not found in input." "Recheck the edge_attr parameter" ) self.properties.weighted = True - df_columns += edge_attr if len(edge_attr) != 1 and len(edge_attr) != 3: raise ValueError( @@ -169,7 +173,19 @@ def __from_edgelist( "types are not permitted for an " "undirected graph." ) - + + weight, edge_id, edge_type = edge_attr + else: + edge_attr = [] + if weight is not None: + edge_attr.append(weight) + self.properties.weighted=True + if edge_id is not None: + edge_attr.append(edge_id) + if edge_type is not None: + edge_attr.append(edge_type) + + df_columns += edge_attr input_df = input_df[df_columns] # FIXME: check if the consolidated graph fits on the # device before gathering all the edge lists @@ -178,22 +194,23 @@ def __from_edgelist( if isinstance(input_df, cudf.DataFrame): if len(input_df[source]) > 2147483100: raise ValueError( - "cudf dataFrame edge list is too big " "to fit in a single GPU" + "cudf dataFrame edge list is too big to fit in a single GPU" ) elist = input_df elif isinstance(input_df, dask_cudf.DataFrame): if len(input_df[source]) > 2147483100: raise ValueError( - "dask_cudf dataFrame edge list is too big " "to fit in a single GPU" + "dask_cudf dataFrame edge list is too big to fit in a single GPU" ) elist = input_df.compute().reset_index(drop=True) else: raise TypeError( - "input should be a cudf.DataFrame or " "a dask_cudf dataFrame" + "input should be a cudf.DataFrame or a dask_cudf dataFrame" ) # Original, unmodified input dataframe. self.input_df = elist + # Renumbering self.renumber_map = None self.store_transposed = store_transposed @@ -232,6 +249,8 @@ def __from_edgelist( multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) + print('symmetrized df:\n', value_col) + if isinstance(value_col, cudf.DataFrame): value_dict = {} for i in value_col.columns: @@ -248,8 +267,15 @@ def __from_edgelist( ) if isinstance(value_col, dict): - value_col = [value_col[ea] for ea in edge_attr] - + value_col = { + self.edgeWeightCol: value_col[weight] if weight in value_col else None, + self.edgeIdCol: value_col[edge_id] if edge_id in value_col else None, + self.edgeTypeCol: value_col[edge_type] if edge_type in value_col else None, + } + + print('weight name:', weight) + print('vc:') + print(value_col) self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, value_col) if self.batch_enabled: @@ -945,16 +971,15 @@ def _degree(self, vertex_subset, direction=Direction.ALL): return df - def _make_plc_graph(self, value_col=None, store_transposed=False, renumber=True): + def _make_plc_graph(self, value_col: Dict[str, cudf.DataFrame]=None, store_transposed:bool=False, renumber:bool=True): """ Parameters ---------- - value_col : cudf.DataFrame or tuple[cudf.DataFrame] + value_col : cudf.DataFrame or dict[str, cudf.DataFrame] If a single dataframe is provided, this is assumed to contain the edge weight values. - If a tuple of dataframes is provided, then it is - assumed to contain edge weights, edge ids, and - edge types, in that order. + If a dictionary of dataframes is provided, then it is + assumed to contain edge properties. store_transposed : bool (default=False) Whether to store the graph in a transposed format. Required by some algorithms. @@ -968,11 +993,10 @@ def _make_plc_graph(self, value_col=None, store_transposed=False, renumber=True) weight_col, id_col, type_col = None, None, None elif isinstance(value_col, (cudf.DataFrame, cudf.Series)): weight_col, id_col, type_col = value_col, None, None - elif isinstance(value_col, list): - if len(value_col) == 3: - weight_col, id_col, type_col = value_col - elif len(value_col) == 1: - weight_col, id_col, type_col = value_col[0], None, None + elif isinstance(value_col, dict): + weight_col = value_col[self.edgeWeightCol] + id_col = value_col[self.edgeIdCol] + type_col = value_col[self.edgeTypeCol] else: raise ValueError(f"Illegal value col {type(value_col)}") @@ -985,20 +1009,12 @@ def _make_plc_graph(self, value_col=None, store_transposed=False, renumber=True) input_array_format = "COO" src_or_offset_array = self.edgelist.edgelist_df[simpleGraphImpl.srcCol] dst_or_index_array = self.edgelist.edgelist_df[simpleGraphImpl.dstCol] - if weight_col is None: - # Some algos require the graph to be weighted - weight_col = cudf.Series( - cupy.ones(len(self.edgelist.edgelist_df), dtype="float32") - ) + elif self.adjlist is not None: input_array_format = "CSR" src_or_offset_array = self.adjlist.offsets dst_or_index_array = self.adjlist.indices - if weight_col is None: - # Some algos require the graph to be weighted - weight_col = cudf.Series( - cupy.ones(len(self.adjlist.indices), dtype="float32") - ) + else: raise TypeError( "Edges need to be represented in either in COO or CSR format." diff --git a/python/cugraph/cugraph/tests/structure/test_graph.py b/python/cugraph/cugraph/tests/structure/test_graph.py index 3734f6c9586..9ce8e58c00d 100644 --- a/python/cugraph/cugraph/tests/structure/test_graph.py +++ b/python/cugraph/cugraph/tests/structure/test_graph.py @@ -863,3 +863,23 @@ def test_select_random_vertices(graph_file, random_state, num_vertices): ) assert len(join) == len(sampled_vertices) + +@pytest.mark.sg +@pytest.mark.parametrize("graph_file", utils.DATASETS_SMALL) +@pytest.mark.parametrize("edge_props", [['edge_id', 'edge_type', 'weight'], ['edge_id', 'edge_type'], ['edge_type', 'weight'], ['edge_id'], ['weight']]) +def test_graph_creation_edge_properties(graph_file, edge_props): + df = utils.read_csv_file(graph_file) + + df['edge_id'] = cupy.arange(len(df), dtype='int32') + df['edge_type'] = cupy.int32(3) + df['weight'] = 0.5 + + prop_keys = {k : k for k in edge_props} + + G = cugraph.Graph(directed=True) + G.from_cudf_edgelist( + df, + source="0", + destination="1", + **prop_keys + ) \ No newline at end of file diff --git a/python/cugraph/cugraph/tests/structure/test_graph_mg.py b/python/cugraph/cugraph/tests/structure/test_graph_mg.py index b1b8d65c5a6..31c5afcdcf0 100644 --- a/python/cugraph/cugraph/tests/structure/test_graph_mg.py +++ b/python/cugraph/cugraph/tests/structure/test_graph_mg.py @@ -335,3 +335,26 @@ def test_mg_select_random_vertices( ) assert len(join) == len(sampled_vertices) + + +@pytest.mark.sg +@pytest.mark.parametrize("graph_file", utils.DATASETS_SMALL) +@pytest.mark.parametrize("edge_props", [['edge_id', 'edge_type', 'weight'], ['edge_id', 'edge_type'], ['edge_type', 'weight'], ['edge_id'], ['weight']]) +def test_graph_creation_edge_properties(dask_client, graph_file, edge_props): + df = utils.read_csv_file(graph_file) + + df['edge_id'] = cupy.arange(len(df), dtype='int32') + df['edge_type'] = cupy.int32(3) + df['weight'] = 0.5 + + df = dask_cudf.from_cudf(df, npartitions=2) + + prop_keys = {k : k for k in edge_props} + + G = cugraph.Graph(directed=True) + G.from_dask_cudf_edgelist( + df, + source="0", + destination="1", + **prop_keys + ) \ No newline at end of file diff --git a/python/datasets/dolphins.csv b/python/datasets/dolphins.csv new file mode 100644 index 00000000000..80b1c8b1a18 --- /dev/null +++ b/python/datasets/dolphins.csv @@ -0,0 +1,318 @@ +10 0 1.0 +14 0 1.0 +15 0 1.0 +40 0 1.0 +42 0 1.0 +47 0 1.0 +17 1 1.0 +19 1 1.0 +26 1 1.0 +27 1 1.0 +28 1 1.0 +36 1 1.0 +41 1 1.0 +54 1 1.0 +10 2 1.0 +42 2 1.0 +44 2 1.0 +61 2 1.0 +8 3 1.0 +14 3 1.0 +59 3 1.0 +51 4 1.0 +9 5 1.0 +13 5 1.0 +56 5 1.0 +57 5 1.0 +9 6 1.0 +13 6 1.0 +17 6 1.0 +54 6 1.0 +56 6 1.0 +57 6 1.0 +19 7 1.0 +27 7 1.0 +30 7 1.0 +40 7 1.0 +54 7 1.0 +20 8 1.0 +28 8 1.0 +37 8 1.0 +45 8 1.0 +59 8 1.0 +13 9 1.0 +17 9 1.0 +32 9 1.0 +41 9 1.0 +57 9 1.0 +29 10 1.0 +42 10 1.0 +47 10 1.0 +51 11 1.0 +33 12 1.0 +17 13 1.0 +32 13 1.0 +41 13 1.0 +54 13 1.0 +57 13 1.0 +16 14 1.0 +24 14 1.0 +33 14 1.0 +34 14 1.0 +37 14 1.0 +38 14 1.0 +40 14 1.0 +43 14 1.0 +50 14 1.0 +52 14 1.0 +18 15 1.0 +24 15 1.0 +40 15 1.0 +45 15 1.0 +55 15 1.0 +59 15 1.0 +20 16 1.0 +33 16 1.0 +37 16 1.0 +38 16 1.0 +50 16 1.0 +22 17 1.0 +25 17 1.0 +27 17 1.0 +31 17 1.0 +57 17 1.0 +20 18 1.0 +21 18 1.0 +24 18 1.0 +29 18 1.0 +45 18 1.0 +51 18 1.0 +30 19 1.0 +54 19 1.0 +28 20 1.0 +36 20 1.0 +38 20 1.0 +44 20 1.0 +47 20 1.0 +50 20 1.0 +29 21 1.0 +33 21 1.0 +37 21 1.0 +45 21 1.0 +51 21 1.0 +36 23 1.0 +45 23 1.0 +51 23 1.0 +29 24 1.0 +45 24 1.0 +51 24 1.0 +26 25 1.0 +27 25 1.0 +27 26 1.0 +30 28 1.0 +47 28 1.0 +35 29 1.0 +43 29 1.0 +45 29 1.0 +51 29 1.0 +52 29 1.0 +42 30 1.0 +47 30 1.0 +60 32 1.0 +34 33 1.0 +37 33 1.0 +38 33 1.0 +40 33 1.0 +43 33 1.0 +50 33 1.0 +37 34 1.0 +44 34 1.0 +49 34 1.0 +37 36 1.0 +39 36 1.0 +40 36 1.0 +59 36 1.0 +40 37 1.0 +43 37 1.0 +45 37 1.0 +61 37 1.0 +43 38 1.0 +44 38 1.0 +52 38 1.0 +58 38 1.0 +57 39 1.0 +52 40 1.0 +54 41 1.0 +57 41 1.0 +47 42 1.0 +50 42 1.0 +46 43 1.0 +53 43 1.0 +50 45 1.0 +51 45 1.0 +59 45 1.0 +49 46 1.0 +57 48 1.0 +51 50 1.0 +55 51 1.0 +61 53 1.0 +57 54 1.0 +0 10 1.0 +0 14 1.0 +0 15 1.0 +0 40 1.0 +0 42 1.0 +0 47 1.0 +1 17 1.0 +1 19 1.0 +1 26 1.0 +1 27 1.0 +1 28 1.0 +1 36 1.0 +1 41 1.0 +1 54 1.0 +2 10 1.0 +2 42 1.0 +2 44 1.0 +2 61 1.0 +3 8 1.0 +3 14 1.0 +3 59 1.0 +4 51 1.0 +5 9 1.0 +5 13 1.0 +5 56 1.0 +5 57 1.0 +6 9 1.0 +6 13 1.0 +6 17 1.0 +6 54 1.0 +6 56 1.0 +6 57 1.0 +7 19 1.0 +7 27 1.0 +7 30 1.0 +7 40 1.0 +7 54 1.0 +8 20 1.0 +8 28 1.0 +8 37 1.0 +8 45 1.0 +8 59 1.0 +9 13 1.0 +9 17 1.0 +9 32 1.0 +9 41 1.0 +9 57 1.0 +10 29 1.0 +10 42 1.0 +10 47 1.0 +11 51 1.0 +12 33 1.0 +13 17 1.0 +13 32 1.0 +13 41 1.0 +13 54 1.0 +13 57 1.0 +14 16 1.0 +14 24 1.0 +14 33 1.0 +14 34 1.0 +14 37 1.0 +14 38 1.0 +14 40 1.0 +14 43 1.0 +14 50 1.0 +14 52 1.0 +15 18 1.0 +15 24 1.0 +15 40 1.0 +15 45 1.0 +15 55 1.0 +15 59 1.0 +16 20 1.0 +16 33 1.0 +16 37 1.0 +16 38 1.0 +16 50 1.0 +17 22 1.0 +17 25 1.0 +17 27 1.0 +17 31 1.0 +17 57 1.0 +18 20 1.0 +18 21 1.0 +18 24 1.0 +18 29 1.0 +18 45 1.0 +18 51 1.0 +19 30 1.0 +19 54 1.0 +20 28 1.0 +20 36 1.0 +20 38 1.0 +20 44 1.0 +20 47 1.0 +20 50 1.0 +21 29 1.0 +21 33 1.0 +21 37 1.0 +21 45 1.0 +21 51 1.0 +23 36 1.0 +23 45 1.0 +23 51 1.0 +24 29 1.0 +24 45 1.0 +24 51 1.0 +25 26 1.0 +25 27 1.0 +26 27 1.0 +28 30 1.0 +28 47 1.0 +29 35 1.0 +29 43 1.0 +29 45 1.0 +29 51 1.0 +29 52 1.0 +30 42 1.0 +30 47 1.0 +32 60 1.0 +33 34 1.0 +33 37 1.0 +33 38 1.0 +33 40 1.0 +33 43 1.0 +33 50 1.0 +34 37 1.0 +34 44 1.0 +34 49 1.0 +36 37 1.0 +36 39 1.0 +36 40 1.0 +36 59 1.0 +37 40 1.0 +37 43 1.0 +37 45 1.0 +37 61 1.0 +38 43 1.0 +38 44 1.0 +38 52 1.0 +38 58 1.0 +39 57 1.0 +40 52 1.0 +41 54 1.0 +41 57 1.0 +42 47 1.0 +42 50 1.0 +43 46 1.0 +43 53 1.0 +45 50 1.0 +45 51 1.0 +45 59 1.0 +46 49 1.0 +48 57 1.0 +50 51 1.0 +51 55 1.0 +53 61 1.0 +54 57 1.0 diff --git a/python/datasets/karate.csv b/python/datasets/karate.csv new file mode 100644 index 00000000000..4ed9f4356a9 --- /dev/null +++ b/python/datasets/karate.csv @@ -0,0 +1,156 @@ +1 0 1.0 +2 0 1.0 +3 0 1.0 +4 0 1.0 +5 0 1.0 +6 0 1.0 +7 0 1.0 +8 0 1.0 +10 0 1.0 +11 0 1.0 +12 0 1.0 +13 0 1.0 +17 0 1.0 +19 0 1.0 +21 0 1.0 +31 0 1.0 +2 1 1.0 +3 1 1.0 +7 1 1.0 +13 1 1.0 +17 1 1.0 +19 1 1.0 +21 1 1.0 +30 1 1.0 +3 2 1.0 +7 2 1.0 +8 2 1.0 +9 2 1.0 +13 2 1.0 +27 2 1.0 +28 2 1.0 +32 2 1.0 +7 3 1.0 +12 3 1.0 +13 3 1.0 +6 4 1.0 +10 4 1.0 +6 5 1.0 +10 5 1.0 +16 5 1.0 +16 6 1.0 +30 8 1.0 +32 8 1.0 +33 8 1.0 +33 9 1.0 +33 13 1.0 +32 14 1.0 +33 14 1.0 +32 15 1.0 +33 15 1.0 +32 18 1.0 +33 18 1.0 +33 19 1.0 +32 20 1.0 +33 20 1.0 +32 22 1.0 +33 22 1.0 +25 23 1.0 +27 23 1.0 +29 23 1.0 +32 23 1.0 +33 23 1.0 +25 24 1.0 +27 24 1.0 +31 24 1.0 +31 25 1.0 +29 26 1.0 +33 26 1.0 +33 27 1.0 +31 28 1.0 +33 28 1.0 +32 29 1.0 +33 29 1.0 +32 30 1.0 +33 30 1.0 +32 31 1.0 +33 31 1.0 +33 32 1.0 +0 1 1.0 +0 2 1.0 +0 3 1.0 +0 4 1.0 +0 5 1.0 +0 6 1.0 +0 7 1.0 +0 8 1.0 +0 10 1.0 +0 11 1.0 +0 12 1.0 +0 13 1.0 +0 17 1.0 +0 19 1.0 +0 21 1.0 +0 31 1.0 +1 2 1.0 +1 3 1.0 +1 7 1.0 +1 13 1.0 +1 17 1.0 +1 19 1.0 +1 21 1.0 +1 30 1.0 +2 3 1.0 +2 7 1.0 +2 8 1.0 +2 9 1.0 +2 13 1.0 +2 27 1.0 +2 28 1.0 +2 32 1.0 +3 7 1.0 +3 12 1.0 +3 13 1.0 +4 6 1.0 +4 10 1.0 +5 6 1.0 +5 10 1.0 +5 16 1.0 +6 16 1.0 +8 30 1.0 +8 32 1.0 +8 33 1.0 +9 33 1.0 +13 33 1.0 +14 32 1.0 +14 33 1.0 +15 32 1.0 +15 33 1.0 +18 32 1.0 +18 33 1.0 +19 33 1.0 +20 32 1.0 +20 33 1.0 +22 32 1.0 +22 33 1.0 +23 25 1.0 +23 27 1.0 +23 29 1.0 +23 32 1.0 +23 33 1.0 +24 25 1.0 +24 27 1.0 +24 31 1.0 +25 31 1.0 +26 29 1.0 +26 33 1.0 +27 33 1.0 +28 31 1.0 +28 33 1.0 +29 32 1.0 +29 33 1.0 +30 32 1.0 +30 33 1.0 +31 32 1.0 +31 33 1.0 +32 33 1.0 diff --git a/python/datasets/netscience.csv b/python/datasets/netscience.csv new file mode 100644 index 00000000000..bd467aeb7da --- /dev/null +++ b/python/datasets/netscience.csv @@ -0,0 +1,5484 @@ +1 0 2.5 +1084 0 0.5 +946 1 1.0 +1084 1 0.5 +3 2 0.25 +4 2 0.25 +5 2 0.25 +6 2 0.25 +4 3 0.25 +5 3 0.25 +6 3 0.25 +5 4 0.25 +6 4 0.25 +6 5 0.25 +8 7 1.0 +9 7 3.16667 +10 7 1.16667 +11 7 0.666667 +10 9 1.16667 +11 9 0.666667 +1424 9 0.5 +1425 9 1.5 +1532 9 1.0 +11 10 0.666667 +13 12 0.333333 +14 12 0.333333 +15 12 0.333333 +1047 12 0.25 +1048 12 0.25 +1049 12 0.25 +1050 12 0.25 +14 13 0.333333 +15 13 0.333333 +15 14 0.333333 +17 16 0.5 +18 16 0.5 +18 17 0.5 +21 20 0.5 +22 20 0.5 +22 21 0.5 +24 23 0.5 +25 23 0.5 +25 24 2.33333 +201 24 0.333333 +202 24 0.333333 +369 24 0.5 +201 25 0.333333 +202 25 0.333333 +369 25 0.5 +28 27 0.5 +29 27 0.5 +29 28 0.5 +31 30 0.5 +32 30 0.5 +33 30 3.58333 +34 30 1.58333 +54 30 0.25 +131 30 0.333333 +327 30 0.333333 +402 30 0.333333 +840 30 0.25 +894 30 0.333333 +32 31 0.5 +34 33 4.225 +51 33 0.75 +52 33 0.25 +53 33 1.85833 +54 33 2.99167 +131 33 1.33333 +132 33 2.275 +133 33 1.025 +134 33 0.525 +190 33 0.583333 +375 33 0.25 +376 33 0.25 +377 33 0.25 +464 33 1.0 +485 33 1.0 +488 33 0.333333 +489 33 0.333333 +507 33 0.583333 +508 33 0.583333 +509 33 0.25 +561 33 0.708333 +562 33 0.458333 +839 33 0.333333 +840 33 0.45 +1008 33 0.5 +1190 33 0.2 +1191 33 0.2 +1228 33 0.25 +1229 33 0.25 +1295 33 0.25 +1529 33 0.5 +1550 33 1.33333 +1551 33 0.333333 +53 34 0.775 +54 34 1.15833 +131 34 0.333333 +132 34 0.525 +133 34 1.025 +134 34 0.525 +561 34 0.375 +562 34 0.125 +652 34 0.25 +654 34 1.25 +655 34 0.25 +657 34 0.25 +756 34 0.5 +760 34 0.5 +761 34 0.333333 +762 34 0.333333 +763 34 0.333333 +839 34 0.333333 +840 34 0.45 +865 34 0.5 +1130 34 0.5 +1190 34 0.2 +1191 34 0.2 +1550 34 0.833333 +1551 34 0.333333 +36 35 0.2 +37 35 0.2 +38 35 0.2 +39 35 0.2 +40 35 0.2 +37 36 0.2 +38 36 0.2 +39 36 0.2 +40 36 0.2 +38 37 0.2 +39 37 0.2 +40 37 0.2 +39 38 0.2 +40 38 0.2 +40 39 0.2 +43 42 1.0 +45 44 0.5 +46 44 0.5 +46 45 0.5 +609 45 0.833333 +610 45 0.5 +611 45 0.333333 +612 45 0.333333 +78 46 1.0 +191 46 0.833333 +192 46 0.333333 +193 46 0.333333 +194 46 0.5 +428 46 1.33333 +596 46 1.0 +1361 46 1.33333 +1362 46 0.333333 +1363 46 1.0 +48 47 0.333333 +49 47 0.333333 +50 47 0.333333 +49 48 0.333333 +50 48 0.333333 +216 48 0.333333 +217 48 0.333333 +218 48 0.333333 +50 49 0.333333 +52 51 0.25 +53 51 0.25 +54 51 0.25 +55 51 0.5 +56 51 0.5 +57 51 1.0 +58 51 1.0 +1008 51 0.5 +53 52 0.25 +54 52 0.25 +54 53 0.625 +132 53 1.025 +133 53 0.525 +134 53 0.525 +561 53 0.708333 +562 53 0.458333 +1024 53 0.5 +1025 53 0.5 +1315 53 0.25 +1468 53 0.25 +1469 53 0.25 +1470 53 0.25 +132 54 0.375 +133 54 0.125 +134 54 0.125 +488 54 0.333333 +489 54 0.333333 +561 54 0.375 +562 54 0.125 +839 54 0.333333 +840 54 0.45 +1190 54 0.2 +1191 54 0.2 +1228 54 0.25 +1229 54 0.25 +1529 54 0.5 +1550 54 0.5 +56 55 3.83333 +90 55 1.0 +184 55 0.5 +547 55 0.5 +654 55 0.333333 +893 55 0.333333 +934 55 0.5 +1461 55 0.5 +184 56 0.5 +547 56 0.5 +654 56 0.333333 +893 56 0.333333 +934 56 0.5 +1461 56 0.5 +58 57 1.0 +685 57 1.0 +60 59 0.5 +61 59 0.5 +61 60 0.5 +63 62 0.47619 +64 62 0.333333 +65 62 0.333333 +362 62 0.2 +805 62 0.92619 +806 62 1.25952 +807 62 0.92619 +808 62 0.25 +1016 62 1.33333 +1070 62 0.142857 +1071 62 0.67619 +1072 62 0.142857 +1073 62 0.142857 +1562 62 0.142857 +1563 62 0.142857 +1564 62 0.142857 +1565 62 0.142857 +1566 62 0.142857 +1567 62 0.142857 +64 63 0.333333 +65 63 0.333333 +1562 63 0.142857 +1563 63 0.142857 +1564 63 0.142857 +1565 63 0.142857 +1566 63 0.142857 +1567 63 0.142857 +65 64 0.333333 +795 64 0.25 +796 64 0.25 +797 64 0.25 +798 64 0.25 +67 66 0.5 +68 66 0.5 +68 67 0.5 +70 69 0.833333 +71 69 2.16667 +72 69 0.916667 +97 69 1.83333 +310 69 0.5 +709 69 0.666667 +710 69 0.333333 +757 69 0.75 +758 69 0.75 +977 69 0.25 +1082 69 0.5 +1083 69 0.5 +71 70 0.833333 +72 70 0.333333 +72 71 0.666667 +149 71 1.16667 +150 71 0.666667 +151 71 1.16667 +157 71 0.5 +158 71 0.5 +709 71 0.333333 +736 71 0.5 +737 71 0.5 +235 72 1.0 +443 72 0.5 +709 72 0.333333 +738 72 0.5 +757 72 0.25 +758 72 0.25 +977 72 0.25 +74 73 0.333333 +75 73 0.333333 +76 73 0.333333 +75 74 0.333333 +76 74 0.333333 +76 75 0.333333 +522 76 1.0 +1381 76 0.5 +1588 76 0.5 +78 77 0.333333 +79 77 0.333333 +80 77 0.333333 +79 78 0.333333 +80 78 0.333333 +121 78 1.0 +281 78 1.0 +305 78 0.583333 +306 78 0.25 +307 78 0.25 +308 78 1.58333 +309 78 3.33333 +370 78 0.5 +371 78 2.5 +490 78 0.5 +641 78 1.0 +646 78 2.5 +756 78 0.5 +759 78 0.5 +853 78 0.5 +1005 78 1.0 +1121 78 0.5 +1122 78 0.5 +1123 78 0.5 +1172 78 1.0 +1195 78 0.333333 +1196 78 0.333333 +1197 78 0.333333 +80 79 0.333333 +82 81 0.5 +83 81 0.5 +83 82 0.5 +563 82 1.0 +1498 82 1.0 +85 84 0.5 +86 84 0.5 +86 85 0.5 +88 87 2.5 +711 87 0.5 +711 88 0.5 +976 88 1.0 +991 88 2.0 +92 91 0.5 +93 91 0.5 +93 92 0.5 +95 94 0.5 +96 94 2.66667 +97 94 2.33333 +98 94 0.5 +99 94 0.5 +100 94 0.25 +150 94 0.333333 +225 94 0.333333 +708 94 0.583333 +96 95 0.5 +97 95 0.5 +98 95 0.5 +97 96 2.33333 +98 96 0.5 +99 96 0.5 +100 96 0.25 +150 96 0.833333 +225 96 0.333333 +700 96 0.333333 +701 96 0.333333 +702 96 0.333333 +708 96 0.583333 +1177 96 0.5 +1481 96 0.5 +1482 96 0.5 +98 97 0.5 +99 97 0.5 +100 97 0.25 +310 97 0.5 +708 97 0.583333 +709 97 0.333333 +710 97 0.333333 +100 99 1.25 +708 99 0.25 +103 102 0.5 +104 102 0.5 +104 103 0.5 +106 105 0.5 +107 105 0.5 +107 106 0.5 +859 106 1.0 +109 108 1.0 +112 111 1.0 +114 113 1.0 +1162 114 0.5 +1163 114 0.5 +117 116 1.0 +935 117 0.25 +936 117 0.25 +937 117 0.25 +938 117 0.25 +119 118 1.0 +439 118 0.5 +441 118 0.5 +121 120 1.0 +548 121 0.333333 +549 121 0.333333 +550 121 1.83333 +764 121 0.833333 +765 121 0.333333 +1030 121 0.5 +1255 121 0.833333 +123 122 0.5 +124 122 0.5 +124 123 0.5 +127 126 0.7 +128 126 0.5 +770 126 0.2 +771 126 0.2 +772 126 0.2 +773 126 0.2 +128 127 0.75 +151 127 0.333333 +517 127 0.333333 +770 127 0.2 +771 127 0.2 +772 127 0.2 +773 127 0.2 +1021 127 0.25 +1022 127 0.25 +1023 127 0.25 +1460 127 0.333333 +1021 128 0.75 +1022 128 0.25 +1023 128 1.75 +130 129 1.0 +203 131 1.0 +133 132 0.525 +134 132 0.525 +561 132 0.125 +562 132 0.125 +1228 132 0.25 +1229 132 0.25 +134 133 0.525 +561 133 0.125 +562 133 0.125 +561 134 0.125 +562 134 0.125 +136 135 1.0 +216 136 0.5 +223 136 0.5 +585 136 0.333333 +586 136 0.333333 +587 136 1.83333 +729 136 0.5 +138 137 1.0 +140 139 0.111111 +141 139 0.111111 +142 139 0.111111 +143 139 0.111111 +144 139 0.111111 +145 139 0.111111 +146 139 0.111111 +147 139 0.111111 +148 139 0.111111 +141 140 0.111111 +142 140 0.111111 +143 140 0.111111 +144 140 0.111111 +145 140 0.111111 +146 140 0.111111 +147 140 0.111111 +148 140 0.111111 +142 141 0.111111 +143 141 0.111111 +144 141 0.111111 +145 141 0.111111 +146 141 0.111111 +147 141 0.111111 +148 141 0.111111 +143 142 0.111111 +144 142 0.111111 +145 142 0.111111 +146 142 0.111111 +147 142 0.111111 +148 142 0.111111 +144 143 0.111111 +145 143 0.111111 +146 143 0.111111 +147 143 0.111111 +148 143 0.111111 +145 144 0.111111 +146 144 0.111111 +147 144 0.111111 +148 144 0.111111 +146 145 0.111111 +147 145 0.111111 +148 145 0.111111 +147 146 0.111111 +148 146 0.111111 +148 147 0.111111 +150 149 0.666667 +151 149 1.16667 +152 149 1.0 +151 150 4.75 +225 150 2.08333 +281 150 1.83333 +301 150 0.5 +500 150 0.5 +516 150 1.08333 +517 150 1.58333 +1177 150 0.5 +1178 150 0.833333 +1221 150 0.5 +1342 150 0.333333 +225 151 0.75 +301 151 0.5 +330 151 0.5 +331 151 0.5 +516 151 1.58333 +517 151 2.25 +963 151 0.333333 +964 151 0.333333 +1088 151 0.5 +1460 151 0.333333 +517 152 1.0 +154 153 1.33333 +155 153 0.333333 +156 153 0.333333 +155 154 0.333333 +156 154 0.333333 +156 155 0.333333 +158 157 0.5 +161 160 1.0 +163 162 1.0 +301 162 0.25 +316 162 0.25 +638 162 0.25 +639 162 0.25 +165 164 1.0 +167 166 1.0 +406 166 1.0 +170 169 0.5 +171 169 0.5 +171 170 0.5 +918 171 1.0 +173 172 0.5 +174 172 1.5 +174 173 0.5 +176 175 0.5 +177 175 0.5 +177 176 0.5 +926 177 1.0 +180 179 1.0 +181 179 1.0 +181 180 1.0 +183 182 1.0 +185 184 0.5 +186 184 0.5 +186 185 0.5 +1162 186 1.25 +1413 186 0.25 +1414 186 0.25 +1415 186 0.25 +188 187 1.5 +189 187 0.5 +189 188 0.5 +567 189 2.33333 +650 189 0.333333 +651 189 0.333333 +507 190 0.583333 +508 190 0.583333 +509 190 0.25 +192 191 0.333333 +193 191 0.333333 +194 191 0.5 +193 192 0.333333 +955 194 0.5 +956 194 1.08333 +1135 194 0.583333 +1136 194 0.25 +1137 194 0.25 +1138 194 0.333333 +1384 194 0.5 +1385 194 0.5 +196 195 1.25 +197 195 0.25 +198 195 0.25 +199 195 0.25 +197 196 0.25 +198 196 0.25 +199 196 0.25 +198 197 0.25 +199 197 0.25 +199 198 0.25 +201 200 0.5 +202 200 0.5 +202 201 0.833333 +301 203 1.16667 +302 203 0.833333 +303 203 0.333333 +316 203 0.333333 +317 203 0.333333 +206 205 1.0 +208 207 0.5 +209 207 0.5 +1477 207 0.5 +1478 207 0.5 +209 208 0.5 +211 210 0.5 +212 210 0.5 +212 211 0.5 +214 213 0.5 +215 213 0.5 +215 214 0.5 +217 216 1.08333 +218 216 1.66667 +219 216 0.5 +220 216 1.5 +221 216 0.25 +222 216 0.25 +223 216 0.5 +224 216 0.583333 +251 216 0.25 +252 216 0.5 +345 216 0.583333 +346 216 0.916667 +347 216 0.583333 +516 216 0.333333 +788 216 0.333333 +1041 216 0.333333 +1452 216 1.0 +218 217 1.08333 +251 217 0.25 +252 217 0.25 +219 218 0.25 +220 218 0.25 +224 218 0.583333 +251 218 0.25 +252 218 0.25 +1041 218 0.333333 +220 219 0.5 +221 219 0.583333 +222 219 1.75 +224 219 0.25 +343 219 2.47619 +473 219 0.5 +697 219 0.142857 +1145 219 2.14286 +1282 219 0.333333 +1283 219 0.333333 +1394 219 0.142857 +1395 219 0.142857 +1396 219 0.142857 +1397 219 0.142857 +1560 219 0.333333 +1561 219 0.333333 +221 220 0.25 +222 220 0.25 +224 220 0.25 +222 221 0.25 +343 221 0.333333 +1145 221 0.333333 +473 222 0.5 +1041 224 0.333333 +516 225 0.25 +517 225 0.25 +227 226 1.0 +1074 227 1.0 +229 228 1.33333 +230 228 0.333333 +231 228 0.333333 +230 229 0.333333 +231 229 0.333333 +231 230 0.333333 +234 233 0.5 +235 233 0.5 +235 234 0.5 +238 237 1.0 +240 239 1.0 +241 239 1.0 +1500 239 0.25 +1501 239 0.25 +1502 239 0.25 +1503 239 0.25 +243 242 1.0 +927 243 1.25 +1518 243 0.25 +1519 243 0.25 +1520 243 0.25 +245 244 3.5 +246 244 1.0 +247 244 1.0 +435 244 1.0 +513 244 0.5 +1230 244 1.0 +435 245 1.0 +513 245 0.5 +415 247 0.333333 +1124 247 0.333333 +1125 247 0.333333 +249 248 0.5 +250 248 0.5 +250 249 0.5 +252 251 0.25 +345 252 0.25 +346 252 0.25 +347 252 0.25 +255 254 1.0 +256 254 0.5 +1000 254 0.5 +256 255 0.5 +1000 255 0.5 +259 258 1.33333 +1166 258 0.333333 +1167 258 0.333333 +1166 259 0.333333 +1167 259 0.333333 +261 260 1.0 +263 262 0.142857 +264 262 0.142857 +265 262 0.142857 +266 262 0.142857 +267 262 0.142857 +268 262 0.142857 +269 262 0.142857 +264 263 0.142857 +265 263 0.67619 +266 263 0.67619 +267 263 0.142857 +268 263 0.67619 +269 263 0.142857 +944 263 0.2 +945 263 0.2 +265 264 0.142857 +266 264 0.142857 +267 264 0.142857 +268 264 0.142857 +269 264 0.142857 +266 265 0.92619 +267 265 0.142857 +268 265 0.92619 +269 265 0.142857 +307 265 0.25 +908 265 0.25 +944 265 0.2 +945 265 0.2 +267 266 0.142857 +268 266 0.92619 +269 266 0.142857 +307 266 0.25 +908 266 0.25 +944 266 0.2 +945 266 0.2 +268 267 0.142857 +269 267 0.142857 +269 268 0.142857 +307 268 0.25 +908 268 0.25 +944 268 0.2 +945 268 0.2 +271 270 1.0 +274 273 0.5 +275 273 0.5 +275 274 0.5 +606 275 0.333333 +607 275 0.333333 +608 275 0.333333 +277 276 0.5 +278 276 0.5 +278 277 1.0 +401 277 0.166667 +402 277 0.166667 +403 277 0.5 +404 277 0.166667 +405 277 0.166667 +595 277 0.333333 +401 278 0.166667 +402 278 0.166667 +403 278 0.5 +404 278 0.166667 +405 278 0.166667 +595 278 0.333333 +280 279 0.166667 +281 279 0.166667 +282 279 0.166667 +283 279 0.166667 +284 279 0.166667 +285 279 0.166667 +281 280 0.166667 +282 280 0.166667 +283 280 0.166667 +284 280 0.166667 +285 280 0.166667 +282 281 0.166667 +283 281 3.16667 +284 281 0.166667 +285 281 0.166667 +574 281 2.5 +575 281 0.5 +576 281 0.5 +1081 281 2.0 +1178 281 0.833333 +1342 281 0.333333 +1343 281 0.5 +1344 281 0.5 +1451 281 0.5 +283 282 0.166667 +284 282 0.166667 +285 282 0.166667 +450 282 1.0 +284 283 0.166667 +285 283 0.166667 +574 283 0.5 +1451 283 0.5 +285 284 0.166667 +287 286 0.5 +288 286 1.0 +289 286 0.5 +288 287 0.5 +289 288 0.5 +291 290 0.5 +292 290 0.5 +292 291 0.5 +294 293 2.1 +742 293 0.9 +743 293 0.9 +744 293 0.7 +931 293 0.4 +932 293 0.4 +1278 293 0.2 +1368 293 0.2 +1369 293 0.2 +742 294 1.9 +743 294 1.4 +744 294 2.7 +746 294 0.333333 +860 294 0.2 +931 294 0.4 +932 294 0.4 +1028 294 0.333333 +1029 294 0.333333 +1278 294 0.7 +1368 294 0.2 +1369 294 0.2 +1464 294 0.2 +1465 294 0.2 +1466 294 0.2 +1467 294 0.2 +1553 294 0.333333 +1554 294 0.333333 +1555 294 0.333333 +297 296 1.0 +298 296 0.333333 +299 296 0.333333 +300 296 1.33333 +299 298 0.333333 +300 298 0.333333 +300 299 0.333333 +973 300 1.0 +1497 300 1.0 +302 301 1.33333 +303 301 0.333333 +304 301 0.5 +316 301 0.583333 +317 301 0.333333 +463 301 0.5 +638 301 0.75 +639 301 0.25 +303 302 0.333333 +304 302 0.5 +1182 302 1.0 +499 303 1.0 +1026 303 0.333333 +1416 303 0.333333 +1417 303 0.333333 +306 305 0.25 +307 305 0.25 +308 305 0.583333 +309 305 0.333333 +307 306 0.25 +308 306 0.25 +308 307 0.25 +590 307 1.0 +908 307 0.25 +309 308 2.33333 +1039 308 0.5 +1040 308 1.5 +1549 308 1.0 +371 309 0.5 +490 309 1.5 +491 309 0.5 +493 309 0.5 +312 311 1.0 +314 313 0.5 +315 313 0.5 +315 314 0.5 +1398 314 1.0 +317 316 0.333333 +638 316 0.25 +639 316 0.25 +319 318 1.0 +421 319 1.0 +321 320 0.833333 +322 320 0.333333 +323 320 0.666667 +324 320 0.333333 +325 320 0.333333 +1270 320 0.5 +322 321 0.333333 +323 321 0.333333 +1270 321 0.5 +323 322 0.333333 +324 323 0.333333 +325 323 0.333333 +325 324 0.333333 +327 326 0.333333 +328 326 0.333333 +329 326 0.333333 +328 327 1.16667 +329 327 0.333333 +402 327 2.16667 +416 327 3.5 +417 327 1.0 +596 327 0.5 +894 327 0.333333 +1189 327 0.5 +1404 327 0.166667 +1405 327 0.166667 +1406 327 0.166667 +1407 327 0.166667 +1408 327 0.166667 +329 328 0.333333 +402 328 0.333333 +416 328 0.333333 +1189 328 0.5 +547 329 1.5 +1389 329 1.5 +331 330 0.5 +1214 330 0.25 +1215 330 0.25 +1216 330 0.25 +1217 330 0.25 +333 332 0.333333 +334 332 0.333333 +335 332 0.333333 +334 333 0.333333 +335 333 0.333333 +335 334 0.333333 +337 336 1.0 +631 337 0.2 +1570 337 0.2 +1571 337 0.2 +1572 337 0.2 +1573 337 0.2 +339 338 0.333333 +340 338 0.333333 +341 338 0.333333 +340 339 0.333333 +341 339 1.33333 +341 340 0.333333 +343 342 0.5 +344 342 0.5 +692 342 1.0 +344 343 0.5 +697 343 0.142857 +1145 343 1.47619 +1394 343 0.142857 +1395 343 0.142857 +1396 343 0.142857 +1397 343 0.142857 +346 345 0.583333 +347 345 0.583333 +347 346 0.583333 +516 346 0.333333 +788 346 0.333333 +349 348 0.2 +350 348 0.2 +351 348 0.2 +352 348 0.2 +353 348 0.2 +350 349 0.2 +351 349 0.2 +352 349 0.2 +353 349 0.2 +351 350 0.2 +352 350 0.2 +353 350 0.2 +686 350 1.0 +352 351 0.2 +353 351 0.2 +353 352 0.2 +355 354 0.5 +356 354 0.5 +356 355 0.5 +358 357 0.833333 +359 357 0.5 +360 357 0.333333 +361 357 0.333333 +359 358 0.5 +360 358 0.333333 +361 358 0.333333 +361 360 0.333333 +363 362 1.0 +364 362 0.5 +365 362 0.5 +805 362 0.2 +806 362 0.2 +807 362 0.2 +1071 362 0.2 +1349 362 0.25 +1350 362 0.25 +1351 362 0.25 +1352 362 0.25 +365 364 0.5 +367 366 0.5 +368 366 0.5 +368 367 0.5 +371 370 0.5 +759 371 0.5 +866 371 0.5 +867 371 0.5 +373 372 0.5 +374 372 0.5 +374 373 0.5 +376 375 1.91667 +377 375 2.91667 +378 375 0.333333 +1263 375 0.333333 +1295 375 0.25 +377 376 1.91667 +378 376 0.333333 +1263 376 0.333333 +1295 376 0.25 +378 377 0.333333 +1263 377 0.333333 +1295 377 0.25 +1347 377 0.5 +1348 377 0.5 +380 379 0.5 +381 379 0.5 +381 380 0.5 +383 382 0.5 +384 382 0.5 +384 383 0.5 +386 385 0.142857 +387 385 0.142857 +388 385 0.142857 +389 385 0.142857 +390 385 0.142857 +391 385 0.142857 +392 385 0.142857 +387 386 0.142857 +388 386 0.142857 +389 386 0.142857 +390 386 0.142857 +391 386 0.142857 +392 386 0.142857 +388 387 0.142857 +389 387 0.142857 +390 387 0.142857 +391 387 0.142857 +392 387 0.142857 +389 388 0.142857 +390 388 0.142857 +391 388 0.142857 +392 388 0.142857 +390 389 0.142857 +391 389 0.142857 +392 389 0.142857 +391 390 0.142857 +392 390 0.142857 +392 391 0.142857 +394 393 0.333333 +395 393 0.333333 +396 393 0.333333 +395 394 0.333333 +396 394 0.333333 +396 395 0.333333 +398 397 0.333333 +399 397 0.333333 +400 397 0.333333 +399 398 0.333333 +400 398 0.333333 +400 399 0.333333 +402 401 0.166667 +403 401 0.166667 +404 401 0.166667 +405 401 0.166667 +403 402 0.166667 +404 402 0.166667 +405 402 0.166667 +416 402 0.833333 +417 402 1.0 +894 402 0.333333 +404 403 0.166667 +405 403 0.166667 +595 403 0.333333 +405 404 0.166667 +409 408 0.25 +410 408 0.583333 +411 408 0.25 +412 408 0.583333 +413 408 0.333333 +410 409 0.25 +411 409 0.25 +412 409 0.25 +411 410 0.25 +412 410 0.583333 +413 410 0.333333 +412 411 0.25 +413 412 0.333333 +415 414 1.0 +922 415 1.0 +1124 415 0.333333 +1125 415 0.333333 +1233 415 0.5 +1234 415 0.5 +596 416 0.5 +1404 416 0.166667 +1405 416 0.166667 +1406 416 0.166667 +1407 416 0.166667 +1408 416 0.166667 +419 418 1.0 +423 422 0.5 +424 422 0.5 +424 423 0.5 +426 425 0.5 +427 425 0.5 +427 426 0.5 +429 428 1.0 +1361 428 0.333333 +1362 428 0.333333 +431 430 1.0 +432 430 1.0 +434 433 1.0 +437 436 0.5 +438 436 0.5 +438 437 0.5 +440 439 1.0 +441 439 0.5 +443 442 1.0 +675 443 0.5 +676 443 0.5 +738 443 0.5 +739 443 1.0 +445 444 1.0 +699 445 1.0 +447 446 0.333333 +448 446 0.333333 +449 446 0.333333 +448 447 0.333333 +449 447 0.333333 +449 448 0.333333 +453 452 0.142857 +454 452 0.142857 +455 452 0.142857 +456 452 0.142857 +457 452 0.142857 +458 452 0.142857 +459 452 0.142857 +454 453 0.142857 +455 453 0.142857 +456 453 0.142857 +457 453 0.142857 +458 453 0.642857 +459 453 0.642857 +455 454 0.142857 +456 454 0.142857 +457 454 0.142857 +458 454 0.142857 +459 454 0.142857 +456 455 0.142857 +457 455 0.142857 +458 455 0.142857 +459 455 0.142857 +457 456 0.142857 +458 456 0.142857 +459 456 0.142857 +458 457 0.142857 +459 457 0.142857 +459 458 0.642857 +461 460 0.333333 +462 460 0.333333 +463 460 0.333333 +462 461 0.333333 +463 461 0.333333 +463 462 0.333333 +638 463 0.5 +465 464 1.5 +466 464 0.5 +466 465 0.5 +468 467 0.25 +469 467 0.25 +470 467 0.25 +471 467 0.25 +469 468 0.25 +470 468 0.25 +471 468 0.25 +470 469 0.25 +471 469 0.25 +471 470 0.25 +473 472 0.833333 +474 472 0.5 +984 472 0.333333 +1091 472 0.333333 +474 473 0.5 +984 473 2.16667 +985 473 0.333333 +1091 473 0.333333 +1092 473 0.833333 +476 475 1.0 +477 475 0.5 +478 475 0.5 +478 477 0.5 +940 478 1.0 +480 479 0.333333 +481 479 0.333333 +482 479 0.333333 +481 480 0.333333 +482 480 0.333333 +482 481 0.333333 +1235 481 0.5 +1236 481 0.5 +1250 481 0.5 +1251 481 0.5 +1046 482 1.0 +1244 482 0.25 +1245 482 0.25 +1246 482 0.25 +1247 482 0.25 +1455 482 1.0 +484 483 1.0 +487 486 1.0 +489 488 0.333333 +491 490 0.5 +492 490 1.0 +493 490 0.5 +495 494 0.5 +496 494 0.5 +496 495 0.5 +780 496 0.5 +781 496 0.5 +1409 496 0.5 +1410 496 0.5 +498 497 1.0 +501 500 1.0 +502 500 2.5 +503 500 1.5 +1221 500 0.5 +502 501 1.0 +503 502 0.5 +506 505 1.0 +508 507 1.08333 +509 507 0.75 +509 508 0.75 +512 511 1.0 +515 514 0.833333 +516 514 0.833333 +517 514 0.333333 +516 515 2.33333 +517 515 0.333333 +674 515 0.5 +517 516 2.91667 +674 516 0.5 +788 516 0.333333 +1086 516 0.5 +1087 516 2.5 +1088 516 1.0 +1089 516 0.5 +963 517 0.333333 +964 517 0.333333 +1341 517 1.0 +1460 517 0.333333 +519 518 1.0 +521 520 1.0 +523 522 0.25 +524 522 0.25 +525 522 0.25 +526 522 0.25 +527 522 2.0 +1381 522 0.5 +1588 522 0.5 +524 523 0.25 +525 523 0.25 +526 523 0.25 +742 523 0.333333 +746 523 0.333333 +1356 523 0.333333 +525 524 0.25 +526 524 0.25 +1322 524 1.0 +526 525 0.25 +529 528 1.0 +531 530 0.533333 +532 530 0.533333 +533 530 0.333333 +1533 530 0.2 +1534 530 0.2 +1535 530 0.2 +532 531 0.533333 +533 531 0.333333 +1533 531 0.2 +1534 531 0.2 +1535 531 0.2 +533 532 0.333333 +1533 532 0.2 +1534 532 0.2 +1535 532 0.2 +535 534 1.0 +538 537 0.5 +539 537 0.833333 +540 537 0.333333 +541 537 0.333333 +542 537 0.333333 +689 537 0.333333 +690 537 0.333333 +539 538 0.5 +689 539 0.333333 +690 539 0.333333 +541 540 0.333333 +542 540 0.333333 +542 541 0.333333 +545 544 1.0 +547 546 1.0 +1239 547 1.0 +1389 547 0.5 +549 548 0.333333 +550 548 0.333333 +550 549 0.333333 +1030 550 0.5 +553 552 0.5 +554 552 0.5 +554 553 0.5 +557 556 0.5 +558 556 0.5 +558 557 0.5 +560 559 1.0 +562 561 0.458333 +564 563 0.333333 +565 563 0.333333 +566 563 0.333333 +565 564 0.333333 +566 564 0.333333 +566 565 0.333333 +650 567 0.333333 +651 567 0.333333 +569 568 1.0 +571 570 1.0 +573 572 1.0 +575 574 0.5 +576 574 0.5 +578 577 1.0 +581 580 0.5 +582 580 0.5 +582 581 0.5 +584 583 1.0 +586 585 0.333333 +587 585 0.333333 +587 586 0.333333 +729 587 0.5 +590 589 0.583333 +591 589 0.583333 +592 589 0.333333 +1180 589 0.25 +1181 589 0.25 +591 590 1.58333 +592 590 0.333333 +1180 590 0.25 +1181 590 0.25 +592 591 0.333333 +1180 591 0.25 +1181 591 0.25 +594 593 1.0 +598 597 1.0 +789 597 1.0 +790 597 1.0 +600 599 1.0 +603 602 1.0 +607 606 0.333333 +608 606 0.333333 +608 607 0.333333 +610 609 0.5 +611 609 0.333333 +612 609 0.333333 +612 611 0.333333 +615 614 1.0 +617 616 1.0 +619 618 0.5 +620 618 0.5 +620 619 0.5 +622 621 1.0 +624 623 1.0 +626 625 0.333333 +627 625 0.333333 +628 625 0.333333 +627 626 0.333333 +628 626 0.333333 +628 627 0.333333 +630 629 0.5 +631 629 0.5 +631 630 1.0 +1579 630 0.5 +783 631 1.0 +784 631 0.5 +1570 631 0.2 +1571 631 0.2 +1572 631 0.2 +1573 631 0.2 +1574 631 0.5 +1579 631 0.5 +633 632 1.0 +636 635 0.5 +637 635 0.5 +637 636 0.5 +639 638 0.25 +640 638 1.0 +643 642 1.0 +712 642 0.5 +713 642 0.5 +1429 645 0.0526316 +1430 645 0.0526316 +1431 645 0.0526316 +1432 645 0.0526316 +1433 645 0.0526316 +1434 645 0.0526316 +1435 645 0.0526316 +1436 645 0.0526316 +1437 645 0.0526316 +1438 645 0.0526316 +1439 645 0.0526316 +1440 645 0.0526316 +1441 645 0.0526316 +1442 645 0.0526316 +1443 645 0.0526316 +1444 645 0.0526316 +1445 645 0.0526316 +1446 645 0.0526316 +1447 645 0.0526316 +853 646 0.5 +648 647 1.0 +651 650 0.333333 +653 652 0.333333 +654 652 2.08333 +655 652 2.08333 +656 652 0.333333 +657 652 0.583333 +893 652 0.333333 +654 653 0.333333 +655 653 0.333333 +655 654 2.08333 +656 654 0.333333 +657 654 0.916667 +774 654 0.333333 +863 654 0.5 +864 654 0.5 +865 654 0.5 +893 654 0.666667 +1130 654 0.833333 +656 655 0.333333 +657 655 0.583333 +893 655 0.333333 +774 657 0.333333 +1130 657 0.333333 +659 658 0.333333 +660 658 0.333333 +661 658 0.333333 +660 659 0.333333 +661 659 0.333333 +661 660 0.333333 +663 662 0.75 +664 662 0.25 +665 662 0.25 +666 662 0.25 +677 662 0.5 +792 662 0.333333 +793 662 0.333333 +794 662 0.333333 +664 663 0.25 +665 663 0.25 +666 663 0.25 +677 663 0.5 +665 664 0.25 +666 664 0.25 +666 665 0.25 +668 667 1.0 +670 669 1.0 +671 669 1.0 +721 670 1.0 +673 672 1.0 +676 675 0.5 +1556 676 0.333333 +1557 676 0.333333 +1558 676 0.333333 +679 678 0.5 +680 678 0.5 +680 679 0.5 +682 681 0.333333 +683 681 0.333333 +684 681 0.333333 +683 682 0.333333 +684 682 0.333333 +684 683 0.333333 +690 689 0.333333 +694 693 0.2 +695 693 0.2 +696 693 0.2 +697 693 1.2 +698 693 0.2 +695 694 0.2 +696 694 0.2 +697 694 0.2 +698 694 0.2 +696 695 0.2 +697 695 0.2 +698 695 0.2 +715 695 0.25 +716 695 0.25 +717 695 0.25 +718 695 0.25 +697 696 0.2 +698 696 0.2 +698 697 0.2 +1145 697 0.142857 +1394 697 0.142857 +1395 697 0.142857 +1396 697 0.142857 +1397 697 0.142857 +701 700 0.333333 +702 700 0.333333 +702 701 0.333333 +705 704 0.333333 +706 704 0.333333 +707 704 0.333333 +706 705 0.333333 +707 705 0.333333 +707 706 0.333333 +710 709 0.333333 +713 712 0.5 +716 715 0.25 +717 715 0.25 +718 715 0.25 +717 716 0.25 +718 716 0.25 +718 717 0.25 +720 719 2.0 +752 719 0.5 +753 719 0.5 +1346 721 1.0 +1454 721 1.0 +724 723 0.333333 +725 723 0.333333 +726 723 0.333333 +725 724 0.333333 +726 724 0.333333 +726 725 0.333333 +731 730 1.0 +733 732 0.5 +734 732 0.5 +734 733 0.5 +737 736 0.5 +743 742 1.4 +744 742 1.2 +745 742 1.0 +746 742 2.33333 +931 742 0.7 +932 742 0.7 +1278 742 0.2 +1356 742 0.333333 +744 743 0.7 +931 743 0.2 +932 743 0.2 +1278 743 0.2 +1278 744 0.7 +1279 744 0.333333 +1280 744 0.333333 +1281 744 0.333333 +1028 746 0.333333 +1029 746 0.333333 +1356 746 0.333333 +748 747 1.0 +751 750 1.0 +753 752 0.5 +755 754 1.0 +757 756 0.5 +758 756 0.5 +759 756 1.0 +760 756 1.5 +761 756 1.86667 +762 756 0.333333 +763 756 0.333333 +764 756 0.533333 +765 756 0.533333 +775 756 0.2 +892 756 0.2 +1123 756 0.5 +758 757 1.25 +977 757 0.25 +977 758 0.25 +762 761 0.666667 +763 761 0.666667 +764 761 0.533333 +765 761 0.533333 +774 761 1.33333 +775 761 1.53333 +776 761 0.333333 +892 761 0.2 +763 762 0.666667 +765 764 0.866667 +775 764 0.2 +892 764 0.2 +1255 764 0.833333 +775 765 0.2 +892 765 0.2 +1255 765 0.333333 +767 766 0.333333 +768 766 0.333333 +769 766 0.333333 +768 767 0.333333 +769 767 0.333333 +769 768 0.333333 +771 770 0.2 +772 770 0.2 +773 770 0.2 +772 771 0.2 +773 771 0.2 +773 772 0.2 +775 774 1.33333 +776 774 0.333333 +1130 774 0.333333 +776 775 0.333333 +892 775 0.2 +778 777 1.0 +781 780 0.5 +784 783 0.5 +1574 783 0.5 +786 785 0.5 +787 785 0.5 +787 786 0.5 +790 789 1.0 +793 792 0.333333 +794 792 0.333333 +794 793 0.333333 +796 795 0.25 +797 795 0.25 +798 795 0.25 +797 796 0.25 +798 796 0.25 +798 797 0.25 +800 799 0.2 +801 799 0.2 +802 799 0.2 +803 799 0.2 +804 799 0.2 +801 800 0.2 +802 800 0.2 +803 800 0.2 +804 800 0.2 +802 801 0.2 +803 801 0.2 +804 801 0.2 +803 802 0.2 +804 802 0.2 +804 803 0.2 +806 805 0.92619 +807 805 0.92619 +808 805 0.25 +1070 805 0.142857 +1071 805 0.342857 +1072 805 0.142857 +1073 805 0.142857 +807 806 0.92619 +808 806 0.25 +1016 806 0.333333 +1070 806 0.142857 +1071 806 0.67619 +1072 806 0.142857 +1073 806 0.142857 +808 807 0.25 +1070 807 0.142857 +1071 807 0.342857 +1072 807 0.142857 +1073 807 0.142857 +810 809 1.0 +813 812 1.0 +815 814 0.5 +816 814 0.5 +816 815 0.5 +818 817 1.0 +820 819 1.0 +1170 820 1.0 +822 821 0.333333 +823 821 0.333333 +824 821 0.333333 +823 822 0.333333 +824 822 0.333333 +824 823 0.333333 +826 825 0.111111 +827 825 0.111111 +828 825 0.111111 +829 825 0.111111 +830 825 0.111111 +831 825 0.111111 +832 825 0.111111 +833 825 0.111111 +834 825 0.111111 +827 826 0.111111 +828 826 0.111111 +829 826 0.111111 +830 826 0.111111 +831 826 0.111111 +832 826 0.111111 +833 826 0.111111 +834 826 0.111111 +828 827 0.111111 +829 827 0.111111 +830 827 0.111111 +831 827 0.111111 +832 827 0.111111 +833 827 0.111111 +834 827 0.111111 +829 828 0.111111 +830 828 0.111111 +831 828 0.111111 +832 828 0.111111 +833 828 0.111111 +834 828 0.111111 +830 829 0.111111 +831 829 0.111111 +832 829 0.111111 +833 829 0.111111 +834 829 0.111111 +831 830 0.111111 +832 830 0.111111 +833 830 0.111111 +834 830 0.111111 +832 831 0.111111 +833 831 0.111111 +834 831 0.111111 +833 832 0.111111 +834 832 0.111111 +834 833 0.111111 +836 835 0.5 +837 835 0.5 +837 836 0.5 +1190 840 0.2 +1191 840 0.2 +842 841 1.5 +843 841 0.5 +843 842 0.5 +1273 843 0.75 +1274 843 0.75 +1275 843 0.25 +1276 843 0.25 +1536 843 1.0 +845 844 0.333333 +846 844 0.333333 +847 844 0.333333 +846 845 0.333333 +847 845 0.333333 +847 846 0.333333 +849 848 1.0 +851 850 0.5 +852 850 0.5 +852 851 0.5 +856 855 0.5 +857 855 0.5 +857 856 0.5 +861 860 0.5 +862 860 0.5 +1464 860 0.2 +1465 860 0.2 +1466 860 0.2 +1467 860 0.2 +862 861 0.5 +864 863 0.5 +867 866 0.5 +871 870 0.25 +872 870 0.25 +873 870 0.25 +874 870 0.25 +872 871 0.25 +873 871 0.25 +874 871 0.25 +873 872 0.25 +874 872 0.25 +1268 872 1.0 +874 873 0.25 +878 877 0.25 +879 877 0.25 +880 877 0.25 +881 877 0.25 +879 878 0.25 +880 878 0.25 +881 878 0.25 +880 879 0.25 +881 879 0.25 +881 880 0.25 +1339 882 1.0 +884 883 0.5 +885 883 0.5 +885 884 0.5 +887 886 1.0 +889 888 0.5 +890 888 0.5 +890 889 0.5 +896 895 0.25 +897 895 0.25 +898 895 0.25 +899 895 0.25 +897 896 0.25 +898 896 0.25 +899 896 0.25 +898 897 0.25 +899 897 0.25 +899 898 0.25 +901 900 0.5 +902 900 0.5 +1318 900 1.0 +902 901 0.5 +904 903 0.5 +905 903 0.5 +905 904 0.5 +907 906 1.0 +910 909 0.5 +911 909 0.5 +911 910 0.5 +913 912 0.2 +914 912 0.2 +915 912 0.2 +916 912 0.2 +917 912 0.2 +914 913 0.342857 +915 913 0.342857 +916 913 0.985714 +917 913 0.2 +1000 913 0.142857 +1201 913 0.785714 +1202 913 0.142857 +1203 913 0.142857 +1204 913 0.142857 +1205 913 0.142857 +1206 913 0.142857 +1207 913 0.142857 +1208 913 0.142857 +915 914 0.342857 +916 914 0.342857 +917 914 0.2 +1201 914 0.142857 +1206 914 0.142857 +1207 914 0.142857 +1208 914 0.142857 +916 915 0.342857 +917 915 0.2 +1201 915 0.142857 +1206 915 0.142857 +1207 915 0.142857 +1208 915 0.142857 +917 916 0.2 +1000 916 0.142857 +1201 916 1.11905 +1202 916 0.142857 +1203 916 0.142857 +1204 916 0.142857 +1205 916 0.142857 +1206 916 0.142857 +1207 916 0.142857 +1208 916 0.142857 +1256 916 0.333333 +1257 916 0.333333 +921 920 1.0 +924 923 0.5 +925 923 0.5 +925 924 0.5 +1518 927 0.25 +1519 927 0.25 +1520 927 0.25 +930 929 1.0 +1418 930 1.0 +932 931 1.9 +933 931 1.0 +1175 931 0.5 +1176 931 0.5 +1356 931 1.0 +1368 931 0.2 +1369 931 0.2 +1368 932 0.2 +1369 932 0.2 +936 935 0.25 +937 935 0.25 +938 935 0.25 +937 936 0.25 +938 936 0.25 +938 937 0.25 +942 941 0.5 +943 941 0.5 +943 942 0.5 +945 944 0.2 +948 947 1.0 +1271 947 0.5 +1272 947 0.5 +950 949 1.0 +952 951 1.16667 +953 951 1.16667 +954 951 0.666667 +953 952 1.16667 +954 952 0.666667 +954 953 0.666667 +956 955 0.5 +1135 956 0.583333 +1136 956 0.25 +1137 956 0.25 +1138 956 0.333333 +958 957 0.5 +959 957 0.5 +959 958 0.5 +961 960 0.5 +962 960 0.5 +962 961 0.5 +964 963 0.333333 +966 965 0.2 +967 965 0.2 +968 965 0.2 +969 965 0.2 +970 965 0.2 +967 966 0.2 +968 966 0.2 +969 966 0.2 +970 966 0.2 +968 967 0.2 +969 967 0.2 +970 967 0.2 +969 968 0.2 +970 968 0.2 +970 969 0.2 +973 972 1.0 +989 973 1.0 +1002 973 0.833333 +1003 973 0.833333 +1004 973 0.333333 +975 974 0.5 +976 974 0.5 +976 975 0.5 +1129 976 1.0 +979 978 1.0 +981 980 0.5 +982 980 0.5 +982 981 0.5 +984 983 1.0 +985 983 0.5 +986 983 0.5 +985 984 0.833333 +986 984 0.5 +1091 984 0.333333 +1092 984 0.833333 +1092 985 0.333333 +988 987 1.0 +993 992 1.0 +995 994 0.25 +996 994 0.25 +997 994 0.25 +998 994 0.25 +996 995 0.25 +997 995 0.25 +998 995 0.25 +997 996 0.25 +998 996 0.25 +998 997 0.25 +1000 999 1.0 +1201 1000 0.142857 +1202 1000 0.142857 +1203 1000 0.142857 +1204 1000 0.142857 +1205 1000 0.142857 +1504 1000 0.5 +1514 1000 0.5 +1003 1002 0.833333 +1004 1002 0.333333 +1004 1003 0.333333 +1007 1006 1.0 +1010 1009 1.0 +1045 1010 1.0 +1012 1011 1.0 +1014 1013 1.0 +1071 1016 0.333333 +1018 1017 1.2 +1306 1017 0.2 +1307 1017 0.2 +1308 1017 0.2 +1309 1017 0.2 +1303 1018 0.5 +1304 1018 0.5 +1305 1018 1.0 +1306 1018 0.2 +1307 1018 0.2 +1308 1018 0.2 +1309 1018 0.2 +1022 1021 0.25 +1023 1021 0.75 +1023 1022 0.25 +1025 1024 0.5 +1027 1026 1.0 +1416 1026 0.333333 +1417 1026 0.333333 +1029 1028 0.333333 +1032 1031 1.0 +1034 1033 1.0 +1036 1035 1.0 +1037 1035 0.5 +1038 1035 0.5 +1038 1037 0.5 +1040 1039 0.5 +1043 1042 0.5 +1044 1042 0.5 +1044 1043 0.5 +1048 1047 0.25 +1049 1047 0.25 +1050 1047 0.25 +1049 1048 0.25 +1050 1048 0.25 +1050 1049 0.25 +1053 1052 1.0 +1055 1054 1.0 +1056 1054 0.333333 +1057 1054 0.333333 +1058 1054 0.333333 +1057 1056 0.333333 +1058 1056 0.333333 +1058 1057 0.333333 +1061 1060 0.111111 +1062 1060 0.111111 +1063 1060 0.111111 +1064 1060 0.111111 +1065 1060 0.111111 +1066 1060 0.111111 +1067 1060 0.111111 +1068 1060 0.111111 +1069 1060 0.111111 +1412 1060 1.0 +1062 1061 0.111111 +1063 1061 0.111111 +1064 1061 0.111111 +1065 1061 0.111111 +1066 1061 0.111111 +1067 1061 0.111111 +1068 1061 0.111111 +1069 1061 0.111111 +1063 1062 0.111111 +1064 1062 0.111111 +1065 1062 0.111111 +1066 1062 0.111111 +1067 1062 0.111111 +1068 1062 0.111111 +1069 1062 0.111111 +1064 1063 0.111111 +1065 1063 0.111111 +1066 1063 0.111111 +1067 1063 0.111111 +1068 1063 0.111111 +1069 1063 0.111111 +1065 1064 0.111111 +1066 1064 0.111111 +1067 1064 0.111111 +1068 1064 0.111111 +1069 1064 0.111111 +1066 1065 0.111111 +1067 1065 0.111111 +1068 1065 0.111111 +1069 1065 0.111111 +1067 1066 0.111111 +1068 1066 0.111111 +1069 1066 0.111111 +1068 1067 0.111111 +1069 1067 0.111111 +1069 1068 0.111111 +1071 1070 0.142857 +1072 1070 0.142857 +1073 1070 0.142857 +1072 1071 0.142857 +1073 1071 0.142857 +1073 1072 0.142857 +1079 1078 1.0 +1083 1082 0.5 +1087 1086 0.5 +1088 1087 0.5 +1089 1087 0.5 +1094 1093 0.333333 +1095 1093 0.333333 +1096 1093 0.333333 +1095 1094 0.333333 +1096 1094 0.333333 +1096 1095 0.333333 +1098 1097 0.5 +1099 1097 0.5 +1099 1098 0.5 +1102 1101 0.5 +1103 1101 0.5 +1103 1102 0.5 +1106 1105 0.125 +1107 1105 0.125 +1108 1105 0.125 +1109 1105 0.125 +1110 1105 0.125 +1111 1105 0.125 +1112 1105 0.125 +1113 1105 0.125 +1107 1106 0.125 +1108 1106 0.125 +1109 1106 0.125 +1110 1106 0.125 +1111 1106 0.125 +1112 1106 0.125 +1113 1106 0.125 +1108 1107 0.125 +1109 1107 0.125 +1110 1107 0.125 +1111 1107 0.125 +1112 1107 0.125 +1113 1107 0.125 +1357 1107 0.333333 +1358 1107 0.333333 +1411 1107 0.333333 +1109 1108 0.125 +1110 1108 0.125 +1111 1108 0.125 +1112 1108 0.125 +1113 1108 0.125 +1110 1109 0.125 +1111 1109 0.125 +1112 1109 0.125 +1113 1109 0.125 +1111 1110 0.125 +1112 1110 0.125 +1113 1110 0.125 +1112 1111 0.125 +1113 1111 0.125 +1113 1112 0.125 +1115 1114 1.0 +1117 1116 0.25 +1118 1116 0.25 +1119 1116 0.25 +1120 1116 0.25 +1118 1117 0.25 +1119 1117 0.25 +1120 1117 0.25 +1119 1118 0.25 +1120 1118 0.25 +1120 1119 0.25 +1515 1120 0.333333 +1516 1120 0.333333 +1517 1120 0.333333 +1122 1121 0.5 +1125 1124 0.333333 +1128 1127 1.0 +1132 1131 1.0 +1134 1133 1.0 +1136 1135 0.25 +1137 1135 0.25 +1138 1135 0.333333 +1137 1136 0.25 +1140 1139 1.0 +1142 1141 1.0 +1488 1142 0.5 +1489 1142 0.5 +1282 1145 0.333333 +1283 1145 0.333333 +1394 1145 0.142857 +1395 1145 0.142857 +1396 1145 0.142857 +1397 1145 0.142857 +1560 1145 0.333333 +1561 1145 0.333333 +1147 1146 0.25 +1148 1146 0.25 +1149 1146 0.25 +1150 1146 0.25 +1148 1147 0.25 +1149 1147 0.25 +1150 1147 0.25 +1149 1148 0.25 +1150 1148 0.25 +1150 1149 0.25 +1153 1152 0.125 +1154 1152 0.125 +1155 1152 0.125 +1156 1152 0.125 +1157 1152 0.125 +1158 1152 0.125 +1159 1152 0.125 +1160 1152 0.125 +1154 1153 0.125 +1155 1153 0.125 +1156 1153 0.125 +1157 1153 0.125 +1158 1153 0.125 +1159 1153 0.125 +1160 1153 0.125 +1155 1154 0.125 +1156 1154 0.125 +1157 1154 0.125 +1158 1154 0.125 +1159 1154 0.125 +1160 1154 0.125 +1156 1155 0.125 +1157 1155 0.125 +1158 1155 0.125 +1159 1155 0.125 +1160 1155 0.125 +1157 1156 0.125 +1158 1156 0.125 +1159 1156 0.125 +1160 1156 0.125 +1158 1157 0.125 +1159 1157 0.125 +1160 1157 0.125 +1159 1158 0.125 +1160 1158 0.125 +1160 1159 0.125 +1163 1162 0.5 +1413 1162 0.25 +1414 1162 0.25 +1415 1162 0.25 +1165 1164 1.0 +1167 1166 0.333333 +1169 1168 1.0 +1176 1175 0.5 +1342 1178 0.333333 +1181 1180 0.25 +1185 1184 0.5 +1186 1184 0.5 +1186 1185 0.5 +1191 1190 0.2 +1194 1193 1.0 +1196 1195 0.333333 +1197 1195 0.333333 +1197 1196 0.333333 +1199 1198 0.5 +1200 1198 0.5 +1200 1199 0.5 +1202 1201 0.142857 +1203 1201 0.142857 +1204 1201 0.142857 +1205 1201 0.142857 +1206 1201 0.142857 +1207 1201 0.142857 +1208 1201 0.142857 +1256 1201 0.333333 +1257 1201 0.333333 +1203 1202 0.142857 +1204 1202 0.142857 +1205 1202 0.142857 +1204 1203 0.142857 +1205 1203 0.142857 +1205 1204 0.142857 +1207 1206 0.142857 +1208 1206 0.142857 +1208 1207 0.142857 +1210 1209 0.333333 +1211 1209 0.333333 +1212 1209 0.333333 +1211 1210 0.333333 +1212 1210 0.333333 +1212 1211 0.333333 +1215 1214 0.25 +1216 1214 0.25 +1217 1214 0.25 +1216 1215 0.25 +1217 1215 0.25 +1217 1216 0.25 +1219 1218 1.0 +1223 1222 0.5 +1224 1222 0.5 +1224 1223 0.5 +1226 1225 1.0 +1227 1225 1.0 +1345 1225 1.0 +1229 1228 0.25 +1232 1231 1.0 +1234 1233 0.5 +1236 1235 0.5 +1238 1237 1.0 +1241 1240 1.0 +1243 1242 1.0 +1245 1244 0.25 +1246 1244 0.25 +1247 1244 0.25 +1246 1245 0.25 +1247 1245 0.25 +1247 1246 0.25 +1249 1248 1.0 +1251 1250 0.5 +1253 1252 0.5 +1254 1252 1.5 +1254 1253 0.5 +1257 1256 0.333333 +1259 1258 1.0 +1261 1260 0.5 +1262 1260 0.5 +1262 1261 0.5 +1265 1264 0.333333 +1266 1264 0.333333 +1267 1264 0.333333 +1266 1265 0.333333 +1267 1265 0.333333 +1267 1266 0.333333 +1272 1271 0.5 +1274 1273 0.75 +1275 1273 0.25 +1276 1273 0.25 +1275 1274 0.25 +1276 1274 0.25 +1276 1275 0.25 +1280 1279 0.333333 +1281 1279 0.333333 +1281 1280 0.333333 +1283 1282 0.333333 +1287 1286 0.25 +1288 1286 0.25 +1289 1286 0.25 +1290 1286 0.25 +1364 1286 0.25 +1365 1286 0.25 +1366 1286 0.25 +1367 1286 0.25 +1288 1287 0.25 +1289 1287 0.25 +1290 1287 0.25 +1289 1288 0.25 +1290 1288 0.25 +1290 1289 0.25 +1293 1292 0.5 +1294 1292 0.5 +1294 1293 0.5 +1377 1294 0.5 +1378 1294 0.5 +1299 1298 1.0 +1304 1303 0.5 +1307 1306 0.2 +1308 1306 0.2 +1309 1306 0.2 +1308 1307 0.2 +1309 1307 0.2 +1309 1308 0.2 +1311 1310 1.0 +1313 1312 0.25 +1314 1312 0.25 +1315 1312 0.25 +1316 1312 0.25 +1314 1313 0.25 +1315 1313 0.25 +1316 1313 0.25 +1315 1314 0.25 +1316 1314 0.25 +1316 1315 0.25 +1468 1315 0.25 +1469 1315 0.25 +1470 1315 0.25 +1321 1320 1.0 +1324 1323 0.5 +1325 1323 0.5 +1325 1324 0.5 +1327 1326 1.0 +1329 1328 1.0 +1332 1331 0.5 +1333 1331 0.5 +1333 1332 0.5 +1336 1335 0.333333 +1337 1335 0.333333 +1338 1335 0.333333 +1337 1336 0.333333 +1338 1336 0.333333 +1419 1336 1.0 +1338 1337 0.333333 +1344 1343 0.5 +1348 1347 0.5 +1350 1349 0.25 +1351 1349 0.25 +1352 1349 0.25 +1351 1350 0.25 +1352 1350 0.25 +1352 1351 0.25 +1355 1354 1.0 +1357 1356 1.0 +1358 1356 1.0 +1359 1356 1.0 +1358 1357 2.33333 +1411 1357 0.333333 +1411 1358 0.333333 +1453 1360 1.0 +1362 1361 0.333333 +1365 1364 0.25 +1366 1364 0.25 +1367 1364 0.25 +1366 1365 0.25 +1367 1365 0.25 +1367 1366 0.25 +1369 1368 0.2 +1371 1370 1.0 +1373 1372 1.0 +1375 1374 0.5 +1376 1374 0.5 +1376 1375 0.5 +1378 1377 0.5 +1385 1384 0.5 +1387 1386 1.0 +1391 1390 0.5 +1392 1390 0.5 +1392 1391 0.5 +1395 1394 0.142857 +1396 1394 0.142857 +1397 1394 0.142857 +1396 1395 0.142857 +1397 1395 0.142857 +1397 1396 0.142857 +1400 1399 0.25 +1401 1399 0.25 +1402 1399 0.25 +1403 1399 0.25 +1401 1400 0.25 +1402 1400 0.25 +1403 1400 0.25 +1402 1401 0.25 +1403 1401 0.25 +1403 1402 0.25 +1405 1404 0.166667 +1406 1404 0.166667 +1407 1404 0.166667 +1408 1404 0.166667 +1406 1405 0.166667 +1407 1405 0.166667 +1408 1405 0.166667 +1407 1406 0.166667 +1408 1406 0.166667 +1408 1407 0.166667 +1410 1409 0.5 +1414 1413 0.25 +1415 1413 0.25 +1415 1414 0.25 +1417 1416 0.333333 +1421 1420 0.333333 +1422 1420 0.333333 +1423 1420 0.333333 +1422 1421 0.333333 +1423 1421 0.333333 +1423 1422 0.333333 +1425 1424 0.5 +1427 1426 0.5 +1428 1426 0.5 +1428 1427 0.5 +1430 1429 0.385965 +1431 1429 0.385965 +1432 1429 0.0526316 +1433 1429 0.0526316 +1434 1429 0.0526316 +1435 1429 0.0526316 +1436 1429 0.0526316 +1437 1429 0.0526316 +1438 1429 0.0526316 +1439 1429 0.0526316 +1440 1429 0.0526316 +1441 1429 0.0526316 +1442 1429 0.0526316 +1443 1429 0.0526316 +1444 1429 0.0526316 +1445 1429 0.0526316 +1446 1429 0.0526316 +1447 1429 0.0526316 +1448 1429 0.333333 +1431 1430 0.385965 +1432 1430 0.0526316 +1433 1430 0.0526316 +1434 1430 0.0526316 +1435 1430 0.0526316 +1436 1430 0.0526316 +1437 1430 0.0526316 +1438 1430 0.0526316 +1439 1430 0.0526316 +1440 1430 0.0526316 +1441 1430 0.0526316 +1442 1430 0.0526316 +1443 1430 0.0526316 +1444 1430 0.0526316 +1445 1430 0.0526316 +1446 1430 0.0526316 +1447 1430 0.0526316 +1448 1430 0.333333 +1432 1431 0.0526316 +1433 1431 0.0526316 +1434 1431 0.0526316 +1435 1431 0.0526316 +1436 1431 0.0526316 +1437 1431 0.0526316 +1438 1431 0.0526316 +1439 1431 0.0526316 +1440 1431 0.0526316 +1441 1431 0.0526316 +1442 1431 0.0526316 +1443 1431 0.0526316 +1444 1431 0.0526316 +1445 1431 0.0526316 +1446 1431 0.0526316 +1447 1431 0.0526316 +1448 1431 0.333333 +1433 1432 0.0526316 +1434 1432 0.0526316 +1435 1432 0.0526316 +1436 1432 0.0526316 +1437 1432 0.0526316 +1438 1432 0.0526316 +1439 1432 0.0526316 +1440 1432 0.0526316 +1441 1432 0.0526316 +1442 1432 0.0526316 +1443 1432 0.0526316 +1444 1432 0.0526316 +1445 1432 0.0526316 +1446 1432 0.0526316 +1447 1432 0.0526316 +1434 1433 0.0526316 +1435 1433 0.0526316 +1436 1433 0.0526316 +1437 1433 0.0526316 +1438 1433 0.0526316 +1439 1433 0.0526316 +1440 1433 0.0526316 +1441 1433 0.0526316 +1442 1433 0.0526316 +1443 1433 0.0526316 +1444 1433 0.0526316 +1445 1433 0.0526316 +1446 1433 0.0526316 +1447 1433 0.0526316 +1435 1434 0.0526316 +1436 1434 0.0526316 +1437 1434 0.0526316 +1438 1434 0.0526316 +1439 1434 0.0526316 +1440 1434 0.0526316 +1441 1434 0.0526316 +1442 1434 0.0526316 +1443 1434 0.0526316 +1444 1434 0.0526316 +1445 1434 0.0526316 +1446 1434 0.0526316 +1447 1434 0.0526316 +1436 1435 0.0526316 +1437 1435 0.0526316 +1438 1435 0.0526316 +1439 1435 0.0526316 +1440 1435 0.0526316 +1441 1435 0.0526316 +1442 1435 0.0526316 +1443 1435 0.0526316 +1444 1435 0.0526316 +1445 1435 0.0526316 +1446 1435 0.0526316 +1447 1435 0.0526316 +1437 1436 0.0526316 +1438 1436 0.0526316 +1439 1436 0.0526316 +1440 1436 0.0526316 +1441 1436 0.0526316 +1442 1436 0.0526316 +1443 1436 0.0526316 +1444 1436 0.0526316 +1445 1436 0.0526316 +1446 1436 0.0526316 +1447 1436 0.0526316 +1438 1437 0.0526316 +1439 1437 0.0526316 +1440 1437 0.0526316 +1441 1437 0.0526316 +1442 1437 0.0526316 +1443 1437 0.0526316 +1444 1437 0.0526316 +1445 1437 0.0526316 +1446 1437 0.0526316 +1447 1437 0.0526316 +1439 1438 0.0526316 +1440 1438 0.0526316 +1441 1438 0.0526316 +1442 1438 0.0526316 +1443 1438 0.0526316 +1444 1438 0.0526316 +1445 1438 0.0526316 +1446 1438 0.0526316 +1447 1438 0.0526316 +1440 1439 0.0526316 +1441 1439 0.0526316 +1442 1439 0.0526316 +1443 1439 0.0526316 +1444 1439 0.0526316 +1445 1439 0.0526316 +1446 1439 0.0526316 +1447 1439 0.0526316 +1441 1440 0.0526316 +1442 1440 0.0526316 +1443 1440 0.0526316 +1444 1440 0.0526316 +1445 1440 0.0526316 +1446 1440 0.0526316 +1447 1440 0.0526316 +1442 1441 0.0526316 +1443 1441 0.0526316 +1444 1441 0.0526316 +1445 1441 0.0526316 +1446 1441 0.0526316 +1447 1441 0.0526316 +1443 1442 0.0526316 +1444 1442 0.0526316 +1445 1442 0.0526316 +1446 1442 0.0526316 +1447 1442 0.0526316 +1444 1443 0.0526316 +1445 1443 0.0526316 +1446 1443 0.0526316 +1447 1443 0.0526316 +1445 1444 0.0526316 +1446 1444 0.0526316 +1447 1444 0.0526316 +1446 1445 0.0526316 +1447 1445 0.0526316 +1447 1446 0.0526316 +1450 1449 1.0 +1457 1456 0.333333 +1458 1456 0.333333 +1459 1456 0.333333 +1458 1457 0.333333 +1459 1457 0.333333 +1459 1458 0.333333 +1465 1464 0.2 +1466 1464 0.2 +1467 1464 0.2 +1466 1465 0.2 +1467 1465 0.2 +1467 1466 0.2 +1469 1468 0.25 +1470 1468 0.25 +1470 1469 0.25 +1472 1471 0.5 +1473 1471 0.5 +1473 1472 0.5 +1475 1474 0.5 +1476 1474 0.5 +1476 1475 0.5 +1478 1477 0.5 +1480 1479 1.0 +1482 1481 0.5 +1484 1483 0.5 +1485 1483 0.5 +1485 1484 0.5 +1487 1486 1.0 +1489 1488 0.5 +1492 1491 1.0 +1493 1491 0.25 +1540 1491 0.25 +1541 1491 0.25 +1542 1491 0.25 +1494 1493 1.0 +1540 1493 0.25 +1541 1493 0.25 +1542 1493 0.25 +1496 1495 1.0 +1501 1500 0.25 +1502 1500 0.25 +1503 1500 0.25 +1502 1501 0.25 +1503 1501 0.25 +1503 1502 0.25 +1505 1504 0.2 +1506 1504 0.2 +1507 1504 0.2 +1508 1504 0.2 +1509 1504 0.2 +1514 1504 0.5 +1506 1505 0.2 +1507 1505 0.2 +1508 1505 0.2 +1509 1505 0.2 +1507 1506 0.2 +1508 1506 0.2 +1509 1506 0.2 +1508 1507 0.2 +1509 1507 0.2 +1509 1508 0.2 +1512 1511 0.5 +1513 1511 0.5 +1513 1512 0.5 +1516 1515 0.333333 +1517 1515 0.333333 +1517 1516 0.333333 +1519 1518 0.25 +1520 1518 0.25 +1520 1519 0.25 +1523 1522 1.0 +1526 1525 1.0 +1531 1530 1.0 +1534 1533 0.2 +1535 1533 0.2 +1535 1534 0.2 +1538 1537 0.5 +1539 1537 0.5 +1539 1538 0.5 +1541 1540 0.25 +1542 1540 0.25 +1542 1541 0.25 +1544 1543 1.0 +1546 1545 0.333333 +1547 1545 0.333333 +1548 1545 0.333333 +1547 1546 0.333333 +1548 1546 0.333333 +1548 1547 0.333333 +1551 1550 0.333333 +1554 1553 0.333333 +1555 1553 0.333333 +1555 1554 0.333333 +1557 1556 0.333333 +1558 1556 0.333333 +1558 1557 0.333333 +1561 1560 0.333333 +1563 1562 0.142857 +1564 1562 0.142857 +1565 1562 0.142857 +1566 1562 0.142857 +1567 1562 0.142857 +1564 1563 0.142857 +1565 1563 0.142857 +1566 1563 0.142857 +1567 1563 0.142857 +1565 1564 0.142857 +1566 1564 0.142857 +1567 1564 0.142857 +1566 1565 0.142857 +1567 1565 0.142857 +1567 1566 0.142857 +1569 1568 1.0 +1571 1570 0.2 +1572 1570 0.2 +1573 1570 0.2 +1572 1571 0.2 +1573 1571 0.2 +1573 1572 0.2 +1576 1575 0.333333 +1577 1575 0.333333 +1578 1575 0.333333 +1577 1576 0.333333 +1578 1576 0.333333 +1578 1577 0.333333 +1581 1580 1.0 +1584 1583 1.0 +1586 1585 1.0 +1587 1585 1.0 +0 1 2.5 +0 1084 0.5 +1 946 1.0 +1 1084 0.5 +2 3 0.25 +2 4 0.25 +2 5 0.25 +2 6 0.25 +3 4 0.25 +3 5 0.25 +3 6 0.25 +4 5 0.25 +4 6 0.25 +5 6 0.25 +7 8 1.0 +7 9 3.16667 +7 10 1.16667 +7 11 0.666667 +9 10 1.16667 +9 11 0.666667 +9 1424 0.5 +9 1425 1.5 +9 1532 1.0 +10 11 0.666667 +12 13 0.333333 +12 14 0.333333 +12 15 0.333333 +12 1047 0.25 +12 1048 0.25 +12 1049 0.25 +12 1050 0.25 +13 14 0.333333 +13 15 0.333333 +14 15 0.333333 +16 17 0.5 +16 18 0.5 +17 18 0.5 +20 21 0.5 +20 22 0.5 +21 22 0.5 +23 24 0.5 +23 25 0.5 +24 25 2.33333 +24 201 0.333333 +24 202 0.333333 +24 369 0.5 +25 201 0.333333 +25 202 0.333333 +25 369 0.5 +27 28 0.5 +27 29 0.5 +28 29 0.5 +30 31 0.5 +30 32 0.5 +30 33 3.58333 +30 34 1.58333 +30 54 0.25 +30 131 0.333333 +30 327 0.333333 +30 402 0.333333 +30 840 0.25 +30 894 0.333333 +31 32 0.5 +33 34 4.225 +33 51 0.75 +33 52 0.25 +33 53 1.85833 +33 54 2.99167 +33 131 1.33333 +33 132 2.275 +33 133 1.025 +33 134 0.525 +33 190 0.583333 +33 375 0.25 +33 376 0.25 +33 377 0.25 +33 464 1.0 +33 485 1.0 +33 488 0.333333 +33 489 0.333333 +33 507 0.583333 +33 508 0.583333 +33 509 0.25 +33 561 0.708333 +33 562 0.458333 +33 839 0.333333 +33 840 0.45 +33 1008 0.5 +33 1190 0.2 +33 1191 0.2 +33 1228 0.25 +33 1229 0.25 +33 1295 0.25 +33 1529 0.5 +33 1550 1.33333 +33 1551 0.333333 +34 53 0.775 +34 54 1.15833 +34 131 0.333333 +34 132 0.525 +34 133 1.025 +34 134 0.525 +34 561 0.375 +34 562 0.125 +34 652 0.25 +34 654 1.25 +34 655 0.25 +34 657 0.25 +34 756 0.5 +34 760 0.5 +34 761 0.333333 +34 762 0.333333 +34 763 0.333333 +34 839 0.333333 +34 840 0.45 +34 865 0.5 +34 1130 0.5 +34 1190 0.2 +34 1191 0.2 +34 1550 0.833333 +34 1551 0.333333 +35 36 0.2 +35 37 0.2 +35 38 0.2 +35 39 0.2 +35 40 0.2 +36 37 0.2 +36 38 0.2 +36 39 0.2 +36 40 0.2 +37 38 0.2 +37 39 0.2 +37 40 0.2 +38 39 0.2 +38 40 0.2 +39 40 0.2 +42 43 1.0 +44 45 0.5 +44 46 0.5 +45 46 0.5 +45 609 0.833333 +45 610 0.5 +45 611 0.333333 +45 612 0.333333 +46 78 1.0 +46 191 0.833333 +46 192 0.333333 +46 193 0.333333 +46 194 0.5 +46 428 1.33333 +46 596 1.0 +46 1361 1.33333 +46 1362 0.333333 +46 1363 1.0 +47 48 0.333333 +47 49 0.333333 +47 50 0.333333 +48 49 0.333333 +48 50 0.333333 +48 216 0.333333 +48 217 0.333333 +48 218 0.333333 +49 50 0.333333 +51 52 0.25 +51 53 0.25 +51 54 0.25 +51 55 0.5 +51 56 0.5 +51 57 1.0 +51 58 1.0 +51 1008 0.5 +52 53 0.25 +52 54 0.25 +53 54 0.625 +53 132 1.025 +53 133 0.525 +53 134 0.525 +53 561 0.708333 +53 562 0.458333 +53 1024 0.5 +53 1025 0.5 +53 1315 0.25 +53 1468 0.25 +53 1469 0.25 +53 1470 0.25 +54 132 0.375 +54 133 0.125 +54 134 0.125 +54 488 0.333333 +54 489 0.333333 +54 561 0.375 +54 562 0.125 +54 839 0.333333 +54 840 0.45 +54 1190 0.2 +54 1191 0.2 +54 1228 0.25 +54 1229 0.25 +54 1529 0.5 +54 1550 0.5 +55 56 3.83333 +55 90 1.0 +55 184 0.5 +55 547 0.5 +55 654 0.333333 +55 893 0.333333 +55 934 0.5 +55 1461 0.5 +56 184 0.5 +56 547 0.5 +56 654 0.333333 +56 893 0.333333 +56 934 0.5 +56 1461 0.5 +57 58 1.0 +57 685 1.0 +59 60 0.5 +59 61 0.5 +60 61 0.5 +62 63 0.47619 +62 64 0.333333 +62 65 0.333333 +62 362 0.2 +62 805 0.92619 +62 806 1.25952 +62 807 0.92619 +62 808 0.25 +62 1016 1.33333 +62 1070 0.142857 +62 1071 0.67619 +62 1072 0.142857 +62 1073 0.142857 +62 1562 0.142857 +62 1563 0.142857 +62 1564 0.142857 +62 1565 0.142857 +62 1566 0.142857 +62 1567 0.142857 +63 64 0.333333 +63 65 0.333333 +63 1562 0.142857 +63 1563 0.142857 +63 1564 0.142857 +63 1565 0.142857 +63 1566 0.142857 +63 1567 0.142857 +64 65 0.333333 +64 795 0.25 +64 796 0.25 +64 797 0.25 +64 798 0.25 +66 67 0.5 +66 68 0.5 +67 68 0.5 +69 70 0.833333 +69 71 2.16667 +69 72 0.916667 +69 97 1.83333 +69 310 0.5 +69 709 0.666667 +69 710 0.333333 +69 757 0.75 +69 758 0.75 +69 977 0.25 +69 1082 0.5 +69 1083 0.5 +70 71 0.833333 +70 72 0.333333 +71 72 0.666667 +71 149 1.16667 +71 150 0.666667 +71 151 1.16667 +71 157 0.5 +71 158 0.5 +71 709 0.333333 +71 736 0.5 +71 737 0.5 +72 235 1.0 +72 443 0.5 +72 709 0.333333 +72 738 0.5 +72 757 0.25 +72 758 0.25 +72 977 0.25 +73 74 0.333333 +73 75 0.333333 +73 76 0.333333 +74 75 0.333333 +74 76 0.333333 +75 76 0.333333 +76 522 1.0 +76 1381 0.5 +76 1588 0.5 +77 78 0.333333 +77 79 0.333333 +77 80 0.333333 +78 79 0.333333 +78 80 0.333333 +78 121 1.0 +78 281 1.0 +78 305 0.583333 +78 306 0.25 +78 307 0.25 +78 308 1.58333 +78 309 3.33333 +78 370 0.5 +78 371 2.5 +78 490 0.5 +78 641 1.0 +78 646 2.5 +78 756 0.5 +78 759 0.5 +78 853 0.5 +78 1005 1.0 +78 1121 0.5 +78 1122 0.5 +78 1123 0.5 +78 1172 1.0 +78 1195 0.333333 +78 1196 0.333333 +78 1197 0.333333 +79 80 0.333333 +81 82 0.5 +81 83 0.5 +82 83 0.5 +82 563 1.0 +82 1498 1.0 +84 85 0.5 +84 86 0.5 +85 86 0.5 +87 88 2.5 +87 711 0.5 +88 711 0.5 +88 976 1.0 +88 991 2.0 +91 92 0.5 +91 93 0.5 +92 93 0.5 +94 95 0.5 +94 96 2.66667 +94 97 2.33333 +94 98 0.5 +94 99 0.5 +94 100 0.25 +94 150 0.333333 +94 225 0.333333 +94 708 0.583333 +95 96 0.5 +95 97 0.5 +95 98 0.5 +96 97 2.33333 +96 98 0.5 +96 99 0.5 +96 100 0.25 +96 150 0.833333 +96 225 0.333333 +96 700 0.333333 +96 701 0.333333 +96 702 0.333333 +96 708 0.583333 +96 1177 0.5 +96 1481 0.5 +96 1482 0.5 +97 98 0.5 +97 99 0.5 +97 100 0.25 +97 310 0.5 +97 708 0.583333 +97 709 0.333333 +97 710 0.333333 +99 100 1.25 +99 708 0.25 +102 103 0.5 +102 104 0.5 +103 104 0.5 +105 106 0.5 +105 107 0.5 +106 107 0.5 +106 859 1.0 +108 109 1.0 +111 112 1.0 +113 114 1.0 +114 1162 0.5 +114 1163 0.5 +116 117 1.0 +117 935 0.25 +117 936 0.25 +117 937 0.25 +117 938 0.25 +118 119 1.0 +118 439 0.5 +118 441 0.5 +120 121 1.0 +121 548 0.333333 +121 549 0.333333 +121 550 1.83333 +121 764 0.833333 +121 765 0.333333 +121 1030 0.5 +121 1255 0.833333 +122 123 0.5 +122 124 0.5 +123 124 0.5 +126 127 0.7 +126 128 0.5 +126 770 0.2 +126 771 0.2 +126 772 0.2 +126 773 0.2 +127 128 0.75 +127 151 0.333333 +127 517 0.333333 +127 770 0.2 +127 771 0.2 +127 772 0.2 +127 773 0.2 +127 1021 0.25 +127 1022 0.25 +127 1023 0.25 +127 1460 0.333333 +128 1021 0.75 +128 1022 0.25 +128 1023 1.75 +129 130 1.0 +131 203 1.0 +132 133 0.525 +132 134 0.525 +132 561 0.125 +132 562 0.125 +132 1228 0.25 +132 1229 0.25 +133 134 0.525 +133 561 0.125 +133 562 0.125 +134 561 0.125 +134 562 0.125 +135 136 1.0 +136 216 0.5 +136 223 0.5 +136 585 0.333333 +136 586 0.333333 +136 587 1.83333 +136 729 0.5 +137 138 1.0 +139 140 0.111111 +139 141 0.111111 +139 142 0.111111 +139 143 0.111111 +139 144 0.111111 +139 145 0.111111 +139 146 0.111111 +139 147 0.111111 +139 148 0.111111 +140 141 0.111111 +140 142 0.111111 +140 143 0.111111 +140 144 0.111111 +140 145 0.111111 +140 146 0.111111 +140 147 0.111111 +140 148 0.111111 +141 142 0.111111 +141 143 0.111111 +141 144 0.111111 +141 145 0.111111 +141 146 0.111111 +141 147 0.111111 +141 148 0.111111 +142 143 0.111111 +142 144 0.111111 +142 145 0.111111 +142 146 0.111111 +142 147 0.111111 +142 148 0.111111 +143 144 0.111111 +143 145 0.111111 +143 146 0.111111 +143 147 0.111111 +143 148 0.111111 +144 145 0.111111 +144 146 0.111111 +144 147 0.111111 +144 148 0.111111 +145 146 0.111111 +145 147 0.111111 +145 148 0.111111 +146 147 0.111111 +146 148 0.111111 +147 148 0.111111 +149 150 0.666667 +149 151 1.16667 +149 152 1.0 +150 151 4.75 +150 225 2.08333 +150 281 1.83333 +150 301 0.5 +150 500 0.5 +150 516 1.08333 +150 517 1.58333 +150 1177 0.5 +150 1178 0.833333 +150 1221 0.5 +150 1342 0.333333 +151 225 0.75 +151 301 0.5 +151 330 0.5 +151 331 0.5 +151 516 1.58333 +151 517 2.25 +151 963 0.333333 +151 964 0.333333 +151 1088 0.5 +151 1460 0.333333 +152 517 1.0 +153 154 1.33333 +153 155 0.333333 +153 156 0.333333 +154 155 0.333333 +154 156 0.333333 +155 156 0.333333 +157 158 0.5 +160 161 1.0 +162 163 1.0 +162 301 0.25 +162 316 0.25 +162 638 0.25 +162 639 0.25 +164 165 1.0 +166 167 1.0 +166 406 1.0 +169 170 0.5 +169 171 0.5 +170 171 0.5 +171 918 1.0 +172 173 0.5 +172 174 1.5 +173 174 0.5 +175 176 0.5 +175 177 0.5 +176 177 0.5 +177 926 1.0 +179 180 1.0 +179 181 1.0 +180 181 1.0 +182 183 1.0 +184 185 0.5 +184 186 0.5 +185 186 0.5 +186 1162 1.25 +186 1413 0.25 +186 1414 0.25 +186 1415 0.25 +187 188 1.5 +187 189 0.5 +188 189 0.5 +189 567 2.33333 +189 650 0.333333 +189 651 0.333333 +190 507 0.583333 +190 508 0.583333 +190 509 0.25 +191 192 0.333333 +191 193 0.333333 +191 194 0.5 +192 193 0.333333 +194 955 0.5 +194 956 1.08333 +194 1135 0.583333 +194 1136 0.25 +194 1137 0.25 +194 1138 0.333333 +194 1384 0.5 +194 1385 0.5 +195 196 1.25 +195 197 0.25 +195 198 0.25 +195 199 0.25 +196 197 0.25 +196 198 0.25 +196 199 0.25 +197 198 0.25 +197 199 0.25 +198 199 0.25 +200 201 0.5 +200 202 0.5 +201 202 0.833333 +203 301 1.16667 +203 302 0.833333 +203 303 0.333333 +203 316 0.333333 +203 317 0.333333 +205 206 1.0 +207 208 0.5 +207 209 0.5 +207 1477 0.5 +207 1478 0.5 +208 209 0.5 +210 211 0.5 +210 212 0.5 +211 212 0.5 +213 214 0.5 +213 215 0.5 +214 215 0.5 +216 217 1.08333 +216 218 1.66667 +216 219 0.5 +216 220 1.5 +216 221 0.25 +216 222 0.25 +216 223 0.5 +216 224 0.583333 +216 251 0.25 +216 252 0.5 +216 345 0.583333 +216 346 0.916667 +216 347 0.583333 +216 516 0.333333 +216 788 0.333333 +216 1041 0.333333 +216 1452 1.0 +217 218 1.08333 +217 251 0.25 +217 252 0.25 +218 219 0.25 +218 220 0.25 +218 224 0.583333 +218 251 0.25 +218 252 0.25 +218 1041 0.333333 +219 220 0.5 +219 221 0.583333 +219 222 1.75 +219 224 0.25 +219 343 2.47619 +219 473 0.5 +219 697 0.142857 +219 1145 2.14286 +219 1282 0.333333 +219 1283 0.333333 +219 1394 0.142857 +219 1395 0.142857 +219 1396 0.142857 +219 1397 0.142857 +219 1560 0.333333 +219 1561 0.333333 +220 221 0.25 +220 222 0.25 +220 224 0.25 +221 222 0.25 +221 343 0.333333 +221 1145 0.333333 +222 473 0.5 +224 1041 0.333333 +225 516 0.25 +225 517 0.25 +226 227 1.0 +227 1074 1.0 +228 229 1.33333 +228 230 0.333333 +228 231 0.333333 +229 230 0.333333 +229 231 0.333333 +230 231 0.333333 +233 234 0.5 +233 235 0.5 +234 235 0.5 +237 238 1.0 +239 240 1.0 +239 241 1.0 +239 1500 0.25 +239 1501 0.25 +239 1502 0.25 +239 1503 0.25 +242 243 1.0 +243 927 1.25 +243 1518 0.25 +243 1519 0.25 +243 1520 0.25 +244 245 3.5 +244 246 1.0 +244 247 1.0 +244 435 1.0 +244 513 0.5 +244 1230 1.0 +245 435 1.0 +245 513 0.5 +247 415 0.333333 +247 1124 0.333333 +247 1125 0.333333 +248 249 0.5 +248 250 0.5 +249 250 0.5 +251 252 0.25 +252 345 0.25 +252 346 0.25 +252 347 0.25 +254 255 1.0 +254 256 0.5 +254 1000 0.5 +255 256 0.5 +255 1000 0.5 +258 259 1.33333 +258 1166 0.333333 +258 1167 0.333333 +259 1166 0.333333 +259 1167 0.333333 +260 261 1.0 +262 263 0.142857 +262 264 0.142857 +262 265 0.142857 +262 266 0.142857 +262 267 0.142857 +262 268 0.142857 +262 269 0.142857 +263 264 0.142857 +263 265 0.67619 +263 266 0.67619 +263 267 0.142857 +263 268 0.67619 +263 269 0.142857 +263 944 0.2 +263 945 0.2 +264 265 0.142857 +264 266 0.142857 +264 267 0.142857 +264 268 0.142857 +264 269 0.142857 +265 266 0.92619 +265 267 0.142857 +265 268 0.92619 +265 269 0.142857 +265 307 0.25 +265 908 0.25 +265 944 0.2 +265 945 0.2 +266 267 0.142857 +266 268 0.92619 +266 269 0.142857 +266 307 0.25 +266 908 0.25 +266 944 0.2 +266 945 0.2 +267 268 0.142857 +267 269 0.142857 +268 269 0.142857 +268 307 0.25 +268 908 0.25 +268 944 0.2 +268 945 0.2 +270 271 1.0 +273 274 0.5 +273 275 0.5 +274 275 0.5 +275 606 0.333333 +275 607 0.333333 +275 608 0.333333 +276 277 0.5 +276 278 0.5 +277 278 1.0 +277 401 0.166667 +277 402 0.166667 +277 403 0.5 +277 404 0.166667 +277 405 0.166667 +277 595 0.333333 +278 401 0.166667 +278 402 0.166667 +278 403 0.5 +278 404 0.166667 +278 405 0.166667 +278 595 0.333333 +279 280 0.166667 +279 281 0.166667 +279 282 0.166667 +279 283 0.166667 +279 284 0.166667 +279 285 0.166667 +280 281 0.166667 +280 282 0.166667 +280 283 0.166667 +280 284 0.166667 +280 285 0.166667 +281 282 0.166667 +281 283 3.16667 +281 284 0.166667 +281 285 0.166667 +281 574 2.5 +281 575 0.5 +281 576 0.5 +281 1081 2.0 +281 1178 0.833333 +281 1342 0.333333 +281 1343 0.5 +281 1344 0.5 +281 1451 0.5 +282 283 0.166667 +282 284 0.166667 +282 285 0.166667 +282 450 1.0 +283 284 0.166667 +283 285 0.166667 +283 574 0.5 +283 1451 0.5 +284 285 0.166667 +286 287 0.5 +286 288 1.0 +286 289 0.5 +287 288 0.5 +288 289 0.5 +290 291 0.5 +290 292 0.5 +291 292 0.5 +293 294 2.1 +293 742 0.9 +293 743 0.9 +293 744 0.7 +293 931 0.4 +293 932 0.4 +293 1278 0.2 +293 1368 0.2 +293 1369 0.2 +294 742 1.9 +294 743 1.4 +294 744 2.7 +294 746 0.333333 +294 860 0.2 +294 931 0.4 +294 932 0.4 +294 1028 0.333333 +294 1029 0.333333 +294 1278 0.7 +294 1368 0.2 +294 1369 0.2 +294 1464 0.2 +294 1465 0.2 +294 1466 0.2 +294 1467 0.2 +294 1553 0.333333 +294 1554 0.333333 +294 1555 0.333333 +296 297 1.0 +296 298 0.333333 +296 299 0.333333 +296 300 1.33333 +298 299 0.333333 +298 300 0.333333 +299 300 0.333333 +300 973 1.0 +300 1497 1.0 +301 302 1.33333 +301 303 0.333333 +301 304 0.5 +301 316 0.583333 +301 317 0.333333 +301 463 0.5 +301 638 0.75 +301 639 0.25 +302 303 0.333333 +302 304 0.5 +302 1182 1.0 +303 499 1.0 +303 1026 0.333333 +303 1416 0.333333 +303 1417 0.333333 +305 306 0.25 +305 307 0.25 +305 308 0.583333 +305 309 0.333333 +306 307 0.25 +306 308 0.25 +307 308 0.25 +307 590 1.0 +307 908 0.25 +308 309 2.33333 +308 1039 0.5 +308 1040 1.5 +308 1549 1.0 +309 371 0.5 +309 490 1.5 +309 491 0.5 +309 493 0.5 +311 312 1.0 +313 314 0.5 +313 315 0.5 +314 315 0.5 +314 1398 1.0 +316 317 0.333333 +316 638 0.25 +316 639 0.25 +318 319 1.0 +319 421 1.0 +320 321 0.833333 +320 322 0.333333 +320 323 0.666667 +320 324 0.333333 +320 325 0.333333 +320 1270 0.5 +321 322 0.333333 +321 323 0.333333 +321 1270 0.5 +322 323 0.333333 +323 324 0.333333 +323 325 0.333333 +324 325 0.333333 +326 327 0.333333 +326 328 0.333333 +326 329 0.333333 +327 328 1.16667 +327 329 0.333333 +327 402 2.16667 +327 416 3.5 +327 417 1.0 +327 596 0.5 +327 894 0.333333 +327 1189 0.5 +327 1404 0.166667 +327 1405 0.166667 +327 1406 0.166667 +327 1407 0.166667 +327 1408 0.166667 +328 329 0.333333 +328 402 0.333333 +328 416 0.333333 +328 1189 0.5 +329 547 1.5 +329 1389 1.5 +330 331 0.5 +330 1214 0.25 +330 1215 0.25 +330 1216 0.25 +330 1217 0.25 +332 333 0.333333 +332 334 0.333333 +332 335 0.333333 +333 334 0.333333 +333 335 0.333333 +334 335 0.333333 +336 337 1.0 +337 631 0.2 +337 1570 0.2 +337 1571 0.2 +337 1572 0.2 +337 1573 0.2 +338 339 0.333333 +338 340 0.333333 +338 341 0.333333 +339 340 0.333333 +339 341 1.33333 +340 341 0.333333 +342 343 0.5 +342 344 0.5 +342 692 1.0 +343 344 0.5 +343 697 0.142857 +343 1145 1.47619 +343 1394 0.142857 +343 1395 0.142857 +343 1396 0.142857 +343 1397 0.142857 +345 346 0.583333 +345 347 0.583333 +346 347 0.583333 +346 516 0.333333 +346 788 0.333333 +348 349 0.2 +348 350 0.2 +348 351 0.2 +348 352 0.2 +348 353 0.2 +349 350 0.2 +349 351 0.2 +349 352 0.2 +349 353 0.2 +350 351 0.2 +350 352 0.2 +350 353 0.2 +350 686 1.0 +351 352 0.2 +351 353 0.2 +352 353 0.2 +354 355 0.5 +354 356 0.5 +355 356 0.5 +357 358 0.833333 +357 359 0.5 +357 360 0.333333 +357 361 0.333333 +358 359 0.5 +358 360 0.333333 +358 361 0.333333 +360 361 0.333333 +362 363 1.0 +362 364 0.5 +362 365 0.5 +362 805 0.2 +362 806 0.2 +362 807 0.2 +362 1071 0.2 +362 1349 0.25 +362 1350 0.25 +362 1351 0.25 +362 1352 0.25 +364 365 0.5 +366 367 0.5 +366 368 0.5 +367 368 0.5 +370 371 0.5 +371 759 0.5 +371 866 0.5 +371 867 0.5 +372 373 0.5 +372 374 0.5 +373 374 0.5 +375 376 1.91667 +375 377 2.91667 +375 378 0.333333 +375 1263 0.333333 +375 1295 0.25 +376 377 1.91667 +376 378 0.333333 +376 1263 0.333333 +376 1295 0.25 +377 378 0.333333 +377 1263 0.333333 +377 1295 0.25 +377 1347 0.5 +377 1348 0.5 +379 380 0.5 +379 381 0.5 +380 381 0.5 +382 383 0.5 +382 384 0.5 +383 384 0.5 +385 386 0.142857 +385 387 0.142857 +385 388 0.142857 +385 389 0.142857 +385 390 0.142857 +385 391 0.142857 +385 392 0.142857 +386 387 0.142857 +386 388 0.142857 +386 389 0.142857 +386 390 0.142857 +386 391 0.142857 +386 392 0.142857 +387 388 0.142857 +387 389 0.142857 +387 390 0.142857 +387 391 0.142857 +387 392 0.142857 +388 389 0.142857 +388 390 0.142857 +388 391 0.142857 +388 392 0.142857 +389 390 0.142857 +389 391 0.142857 +389 392 0.142857 +390 391 0.142857 +390 392 0.142857 +391 392 0.142857 +393 394 0.333333 +393 395 0.333333 +393 396 0.333333 +394 395 0.333333 +394 396 0.333333 +395 396 0.333333 +397 398 0.333333 +397 399 0.333333 +397 400 0.333333 +398 399 0.333333 +398 400 0.333333 +399 400 0.333333 +401 402 0.166667 +401 403 0.166667 +401 404 0.166667 +401 405 0.166667 +402 403 0.166667 +402 404 0.166667 +402 405 0.166667 +402 416 0.833333 +402 417 1.0 +402 894 0.333333 +403 404 0.166667 +403 405 0.166667 +403 595 0.333333 +404 405 0.166667 +408 409 0.25 +408 410 0.583333 +408 411 0.25 +408 412 0.583333 +408 413 0.333333 +409 410 0.25 +409 411 0.25 +409 412 0.25 +410 411 0.25 +410 412 0.583333 +410 413 0.333333 +411 412 0.25 +412 413 0.333333 +414 415 1.0 +415 922 1.0 +415 1124 0.333333 +415 1125 0.333333 +415 1233 0.5 +415 1234 0.5 +416 596 0.5 +416 1404 0.166667 +416 1405 0.166667 +416 1406 0.166667 +416 1407 0.166667 +416 1408 0.166667 +418 419 1.0 +422 423 0.5 +422 424 0.5 +423 424 0.5 +425 426 0.5 +425 427 0.5 +426 427 0.5 +428 429 1.0 +428 1361 0.333333 +428 1362 0.333333 +430 431 1.0 +430 432 1.0 +433 434 1.0 +436 437 0.5 +436 438 0.5 +437 438 0.5 +439 440 1.0 +439 441 0.5 +442 443 1.0 +443 675 0.5 +443 676 0.5 +443 738 0.5 +443 739 1.0 +444 445 1.0 +445 699 1.0 +446 447 0.333333 +446 448 0.333333 +446 449 0.333333 +447 448 0.333333 +447 449 0.333333 +448 449 0.333333 +452 453 0.142857 +452 454 0.142857 +452 455 0.142857 +452 456 0.142857 +452 457 0.142857 +452 458 0.142857 +452 459 0.142857 +453 454 0.142857 +453 455 0.142857 +453 456 0.142857 +453 457 0.142857 +453 458 0.642857 +453 459 0.642857 +454 455 0.142857 +454 456 0.142857 +454 457 0.142857 +454 458 0.142857 +454 459 0.142857 +455 456 0.142857 +455 457 0.142857 +455 458 0.142857 +455 459 0.142857 +456 457 0.142857 +456 458 0.142857 +456 459 0.142857 +457 458 0.142857 +457 459 0.142857 +458 459 0.642857 +460 461 0.333333 +460 462 0.333333 +460 463 0.333333 +461 462 0.333333 +461 463 0.333333 +462 463 0.333333 +463 638 0.5 +464 465 1.5 +464 466 0.5 +465 466 0.5 +467 468 0.25 +467 469 0.25 +467 470 0.25 +467 471 0.25 +468 469 0.25 +468 470 0.25 +468 471 0.25 +469 470 0.25 +469 471 0.25 +470 471 0.25 +472 473 0.833333 +472 474 0.5 +472 984 0.333333 +472 1091 0.333333 +473 474 0.5 +473 984 2.16667 +473 985 0.333333 +473 1091 0.333333 +473 1092 0.833333 +475 476 1.0 +475 477 0.5 +475 478 0.5 +477 478 0.5 +478 940 1.0 +479 480 0.333333 +479 481 0.333333 +479 482 0.333333 +480 481 0.333333 +480 482 0.333333 +481 482 0.333333 +481 1235 0.5 +481 1236 0.5 +481 1250 0.5 +481 1251 0.5 +482 1046 1.0 +482 1244 0.25 +482 1245 0.25 +482 1246 0.25 +482 1247 0.25 +482 1455 1.0 +483 484 1.0 +486 487 1.0 +488 489 0.333333 +490 491 0.5 +490 492 1.0 +490 493 0.5 +494 495 0.5 +494 496 0.5 +495 496 0.5 +496 780 0.5 +496 781 0.5 +496 1409 0.5 +496 1410 0.5 +497 498 1.0 +500 501 1.0 +500 502 2.5 +500 503 1.5 +500 1221 0.5 +501 502 1.0 +502 503 0.5 +505 506 1.0 +507 508 1.08333 +507 509 0.75 +508 509 0.75 +511 512 1.0 +514 515 0.833333 +514 516 0.833333 +514 517 0.333333 +515 516 2.33333 +515 517 0.333333 +515 674 0.5 +516 517 2.91667 +516 674 0.5 +516 788 0.333333 +516 1086 0.5 +516 1087 2.5 +516 1088 1.0 +516 1089 0.5 +517 963 0.333333 +517 964 0.333333 +517 1341 1.0 +517 1460 0.333333 +518 519 1.0 +520 521 1.0 +522 523 0.25 +522 524 0.25 +522 525 0.25 +522 526 0.25 +522 527 2.0 +522 1381 0.5 +522 1588 0.5 +523 524 0.25 +523 525 0.25 +523 526 0.25 +523 742 0.333333 +523 746 0.333333 +523 1356 0.333333 +524 525 0.25 +524 526 0.25 +524 1322 1.0 +525 526 0.25 +528 529 1.0 +530 531 0.533333 +530 532 0.533333 +530 533 0.333333 +530 1533 0.2 +530 1534 0.2 +530 1535 0.2 +531 532 0.533333 +531 533 0.333333 +531 1533 0.2 +531 1534 0.2 +531 1535 0.2 +532 533 0.333333 +532 1533 0.2 +532 1534 0.2 +532 1535 0.2 +534 535 1.0 +537 538 0.5 +537 539 0.833333 +537 540 0.333333 +537 541 0.333333 +537 542 0.333333 +537 689 0.333333 +537 690 0.333333 +538 539 0.5 +539 689 0.333333 +539 690 0.333333 +540 541 0.333333 +540 542 0.333333 +541 542 0.333333 +544 545 1.0 +546 547 1.0 +547 1239 1.0 +547 1389 0.5 +548 549 0.333333 +548 550 0.333333 +549 550 0.333333 +550 1030 0.5 +552 553 0.5 +552 554 0.5 +553 554 0.5 +556 557 0.5 +556 558 0.5 +557 558 0.5 +559 560 1.0 +561 562 0.458333 +563 564 0.333333 +563 565 0.333333 +563 566 0.333333 +564 565 0.333333 +564 566 0.333333 +565 566 0.333333 +567 650 0.333333 +567 651 0.333333 +568 569 1.0 +570 571 1.0 +572 573 1.0 +574 575 0.5 +574 576 0.5 +577 578 1.0 +580 581 0.5 +580 582 0.5 +581 582 0.5 +583 584 1.0 +585 586 0.333333 +585 587 0.333333 +586 587 0.333333 +587 729 0.5 +589 590 0.583333 +589 591 0.583333 +589 592 0.333333 +589 1180 0.25 +589 1181 0.25 +590 591 1.58333 +590 592 0.333333 +590 1180 0.25 +590 1181 0.25 +591 592 0.333333 +591 1180 0.25 +591 1181 0.25 +593 594 1.0 +597 598 1.0 +597 789 1.0 +597 790 1.0 +599 600 1.0 +602 603 1.0 +606 607 0.333333 +606 608 0.333333 +607 608 0.333333 +609 610 0.5 +609 611 0.333333 +609 612 0.333333 +611 612 0.333333 +614 615 1.0 +616 617 1.0 +618 619 0.5 +618 620 0.5 +619 620 0.5 +621 622 1.0 +623 624 1.0 +625 626 0.333333 +625 627 0.333333 +625 628 0.333333 +626 627 0.333333 +626 628 0.333333 +627 628 0.333333 +629 630 0.5 +629 631 0.5 +630 631 1.0 +630 1579 0.5 +631 783 1.0 +631 784 0.5 +631 1570 0.2 +631 1571 0.2 +631 1572 0.2 +631 1573 0.2 +631 1574 0.5 +631 1579 0.5 +632 633 1.0 +635 636 0.5 +635 637 0.5 +636 637 0.5 +638 639 0.25 +638 640 1.0 +642 643 1.0 +642 712 0.5 +642 713 0.5 +645 1429 0.0526316 +645 1430 0.0526316 +645 1431 0.0526316 +645 1432 0.0526316 +645 1433 0.0526316 +645 1434 0.0526316 +645 1435 0.0526316 +645 1436 0.0526316 +645 1437 0.0526316 +645 1438 0.0526316 +645 1439 0.0526316 +645 1440 0.0526316 +645 1441 0.0526316 +645 1442 0.0526316 +645 1443 0.0526316 +645 1444 0.0526316 +645 1445 0.0526316 +645 1446 0.0526316 +645 1447 0.0526316 +646 853 0.5 +647 648 1.0 +650 651 0.333333 +652 653 0.333333 +652 654 2.08333 +652 655 2.08333 +652 656 0.333333 +652 657 0.583333 +652 893 0.333333 +653 654 0.333333 +653 655 0.333333 +654 655 2.08333 +654 656 0.333333 +654 657 0.916667 +654 774 0.333333 +654 863 0.5 +654 864 0.5 +654 865 0.5 +654 893 0.666667 +654 1130 0.833333 +655 656 0.333333 +655 657 0.583333 +655 893 0.333333 +657 774 0.333333 +657 1130 0.333333 +658 659 0.333333 +658 660 0.333333 +658 661 0.333333 +659 660 0.333333 +659 661 0.333333 +660 661 0.333333 +662 663 0.75 +662 664 0.25 +662 665 0.25 +662 666 0.25 +662 677 0.5 +662 792 0.333333 +662 793 0.333333 +662 794 0.333333 +663 664 0.25 +663 665 0.25 +663 666 0.25 +663 677 0.5 +664 665 0.25 +664 666 0.25 +665 666 0.25 +667 668 1.0 +669 670 1.0 +669 671 1.0 +670 721 1.0 +672 673 1.0 +675 676 0.5 +676 1556 0.333333 +676 1557 0.333333 +676 1558 0.333333 +678 679 0.5 +678 680 0.5 +679 680 0.5 +681 682 0.333333 +681 683 0.333333 +681 684 0.333333 +682 683 0.333333 +682 684 0.333333 +683 684 0.333333 +689 690 0.333333 +693 694 0.2 +693 695 0.2 +693 696 0.2 +693 697 1.2 +693 698 0.2 +694 695 0.2 +694 696 0.2 +694 697 0.2 +694 698 0.2 +695 696 0.2 +695 697 0.2 +695 698 0.2 +695 715 0.25 +695 716 0.25 +695 717 0.25 +695 718 0.25 +696 697 0.2 +696 698 0.2 +697 698 0.2 +697 1145 0.142857 +697 1394 0.142857 +697 1395 0.142857 +697 1396 0.142857 +697 1397 0.142857 +700 701 0.333333 +700 702 0.333333 +701 702 0.333333 +704 705 0.333333 +704 706 0.333333 +704 707 0.333333 +705 706 0.333333 +705 707 0.333333 +706 707 0.333333 +709 710 0.333333 +712 713 0.5 +715 716 0.25 +715 717 0.25 +715 718 0.25 +716 717 0.25 +716 718 0.25 +717 718 0.25 +719 720 2.0 +719 752 0.5 +719 753 0.5 +721 1346 1.0 +721 1454 1.0 +723 724 0.333333 +723 725 0.333333 +723 726 0.333333 +724 725 0.333333 +724 726 0.333333 +725 726 0.333333 +730 731 1.0 +732 733 0.5 +732 734 0.5 +733 734 0.5 +736 737 0.5 +742 743 1.4 +742 744 1.2 +742 745 1.0 +742 746 2.33333 +742 931 0.7 +742 932 0.7 +742 1278 0.2 +742 1356 0.333333 +743 744 0.7 +743 931 0.2 +743 932 0.2 +743 1278 0.2 +744 1278 0.7 +744 1279 0.333333 +744 1280 0.333333 +744 1281 0.333333 +746 1028 0.333333 +746 1029 0.333333 +746 1356 0.333333 +747 748 1.0 +750 751 1.0 +752 753 0.5 +754 755 1.0 +756 757 0.5 +756 758 0.5 +756 759 1.0 +756 760 1.5 +756 761 1.86667 +756 762 0.333333 +756 763 0.333333 +756 764 0.533333 +756 765 0.533333 +756 775 0.2 +756 892 0.2 +756 1123 0.5 +757 758 1.25 +757 977 0.25 +758 977 0.25 +761 762 0.666667 +761 763 0.666667 +761 764 0.533333 +761 765 0.533333 +761 774 1.33333 +761 775 1.53333 +761 776 0.333333 +761 892 0.2 +762 763 0.666667 +764 765 0.866667 +764 775 0.2 +764 892 0.2 +764 1255 0.833333 +765 775 0.2 +765 892 0.2 +765 1255 0.333333 +766 767 0.333333 +766 768 0.333333 +766 769 0.333333 +767 768 0.333333 +767 769 0.333333 +768 769 0.333333 +770 771 0.2 +770 772 0.2 +770 773 0.2 +771 772 0.2 +771 773 0.2 +772 773 0.2 +774 775 1.33333 +774 776 0.333333 +774 1130 0.333333 +775 776 0.333333 +775 892 0.2 +777 778 1.0 +780 781 0.5 +783 784 0.5 +783 1574 0.5 +785 786 0.5 +785 787 0.5 +786 787 0.5 +789 790 1.0 +792 793 0.333333 +792 794 0.333333 +793 794 0.333333 +795 796 0.25 +795 797 0.25 +795 798 0.25 +796 797 0.25 +796 798 0.25 +797 798 0.25 +799 800 0.2 +799 801 0.2 +799 802 0.2 +799 803 0.2 +799 804 0.2 +800 801 0.2 +800 802 0.2 +800 803 0.2 +800 804 0.2 +801 802 0.2 +801 803 0.2 +801 804 0.2 +802 803 0.2 +802 804 0.2 +803 804 0.2 +805 806 0.92619 +805 807 0.92619 +805 808 0.25 +805 1070 0.142857 +805 1071 0.342857 +805 1072 0.142857 +805 1073 0.142857 +806 807 0.92619 +806 808 0.25 +806 1016 0.333333 +806 1070 0.142857 +806 1071 0.67619 +806 1072 0.142857 +806 1073 0.142857 +807 808 0.25 +807 1070 0.142857 +807 1071 0.342857 +807 1072 0.142857 +807 1073 0.142857 +809 810 1.0 +812 813 1.0 +814 815 0.5 +814 816 0.5 +815 816 0.5 +817 818 1.0 +819 820 1.0 +820 1170 1.0 +821 822 0.333333 +821 823 0.333333 +821 824 0.333333 +822 823 0.333333 +822 824 0.333333 +823 824 0.333333 +825 826 0.111111 +825 827 0.111111 +825 828 0.111111 +825 829 0.111111 +825 830 0.111111 +825 831 0.111111 +825 832 0.111111 +825 833 0.111111 +825 834 0.111111 +826 827 0.111111 +826 828 0.111111 +826 829 0.111111 +826 830 0.111111 +826 831 0.111111 +826 832 0.111111 +826 833 0.111111 +826 834 0.111111 +827 828 0.111111 +827 829 0.111111 +827 830 0.111111 +827 831 0.111111 +827 832 0.111111 +827 833 0.111111 +827 834 0.111111 +828 829 0.111111 +828 830 0.111111 +828 831 0.111111 +828 832 0.111111 +828 833 0.111111 +828 834 0.111111 +829 830 0.111111 +829 831 0.111111 +829 832 0.111111 +829 833 0.111111 +829 834 0.111111 +830 831 0.111111 +830 832 0.111111 +830 833 0.111111 +830 834 0.111111 +831 832 0.111111 +831 833 0.111111 +831 834 0.111111 +832 833 0.111111 +832 834 0.111111 +833 834 0.111111 +835 836 0.5 +835 837 0.5 +836 837 0.5 +840 1190 0.2 +840 1191 0.2 +841 842 1.5 +841 843 0.5 +842 843 0.5 +843 1273 0.75 +843 1274 0.75 +843 1275 0.25 +843 1276 0.25 +843 1536 1.0 +844 845 0.333333 +844 846 0.333333 +844 847 0.333333 +845 846 0.333333 +845 847 0.333333 +846 847 0.333333 +848 849 1.0 +850 851 0.5 +850 852 0.5 +851 852 0.5 +855 856 0.5 +855 857 0.5 +856 857 0.5 +860 861 0.5 +860 862 0.5 +860 1464 0.2 +860 1465 0.2 +860 1466 0.2 +860 1467 0.2 +861 862 0.5 +863 864 0.5 +866 867 0.5 +870 871 0.25 +870 872 0.25 +870 873 0.25 +870 874 0.25 +871 872 0.25 +871 873 0.25 +871 874 0.25 +872 873 0.25 +872 874 0.25 +872 1268 1.0 +873 874 0.25 +877 878 0.25 +877 879 0.25 +877 880 0.25 +877 881 0.25 +878 879 0.25 +878 880 0.25 +878 881 0.25 +879 880 0.25 +879 881 0.25 +880 881 0.25 +882 1339 1.0 +883 884 0.5 +883 885 0.5 +884 885 0.5 +886 887 1.0 +888 889 0.5 +888 890 0.5 +889 890 0.5 +895 896 0.25 +895 897 0.25 +895 898 0.25 +895 899 0.25 +896 897 0.25 +896 898 0.25 +896 899 0.25 +897 898 0.25 +897 899 0.25 +898 899 0.25 +900 901 0.5 +900 902 0.5 +900 1318 1.0 +901 902 0.5 +903 904 0.5 +903 905 0.5 +904 905 0.5 +906 907 1.0 +909 910 0.5 +909 911 0.5 +910 911 0.5 +912 913 0.2 +912 914 0.2 +912 915 0.2 +912 916 0.2 +912 917 0.2 +913 914 0.342857 +913 915 0.342857 +913 916 0.985714 +913 917 0.2 +913 1000 0.142857 +913 1201 0.785714 +913 1202 0.142857 +913 1203 0.142857 +913 1204 0.142857 +913 1205 0.142857 +913 1206 0.142857 +913 1207 0.142857 +913 1208 0.142857 +914 915 0.342857 +914 916 0.342857 +914 917 0.2 +914 1201 0.142857 +914 1206 0.142857 +914 1207 0.142857 +914 1208 0.142857 +915 916 0.342857 +915 917 0.2 +915 1201 0.142857 +915 1206 0.142857 +915 1207 0.142857 +915 1208 0.142857 +916 917 0.2 +916 1000 0.142857 +916 1201 1.11905 +916 1202 0.142857 +916 1203 0.142857 +916 1204 0.142857 +916 1205 0.142857 +916 1206 0.142857 +916 1207 0.142857 +916 1208 0.142857 +916 1256 0.333333 +916 1257 0.333333 +920 921 1.0 +923 924 0.5 +923 925 0.5 +924 925 0.5 +927 1518 0.25 +927 1519 0.25 +927 1520 0.25 +929 930 1.0 +930 1418 1.0 +931 932 1.9 +931 933 1.0 +931 1175 0.5 +931 1176 0.5 +931 1356 1.0 +931 1368 0.2 +931 1369 0.2 +932 1368 0.2 +932 1369 0.2 +935 936 0.25 +935 937 0.25 +935 938 0.25 +936 937 0.25 +936 938 0.25 +937 938 0.25 +941 942 0.5 +941 943 0.5 +942 943 0.5 +944 945 0.2 +947 948 1.0 +947 1271 0.5 +947 1272 0.5 +949 950 1.0 +951 952 1.16667 +951 953 1.16667 +951 954 0.666667 +952 953 1.16667 +952 954 0.666667 +953 954 0.666667 +955 956 0.5 +956 1135 0.583333 +956 1136 0.25 +956 1137 0.25 +956 1138 0.333333 +957 958 0.5 +957 959 0.5 +958 959 0.5 +960 961 0.5 +960 962 0.5 +961 962 0.5 +963 964 0.333333 +965 966 0.2 +965 967 0.2 +965 968 0.2 +965 969 0.2 +965 970 0.2 +966 967 0.2 +966 968 0.2 +966 969 0.2 +966 970 0.2 +967 968 0.2 +967 969 0.2 +967 970 0.2 +968 969 0.2 +968 970 0.2 +969 970 0.2 +972 973 1.0 +973 989 1.0 +973 1002 0.833333 +973 1003 0.833333 +973 1004 0.333333 +974 975 0.5 +974 976 0.5 +975 976 0.5 +976 1129 1.0 +978 979 1.0 +980 981 0.5 +980 982 0.5 +981 982 0.5 +983 984 1.0 +983 985 0.5 +983 986 0.5 +984 985 0.833333 +984 986 0.5 +984 1091 0.333333 +984 1092 0.833333 +985 1092 0.333333 +987 988 1.0 +992 993 1.0 +994 995 0.25 +994 996 0.25 +994 997 0.25 +994 998 0.25 +995 996 0.25 +995 997 0.25 +995 998 0.25 +996 997 0.25 +996 998 0.25 +997 998 0.25 +999 1000 1.0 +1000 1201 0.142857 +1000 1202 0.142857 +1000 1203 0.142857 +1000 1204 0.142857 +1000 1205 0.142857 +1000 1504 0.5 +1000 1514 0.5 +1002 1003 0.833333 +1002 1004 0.333333 +1003 1004 0.333333 +1006 1007 1.0 +1009 1010 1.0 +1010 1045 1.0 +1011 1012 1.0 +1013 1014 1.0 +1016 1071 0.333333 +1017 1018 1.2 +1017 1306 0.2 +1017 1307 0.2 +1017 1308 0.2 +1017 1309 0.2 +1018 1303 0.5 +1018 1304 0.5 +1018 1305 1.0 +1018 1306 0.2 +1018 1307 0.2 +1018 1308 0.2 +1018 1309 0.2 +1021 1022 0.25 +1021 1023 0.75 +1022 1023 0.25 +1024 1025 0.5 +1026 1027 1.0 +1026 1416 0.333333 +1026 1417 0.333333 +1028 1029 0.333333 +1031 1032 1.0 +1033 1034 1.0 +1035 1036 1.0 +1035 1037 0.5 +1035 1038 0.5 +1037 1038 0.5 +1039 1040 0.5 +1042 1043 0.5 +1042 1044 0.5 +1043 1044 0.5 +1047 1048 0.25 +1047 1049 0.25 +1047 1050 0.25 +1048 1049 0.25 +1048 1050 0.25 +1049 1050 0.25 +1052 1053 1.0 +1054 1055 1.0 +1054 1056 0.333333 +1054 1057 0.333333 +1054 1058 0.333333 +1056 1057 0.333333 +1056 1058 0.333333 +1057 1058 0.333333 +1060 1061 0.111111 +1060 1062 0.111111 +1060 1063 0.111111 +1060 1064 0.111111 +1060 1065 0.111111 +1060 1066 0.111111 +1060 1067 0.111111 +1060 1068 0.111111 +1060 1069 0.111111 +1060 1412 1.0 +1061 1062 0.111111 +1061 1063 0.111111 +1061 1064 0.111111 +1061 1065 0.111111 +1061 1066 0.111111 +1061 1067 0.111111 +1061 1068 0.111111 +1061 1069 0.111111 +1062 1063 0.111111 +1062 1064 0.111111 +1062 1065 0.111111 +1062 1066 0.111111 +1062 1067 0.111111 +1062 1068 0.111111 +1062 1069 0.111111 +1063 1064 0.111111 +1063 1065 0.111111 +1063 1066 0.111111 +1063 1067 0.111111 +1063 1068 0.111111 +1063 1069 0.111111 +1064 1065 0.111111 +1064 1066 0.111111 +1064 1067 0.111111 +1064 1068 0.111111 +1064 1069 0.111111 +1065 1066 0.111111 +1065 1067 0.111111 +1065 1068 0.111111 +1065 1069 0.111111 +1066 1067 0.111111 +1066 1068 0.111111 +1066 1069 0.111111 +1067 1068 0.111111 +1067 1069 0.111111 +1068 1069 0.111111 +1070 1071 0.142857 +1070 1072 0.142857 +1070 1073 0.142857 +1071 1072 0.142857 +1071 1073 0.142857 +1072 1073 0.142857 +1078 1079 1.0 +1082 1083 0.5 +1086 1087 0.5 +1087 1088 0.5 +1087 1089 0.5 +1093 1094 0.333333 +1093 1095 0.333333 +1093 1096 0.333333 +1094 1095 0.333333 +1094 1096 0.333333 +1095 1096 0.333333 +1097 1098 0.5 +1097 1099 0.5 +1098 1099 0.5 +1101 1102 0.5 +1101 1103 0.5 +1102 1103 0.5 +1105 1106 0.125 +1105 1107 0.125 +1105 1108 0.125 +1105 1109 0.125 +1105 1110 0.125 +1105 1111 0.125 +1105 1112 0.125 +1105 1113 0.125 +1106 1107 0.125 +1106 1108 0.125 +1106 1109 0.125 +1106 1110 0.125 +1106 1111 0.125 +1106 1112 0.125 +1106 1113 0.125 +1107 1108 0.125 +1107 1109 0.125 +1107 1110 0.125 +1107 1111 0.125 +1107 1112 0.125 +1107 1113 0.125 +1107 1357 0.333333 +1107 1358 0.333333 +1107 1411 0.333333 +1108 1109 0.125 +1108 1110 0.125 +1108 1111 0.125 +1108 1112 0.125 +1108 1113 0.125 +1109 1110 0.125 +1109 1111 0.125 +1109 1112 0.125 +1109 1113 0.125 +1110 1111 0.125 +1110 1112 0.125 +1110 1113 0.125 +1111 1112 0.125 +1111 1113 0.125 +1112 1113 0.125 +1114 1115 1.0 +1116 1117 0.25 +1116 1118 0.25 +1116 1119 0.25 +1116 1120 0.25 +1117 1118 0.25 +1117 1119 0.25 +1117 1120 0.25 +1118 1119 0.25 +1118 1120 0.25 +1119 1120 0.25 +1120 1515 0.333333 +1120 1516 0.333333 +1120 1517 0.333333 +1121 1122 0.5 +1124 1125 0.333333 +1127 1128 1.0 +1131 1132 1.0 +1133 1134 1.0 +1135 1136 0.25 +1135 1137 0.25 +1135 1138 0.333333 +1136 1137 0.25 +1139 1140 1.0 +1141 1142 1.0 +1142 1488 0.5 +1142 1489 0.5 +1145 1282 0.333333 +1145 1283 0.333333 +1145 1394 0.142857 +1145 1395 0.142857 +1145 1396 0.142857 +1145 1397 0.142857 +1145 1560 0.333333 +1145 1561 0.333333 +1146 1147 0.25 +1146 1148 0.25 +1146 1149 0.25 +1146 1150 0.25 +1147 1148 0.25 +1147 1149 0.25 +1147 1150 0.25 +1148 1149 0.25 +1148 1150 0.25 +1149 1150 0.25 +1152 1153 0.125 +1152 1154 0.125 +1152 1155 0.125 +1152 1156 0.125 +1152 1157 0.125 +1152 1158 0.125 +1152 1159 0.125 +1152 1160 0.125 +1153 1154 0.125 +1153 1155 0.125 +1153 1156 0.125 +1153 1157 0.125 +1153 1158 0.125 +1153 1159 0.125 +1153 1160 0.125 +1154 1155 0.125 +1154 1156 0.125 +1154 1157 0.125 +1154 1158 0.125 +1154 1159 0.125 +1154 1160 0.125 +1155 1156 0.125 +1155 1157 0.125 +1155 1158 0.125 +1155 1159 0.125 +1155 1160 0.125 +1156 1157 0.125 +1156 1158 0.125 +1156 1159 0.125 +1156 1160 0.125 +1157 1158 0.125 +1157 1159 0.125 +1157 1160 0.125 +1158 1159 0.125 +1158 1160 0.125 +1159 1160 0.125 +1162 1163 0.5 +1162 1413 0.25 +1162 1414 0.25 +1162 1415 0.25 +1164 1165 1.0 +1166 1167 0.333333 +1168 1169 1.0 +1175 1176 0.5 +1178 1342 0.333333 +1180 1181 0.25 +1184 1185 0.5 +1184 1186 0.5 +1185 1186 0.5 +1190 1191 0.2 +1193 1194 1.0 +1195 1196 0.333333 +1195 1197 0.333333 +1196 1197 0.333333 +1198 1199 0.5 +1198 1200 0.5 +1199 1200 0.5 +1201 1202 0.142857 +1201 1203 0.142857 +1201 1204 0.142857 +1201 1205 0.142857 +1201 1206 0.142857 +1201 1207 0.142857 +1201 1208 0.142857 +1201 1256 0.333333 +1201 1257 0.333333 +1202 1203 0.142857 +1202 1204 0.142857 +1202 1205 0.142857 +1203 1204 0.142857 +1203 1205 0.142857 +1204 1205 0.142857 +1206 1207 0.142857 +1206 1208 0.142857 +1207 1208 0.142857 +1209 1210 0.333333 +1209 1211 0.333333 +1209 1212 0.333333 +1210 1211 0.333333 +1210 1212 0.333333 +1211 1212 0.333333 +1214 1215 0.25 +1214 1216 0.25 +1214 1217 0.25 +1215 1216 0.25 +1215 1217 0.25 +1216 1217 0.25 +1218 1219 1.0 +1222 1223 0.5 +1222 1224 0.5 +1223 1224 0.5 +1225 1226 1.0 +1225 1227 1.0 +1225 1345 1.0 +1228 1229 0.25 +1231 1232 1.0 +1233 1234 0.5 +1235 1236 0.5 +1237 1238 1.0 +1240 1241 1.0 +1242 1243 1.0 +1244 1245 0.25 +1244 1246 0.25 +1244 1247 0.25 +1245 1246 0.25 +1245 1247 0.25 +1246 1247 0.25 +1248 1249 1.0 +1250 1251 0.5 +1252 1253 0.5 +1252 1254 1.5 +1253 1254 0.5 +1256 1257 0.333333 +1258 1259 1.0 +1260 1261 0.5 +1260 1262 0.5 +1261 1262 0.5 +1264 1265 0.333333 +1264 1266 0.333333 +1264 1267 0.333333 +1265 1266 0.333333 +1265 1267 0.333333 +1266 1267 0.333333 +1271 1272 0.5 +1273 1274 0.75 +1273 1275 0.25 +1273 1276 0.25 +1274 1275 0.25 +1274 1276 0.25 +1275 1276 0.25 +1279 1280 0.333333 +1279 1281 0.333333 +1280 1281 0.333333 +1282 1283 0.333333 +1286 1287 0.25 +1286 1288 0.25 +1286 1289 0.25 +1286 1290 0.25 +1286 1364 0.25 +1286 1365 0.25 +1286 1366 0.25 +1286 1367 0.25 +1287 1288 0.25 +1287 1289 0.25 +1287 1290 0.25 +1288 1289 0.25 +1288 1290 0.25 +1289 1290 0.25 +1292 1293 0.5 +1292 1294 0.5 +1293 1294 0.5 +1294 1377 0.5 +1294 1378 0.5 +1298 1299 1.0 +1303 1304 0.5 +1306 1307 0.2 +1306 1308 0.2 +1306 1309 0.2 +1307 1308 0.2 +1307 1309 0.2 +1308 1309 0.2 +1310 1311 1.0 +1312 1313 0.25 +1312 1314 0.25 +1312 1315 0.25 +1312 1316 0.25 +1313 1314 0.25 +1313 1315 0.25 +1313 1316 0.25 +1314 1315 0.25 +1314 1316 0.25 +1315 1316 0.25 +1315 1468 0.25 +1315 1469 0.25 +1315 1470 0.25 +1320 1321 1.0 +1323 1324 0.5 +1323 1325 0.5 +1324 1325 0.5 +1326 1327 1.0 +1328 1329 1.0 +1331 1332 0.5 +1331 1333 0.5 +1332 1333 0.5 +1335 1336 0.333333 +1335 1337 0.333333 +1335 1338 0.333333 +1336 1337 0.333333 +1336 1338 0.333333 +1336 1419 1.0 +1337 1338 0.333333 +1343 1344 0.5 +1347 1348 0.5 +1349 1350 0.25 +1349 1351 0.25 +1349 1352 0.25 +1350 1351 0.25 +1350 1352 0.25 +1351 1352 0.25 +1354 1355 1.0 +1356 1357 1.0 +1356 1358 1.0 +1356 1359 1.0 +1357 1358 2.33333 +1357 1411 0.333333 +1358 1411 0.333333 +1360 1453 1.0 +1361 1362 0.333333 +1364 1365 0.25 +1364 1366 0.25 +1364 1367 0.25 +1365 1366 0.25 +1365 1367 0.25 +1366 1367 0.25 +1368 1369 0.2 +1370 1371 1.0 +1372 1373 1.0 +1374 1375 0.5 +1374 1376 0.5 +1375 1376 0.5 +1377 1378 0.5 +1384 1385 0.5 +1386 1387 1.0 +1390 1391 0.5 +1390 1392 0.5 +1391 1392 0.5 +1394 1395 0.142857 +1394 1396 0.142857 +1394 1397 0.142857 +1395 1396 0.142857 +1395 1397 0.142857 +1396 1397 0.142857 +1399 1400 0.25 +1399 1401 0.25 +1399 1402 0.25 +1399 1403 0.25 +1400 1401 0.25 +1400 1402 0.25 +1400 1403 0.25 +1401 1402 0.25 +1401 1403 0.25 +1402 1403 0.25 +1404 1405 0.166667 +1404 1406 0.166667 +1404 1407 0.166667 +1404 1408 0.166667 +1405 1406 0.166667 +1405 1407 0.166667 +1405 1408 0.166667 +1406 1407 0.166667 +1406 1408 0.166667 +1407 1408 0.166667 +1409 1410 0.5 +1413 1414 0.25 +1413 1415 0.25 +1414 1415 0.25 +1416 1417 0.333333 +1420 1421 0.333333 +1420 1422 0.333333 +1420 1423 0.333333 +1421 1422 0.333333 +1421 1423 0.333333 +1422 1423 0.333333 +1424 1425 0.5 +1426 1427 0.5 +1426 1428 0.5 +1427 1428 0.5 +1429 1430 0.385965 +1429 1431 0.385965 +1429 1432 0.0526316 +1429 1433 0.0526316 +1429 1434 0.0526316 +1429 1435 0.0526316 +1429 1436 0.0526316 +1429 1437 0.0526316 +1429 1438 0.0526316 +1429 1439 0.0526316 +1429 1440 0.0526316 +1429 1441 0.0526316 +1429 1442 0.0526316 +1429 1443 0.0526316 +1429 1444 0.0526316 +1429 1445 0.0526316 +1429 1446 0.0526316 +1429 1447 0.0526316 +1429 1448 0.333333 +1430 1431 0.385965 +1430 1432 0.0526316 +1430 1433 0.0526316 +1430 1434 0.0526316 +1430 1435 0.0526316 +1430 1436 0.0526316 +1430 1437 0.0526316 +1430 1438 0.0526316 +1430 1439 0.0526316 +1430 1440 0.0526316 +1430 1441 0.0526316 +1430 1442 0.0526316 +1430 1443 0.0526316 +1430 1444 0.0526316 +1430 1445 0.0526316 +1430 1446 0.0526316 +1430 1447 0.0526316 +1430 1448 0.333333 +1431 1432 0.0526316 +1431 1433 0.0526316 +1431 1434 0.0526316 +1431 1435 0.0526316 +1431 1436 0.0526316 +1431 1437 0.0526316 +1431 1438 0.0526316 +1431 1439 0.0526316 +1431 1440 0.0526316 +1431 1441 0.0526316 +1431 1442 0.0526316 +1431 1443 0.0526316 +1431 1444 0.0526316 +1431 1445 0.0526316 +1431 1446 0.0526316 +1431 1447 0.0526316 +1431 1448 0.333333 +1432 1433 0.0526316 +1432 1434 0.0526316 +1432 1435 0.0526316 +1432 1436 0.0526316 +1432 1437 0.0526316 +1432 1438 0.0526316 +1432 1439 0.0526316 +1432 1440 0.0526316 +1432 1441 0.0526316 +1432 1442 0.0526316 +1432 1443 0.0526316 +1432 1444 0.0526316 +1432 1445 0.0526316 +1432 1446 0.0526316 +1432 1447 0.0526316 +1433 1434 0.0526316 +1433 1435 0.0526316 +1433 1436 0.0526316 +1433 1437 0.0526316 +1433 1438 0.0526316 +1433 1439 0.0526316 +1433 1440 0.0526316 +1433 1441 0.0526316 +1433 1442 0.0526316 +1433 1443 0.0526316 +1433 1444 0.0526316 +1433 1445 0.0526316 +1433 1446 0.0526316 +1433 1447 0.0526316 +1434 1435 0.0526316 +1434 1436 0.0526316 +1434 1437 0.0526316 +1434 1438 0.0526316 +1434 1439 0.0526316 +1434 1440 0.0526316 +1434 1441 0.0526316 +1434 1442 0.0526316 +1434 1443 0.0526316 +1434 1444 0.0526316 +1434 1445 0.0526316 +1434 1446 0.0526316 +1434 1447 0.0526316 +1435 1436 0.0526316 +1435 1437 0.0526316 +1435 1438 0.0526316 +1435 1439 0.0526316 +1435 1440 0.0526316 +1435 1441 0.0526316 +1435 1442 0.0526316 +1435 1443 0.0526316 +1435 1444 0.0526316 +1435 1445 0.0526316 +1435 1446 0.0526316 +1435 1447 0.0526316 +1436 1437 0.0526316 +1436 1438 0.0526316 +1436 1439 0.0526316 +1436 1440 0.0526316 +1436 1441 0.0526316 +1436 1442 0.0526316 +1436 1443 0.0526316 +1436 1444 0.0526316 +1436 1445 0.0526316 +1436 1446 0.0526316 +1436 1447 0.0526316 +1437 1438 0.0526316 +1437 1439 0.0526316 +1437 1440 0.0526316 +1437 1441 0.0526316 +1437 1442 0.0526316 +1437 1443 0.0526316 +1437 1444 0.0526316 +1437 1445 0.0526316 +1437 1446 0.0526316 +1437 1447 0.0526316 +1438 1439 0.0526316 +1438 1440 0.0526316 +1438 1441 0.0526316 +1438 1442 0.0526316 +1438 1443 0.0526316 +1438 1444 0.0526316 +1438 1445 0.0526316 +1438 1446 0.0526316 +1438 1447 0.0526316 +1439 1440 0.0526316 +1439 1441 0.0526316 +1439 1442 0.0526316 +1439 1443 0.0526316 +1439 1444 0.0526316 +1439 1445 0.0526316 +1439 1446 0.0526316 +1439 1447 0.0526316 +1440 1441 0.0526316 +1440 1442 0.0526316 +1440 1443 0.0526316 +1440 1444 0.0526316 +1440 1445 0.0526316 +1440 1446 0.0526316 +1440 1447 0.0526316 +1441 1442 0.0526316 +1441 1443 0.0526316 +1441 1444 0.0526316 +1441 1445 0.0526316 +1441 1446 0.0526316 +1441 1447 0.0526316 +1442 1443 0.0526316 +1442 1444 0.0526316 +1442 1445 0.0526316 +1442 1446 0.0526316 +1442 1447 0.0526316 +1443 1444 0.0526316 +1443 1445 0.0526316 +1443 1446 0.0526316 +1443 1447 0.0526316 +1444 1445 0.0526316 +1444 1446 0.0526316 +1444 1447 0.0526316 +1445 1446 0.0526316 +1445 1447 0.0526316 +1446 1447 0.0526316 +1449 1450 1.0 +1456 1457 0.333333 +1456 1458 0.333333 +1456 1459 0.333333 +1457 1458 0.333333 +1457 1459 0.333333 +1458 1459 0.333333 +1464 1465 0.2 +1464 1466 0.2 +1464 1467 0.2 +1465 1466 0.2 +1465 1467 0.2 +1466 1467 0.2 +1468 1469 0.25 +1468 1470 0.25 +1469 1470 0.25 +1471 1472 0.5 +1471 1473 0.5 +1472 1473 0.5 +1474 1475 0.5 +1474 1476 0.5 +1475 1476 0.5 +1477 1478 0.5 +1479 1480 1.0 +1481 1482 0.5 +1483 1484 0.5 +1483 1485 0.5 +1484 1485 0.5 +1486 1487 1.0 +1488 1489 0.5 +1491 1492 1.0 +1491 1493 0.25 +1491 1540 0.25 +1491 1541 0.25 +1491 1542 0.25 +1493 1494 1.0 +1493 1540 0.25 +1493 1541 0.25 +1493 1542 0.25 +1495 1496 1.0 +1500 1501 0.25 +1500 1502 0.25 +1500 1503 0.25 +1501 1502 0.25 +1501 1503 0.25 +1502 1503 0.25 +1504 1505 0.2 +1504 1506 0.2 +1504 1507 0.2 +1504 1508 0.2 +1504 1509 0.2 +1504 1514 0.5 +1505 1506 0.2 +1505 1507 0.2 +1505 1508 0.2 +1505 1509 0.2 +1506 1507 0.2 +1506 1508 0.2 +1506 1509 0.2 +1507 1508 0.2 +1507 1509 0.2 +1508 1509 0.2 +1511 1512 0.5 +1511 1513 0.5 +1512 1513 0.5 +1515 1516 0.333333 +1515 1517 0.333333 +1516 1517 0.333333 +1518 1519 0.25 +1518 1520 0.25 +1519 1520 0.25 +1522 1523 1.0 +1525 1526 1.0 +1530 1531 1.0 +1533 1534 0.2 +1533 1535 0.2 +1534 1535 0.2 +1537 1538 0.5 +1537 1539 0.5 +1538 1539 0.5 +1540 1541 0.25 +1540 1542 0.25 +1541 1542 0.25 +1543 1544 1.0 +1545 1546 0.333333 +1545 1547 0.333333 +1545 1548 0.333333 +1546 1547 0.333333 +1546 1548 0.333333 +1547 1548 0.333333 +1550 1551 0.333333 +1553 1554 0.333333 +1553 1555 0.333333 +1554 1555 0.333333 +1556 1557 0.333333 +1556 1558 0.333333 +1557 1558 0.333333 +1560 1561 0.333333 +1562 1563 0.142857 +1562 1564 0.142857 +1562 1565 0.142857 +1562 1566 0.142857 +1562 1567 0.142857 +1563 1564 0.142857 +1563 1565 0.142857 +1563 1566 0.142857 +1563 1567 0.142857 +1564 1565 0.142857 +1564 1566 0.142857 +1564 1567 0.142857 +1565 1566 0.142857 +1565 1567 0.142857 +1566 1567 0.142857 +1568 1569 1.0 +1570 1571 0.2 +1570 1572 0.2 +1570 1573 0.2 +1571 1572 0.2 +1571 1573 0.2 +1572 1573 0.2 +1575 1576 0.333333 +1575 1577 0.333333 +1575 1578 0.333333 +1576 1577 0.333333 +1576 1578 0.333333 +1577 1578 0.333333 +1580 1581 1.0 +1583 1584 1.0 +1585 1586 1.0 +1585 1587 1.0 diff --git a/python/datasets/polbooks.csv b/python/datasets/polbooks.csv new file mode 100644 index 00000000000..e48e7fc4618 --- /dev/null +++ b/python/datasets/polbooks.csv @@ -0,0 +1,882 @@ +1 0 1.0 +2 0 1.0 +3 0 1.0 +4 0 1.0 +5 0 1.0 +6 0 1.0 +3 1 1.0 +5 1 1.0 +6 1 1.0 +4 2 1.0 +5 2 1.0 +7 2 1.0 +5 3 1.0 +8 3 1.0 +9 3 1.0 +10 3 1.0 +11 3 1.0 +12 3 1.0 +13 3 1.0 +14 3 1.0 +15 3 1.0 +16 3 1.0 +17 3 1.0 +18 3 1.0 +19 3 1.0 +20 3 1.0 +21 3 1.0 +22 3 1.0 +23 3 1.0 +24 3 1.0 +25 3 1.0 +26 3 1.0 +27 3 1.0 +5 4 1.0 +6 4 1.0 +28 4 1.0 +29 4 1.0 +30 4 1.0 +31 4 1.0 +6 5 1.0 +7 5 1.0 +7 6 1.0 +10 6 1.0 +12 6 1.0 +18 6 1.0 +22 6 1.0 +25 6 1.0 +29 6 1.0 +14 7 1.0 +30 7 1.0 +58 7 1.0 +71 7 1.0 +85 7 1.0 +9 8 1.0 +10 8 1.0 +11 8 1.0 +12 8 1.0 +13 8 1.0 +14 8 1.0 +20 8 1.0 +21 8 1.0 +22 8 1.0 +23 8 1.0 +24 8 1.0 +26 8 1.0 +27 8 1.0 +32 8 1.0 +33 8 1.0 +35 8 1.0 +37 8 1.0 +40 8 1.0 +41 8 1.0 +42 8 1.0 +43 8 1.0 +44 8 1.0 +45 8 1.0 +46 8 1.0 +11 9 1.0 +12 9 1.0 +14 9 1.0 +20 9 1.0 +24 9 1.0 +27 9 1.0 +41 9 1.0 +45 9 1.0 +47 9 1.0 +48 9 1.0 +49 9 1.0 +50 9 1.0 +51 9 1.0 +52 9 1.0 +11 10 1.0 +12 10 1.0 +15 10 1.0 +16 10 1.0 +19 10 1.0 +21 10 1.0 +33 10 1.0 +35 10 1.0 +37 10 1.0 +38 10 1.0 +39 10 1.0 +55 10 1.0 +12 11 1.0 +13 11 1.0 +14 11 1.0 +17 11 1.0 +20 11 1.0 +21 11 1.0 +22 11 1.0 +26 11 1.0 +27 11 1.0 +29 11 1.0 +45 11 1.0 +47 11 1.0 +50 11 1.0 +56 11 1.0 +13 12 1.0 +14 12 1.0 +15 12 1.0 +17 12 1.0 +18 12 1.0 +23 12 1.0 +24 12 1.0 +32 12 1.0 +33 12 1.0 +36 12 1.0 +38 12 1.0 +39 12 1.0 +40 12 1.0 +41 12 1.0 +44 12 1.0 +46 12 1.0 +47 12 1.0 +54 12 1.0 +55 12 1.0 +17 13 1.0 +29 13 1.0 +32 13 1.0 +40 13 1.0 +42 13 1.0 +43 13 1.0 +44 13 1.0 +47 13 1.0 +57 13 1.0 +25 14 1.0 +26 14 1.0 +58 14 1.0 +16 15 1.0 +55 15 1.0 +47 17 1.0 +55 19 1.0 +56 19 1.0 +77 19 1.0 +24 20 1.0 +40 20 1.0 +48 20 1.0 +49 20 1.0 +53 20 1.0 +57 20 1.0 +23 21 1.0 +25 22 1.0 +40 22 1.0 +52 22 1.0 +27 23 1.0 +32 23 1.0 +33 23 1.0 +47 23 1.0 +54 23 1.0 +26 24 1.0 +40 24 1.0 +47 24 1.0 +53 24 1.0 +40 25 1.0 +40 26 1.0 +45 26 1.0 +47 26 1.0 +53 26 1.0 +40 27 1.0 +41 27 1.0 +47 27 1.0 +54 27 1.0 +66 28 1.0 +72 28 1.0 +31 30 1.0 +58 30 1.0 +66 30 1.0 +67 30 1.0 +70 30 1.0 +73 30 1.0 +74 30 1.0 +75 30 1.0 +76 30 1.0 +77 30 1.0 +79 30 1.0 +80 30 1.0 +82 30 1.0 +83 30 1.0 +84 30 1.0 +86 30 1.0 +93 30 1.0 +99 30 1.0 +49 31 1.0 +73 31 1.0 +74 31 1.0 +75 31 1.0 +76 31 1.0 +77 31 1.0 +78 31 1.0 +82 31 1.0 +91 31 1.0 +33 32 1.0 +37 33 1.0 +38 33 1.0 +39 33 1.0 +47 33 1.0 +35 34 1.0 +36 34 1.0 +37 34 1.0 +38 34 1.0 +39 34 1.0 +36 35 1.0 +37 35 1.0 +38 35 1.0 +39 35 1.0 +40 35 1.0 +43 35 1.0 +44 35 1.0 +41 36 1.0 +47 36 1.0 +38 37 1.0 +47 37 1.0 +39 38 1.0 +40 39 1.0 +42 39 1.0 +41 40 1.0 +42 40 1.0 +44 40 1.0 +45 40 1.0 +47 40 1.0 +53 40 1.0 +54 40 1.0 +47 41 1.0 +54 41 1.0 +43 42 1.0 +47 42 1.0 +56 43 1.0 +47 45 1.0 +47 46 1.0 +102 46 1.0 +54 47 1.0 +49 48 1.0 +57 48 1.0 +57 49 1.0 +58 49 1.0 +72 49 1.0 +76 49 1.0 +58 50 1.0 +52 51 1.0 +58 51 1.0 +64 51 1.0 +65 51 1.0 +69 51 1.0 +58 52 1.0 +64 52 1.0 +76 53 1.0 +57 56 1.0 +64 58 1.0 +65 58 1.0 +68 58 1.0 +69 58 1.0 +77 58 1.0 +85 58 1.0 +60 59 1.0 +61 59 1.0 +62 59 1.0 +63 59 1.0 +99 59 1.0 +62 60 1.0 +63 60 1.0 +84 60 1.0 +86 60 1.0 +99 60 1.0 +86 61 1.0 +95 61 1.0 +101 61 1.0 +63 62 1.0 +84 62 1.0 +99 62 1.0 +100 62 1.0 +99 63 1.0 +65 64 1.0 +66 64 1.0 +67 64 1.0 +68 64 1.0 +69 64 1.0 +70 64 1.0 +67 65 1.0 +68 65 1.0 +69 65 1.0 +85 65 1.0 +67 66 1.0 +70 66 1.0 +72 66 1.0 +73 66 1.0 +74 66 1.0 +76 66 1.0 +80 66 1.0 +84 66 1.0 +85 66 1.0 +86 66 1.0 +88 66 1.0 +89 66 1.0 +90 66 1.0 +93 66 1.0 +96 66 1.0 +97 66 1.0 +99 66 1.0 +100 66 1.0 +103 67 1.0 +104 67 1.0 +71 68 1.0 +104 69 1.0 +71 70 1.0 +72 70 1.0 +75 70 1.0 +90 70 1.0 +72 71 1.0 +73 71 1.0 +74 71 1.0 +75 71 1.0 +76 71 1.0 +77 71 1.0 +78 71 1.0 +79 71 1.0 +80 71 1.0 +81 71 1.0 +82 71 1.0 +83 71 1.0 +73 72 1.0 +74 72 1.0 +75 72 1.0 +76 72 1.0 +78 72 1.0 +79 72 1.0 +80 72 1.0 +82 72 1.0 +84 72 1.0 +85 72 1.0 +86 72 1.0 +87 72 1.0 +88 72 1.0 +89 72 1.0 +90 72 1.0 +91 72 1.0 +92 72 1.0 +74 73 1.0 +75 73 1.0 +82 73 1.0 +83 73 1.0 +84 73 1.0 +86 73 1.0 +89 73 1.0 +92 73 1.0 +93 73 1.0 +94 73 1.0 +95 73 1.0 +96 73 1.0 +97 73 1.0 +98 73 1.0 +99 73 1.0 +100 73 1.0 +75 74 1.0 +78 74 1.0 +79 74 1.0 +82 74 1.0 +84 74 1.0 +87 74 1.0 +88 74 1.0 +91 74 1.0 +98 74 1.0 +99 74 1.0 +76 75 1.0 +77 75 1.0 +78 75 1.0 +79 75 1.0 +82 75 1.0 +83 75 1.0 +84 75 1.0 +91 75 1.0 +92 75 1.0 +77 76 1.0 +82 76 1.0 +83 76 1.0 +84 76 1.0 +86 76 1.0 +84 79 1.0 +91 79 1.0 +100 79 1.0 +84 81 1.0 +86 81 1.0 +97 81 1.0 +84 82 1.0 +84 83 1.0 +87 83 1.0 +100 83 1.0 +86 84 1.0 +87 84 1.0 +88 84 1.0 +89 84 1.0 +94 84 1.0 +96 84 1.0 +97 84 1.0 +99 84 1.0 +100 84 1.0 +101 84 1.0 +89 86 1.0 +93 86 1.0 +97 86 1.0 +100 86 1.0 +101 86 1.0 +98 87 1.0 +89 88 1.0 +91 90 1.0 +99 90 1.0 +98 91 1.0 +100 91 1.0 +94 93 1.0 +99 93 1.0 +102 93 1.0 +95 94 1.0 +96 94 1.0 +101 94 1.0 +102 94 1.0 +102 95 1.0 +97 96 1.0 +100 96 1.0 +100 98 1.0 +100 99 1.0 +101 100 1.0 +104 103 1.0 +0 1 1.0 +0 2 1.0 +0 3 1.0 +0 4 1.0 +0 5 1.0 +0 6 1.0 +1 3 1.0 +1 5 1.0 +1 6 1.0 +2 4 1.0 +2 5 1.0 +2 7 1.0 +3 5 1.0 +3 8 1.0 +3 9 1.0 +3 10 1.0 +3 11 1.0 +3 12 1.0 +3 13 1.0 +3 14 1.0 +3 15 1.0 +3 16 1.0 +3 17 1.0 +3 18 1.0 +3 19 1.0 +3 20 1.0 +3 21 1.0 +3 22 1.0 +3 23 1.0 +3 24 1.0 +3 25 1.0 +3 26 1.0 +3 27 1.0 +4 5 1.0 +4 6 1.0 +4 28 1.0 +4 29 1.0 +4 30 1.0 +4 31 1.0 +5 6 1.0 +5 7 1.0 +6 7 1.0 +6 10 1.0 +6 12 1.0 +6 18 1.0 +6 22 1.0 +6 25 1.0 +6 29 1.0 +7 14 1.0 +7 30 1.0 +7 58 1.0 +7 71 1.0 +7 85 1.0 +8 9 1.0 +8 10 1.0 +8 11 1.0 +8 12 1.0 +8 13 1.0 +8 14 1.0 +8 20 1.0 +8 21 1.0 +8 22 1.0 +8 23 1.0 +8 24 1.0 +8 26 1.0 +8 27 1.0 +8 32 1.0 +8 33 1.0 +8 35 1.0 +8 37 1.0 +8 40 1.0 +8 41 1.0 +8 42 1.0 +8 43 1.0 +8 44 1.0 +8 45 1.0 +8 46 1.0 +9 11 1.0 +9 12 1.0 +9 14 1.0 +9 20 1.0 +9 24 1.0 +9 27 1.0 +9 41 1.0 +9 45 1.0 +9 47 1.0 +9 48 1.0 +9 49 1.0 +9 50 1.0 +9 51 1.0 +9 52 1.0 +10 11 1.0 +10 12 1.0 +10 15 1.0 +10 16 1.0 +10 19 1.0 +10 21 1.0 +10 33 1.0 +10 35 1.0 +10 37 1.0 +10 38 1.0 +10 39 1.0 +10 55 1.0 +11 12 1.0 +11 13 1.0 +11 14 1.0 +11 17 1.0 +11 20 1.0 +11 21 1.0 +11 22 1.0 +11 26 1.0 +11 27 1.0 +11 29 1.0 +11 45 1.0 +11 47 1.0 +11 50 1.0 +11 56 1.0 +12 13 1.0 +12 14 1.0 +12 15 1.0 +12 17 1.0 +12 18 1.0 +12 23 1.0 +12 24 1.0 +12 32 1.0 +12 33 1.0 +12 36 1.0 +12 38 1.0 +12 39 1.0 +12 40 1.0 +12 41 1.0 +12 44 1.0 +12 46 1.0 +12 47 1.0 +12 54 1.0 +12 55 1.0 +13 17 1.0 +13 29 1.0 +13 32 1.0 +13 40 1.0 +13 42 1.0 +13 43 1.0 +13 44 1.0 +13 47 1.0 +13 57 1.0 +14 25 1.0 +14 26 1.0 +14 58 1.0 +15 16 1.0 +15 55 1.0 +17 47 1.0 +19 55 1.0 +19 56 1.0 +19 77 1.0 +20 24 1.0 +20 40 1.0 +20 48 1.0 +20 49 1.0 +20 53 1.0 +20 57 1.0 +21 23 1.0 +22 25 1.0 +22 40 1.0 +22 52 1.0 +23 27 1.0 +23 32 1.0 +23 33 1.0 +23 47 1.0 +23 54 1.0 +24 26 1.0 +24 40 1.0 +24 47 1.0 +24 53 1.0 +25 40 1.0 +26 40 1.0 +26 45 1.0 +26 47 1.0 +26 53 1.0 +27 40 1.0 +27 41 1.0 +27 47 1.0 +27 54 1.0 +28 66 1.0 +28 72 1.0 +30 31 1.0 +30 58 1.0 +30 66 1.0 +30 67 1.0 +30 70 1.0 +30 73 1.0 +30 74 1.0 +30 75 1.0 +30 76 1.0 +30 77 1.0 +30 79 1.0 +30 80 1.0 +30 82 1.0 +30 83 1.0 +30 84 1.0 +30 86 1.0 +30 93 1.0 +30 99 1.0 +31 49 1.0 +31 73 1.0 +31 74 1.0 +31 75 1.0 +31 76 1.0 +31 77 1.0 +31 78 1.0 +31 82 1.0 +31 91 1.0 +32 33 1.0 +33 37 1.0 +33 38 1.0 +33 39 1.0 +33 47 1.0 +34 35 1.0 +34 36 1.0 +34 37 1.0 +34 38 1.0 +34 39 1.0 +35 36 1.0 +35 37 1.0 +35 38 1.0 +35 39 1.0 +35 40 1.0 +35 43 1.0 +35 44 1.0 +36 41 1.0 +36 47 1.0 +37 38 1.0 +37 47 1.0 +38 39 1.0 +39 40 1.0 +39 42 1.0 +40 41 1.0 +40 42 1.0 +40 44 1.0 +40 45 1.0 +40 47 1.0 +40 53 1.0 +40 54 1.0 +41 47 1.0 +41 54 1.0 +42 43 1.0 +42 47 1.0 +43 56 1.0 +45 47 1.0 +46 47 1.0 +46 102 1.0 +47 54 1.0 +48 49 1.0 +48 57 1.0 +49 57 1.0 +49 58 1.0 +49 72 1.0 +49 76 1.0 +50 58 1.0 +51 52 1.0 +51 58 1.0 +51 64 1.0 +51 65 1.0 +51 69 1.0 +52 58 1.0 +52 64 1.0 +53 76 1.0 +56 57 1.0 +58 64 1.0 +58 65 1.0 +58 68 1.0 +58 69 1.0 +58 77 1.0 +58 85 1.0 +59 60 1.0 +59 61 1.0 +59 62 1.0 +59 63 1.0 +59 99 1.0 +60 62 1.0 +60 63 1.0 +60 84 1.0 +60 86 1.0 +60 99 1.0 +61 86 1.0 +61 95 1.0 +61 101 1.0 +62 63 1.0 +62 84 1.0 +62 99 1.0 +62 100 1.0 +63 99 1.0 +64 65 1.0 +64 66 1.0 +64 67 1.0 +64 68 1.0 +64 69 1.0 +64 70 1.0 +65 67 1.0 +65 68 1.0 +65 69 1.0 +65 85 1.0 +66 67 1.0 +66 70 1.0 +66 72 1.0 +66 73 1.0 +66 74 1.0 +66 76 1.0 +66 80 1.0 +66 84 1.0 +66 85 1.0 +66 86 1.0 +66 88 1.0 +66 89 1.0 +66 90 1.0 +66 93 1.0 +66 96 1.0 +66 97 1.0 +66 99 1.0 +66 100 1.0 +67 103 1.0 +67 104 1.0 +68 71 1.0 +69 104 1.0 +70 71 1.0 +70 72 1.0 +70 75 1.0 +70 90 1.0 +71 72 1.0 +71 73 1.0 +71 74 1.0 +71 75 1.0 +71 76 1.0 +71 77 1.0 +71 78 1.0 +71 79 1.0 +71 80 1.0 +71 81 1.0 +71 82 1.0 +71 83 1.0 +72 73 1.0 +72 74 1.0 +72 75 1.0 +72 76 1.0 +72 78 1.0 +72 79 1.0 +72 80 1.0 +72 82 1.0 +72 84 1.0 +72 85 1.0 +72 86 1.0 +72 87 1.0 +72 88 1.0 +72 89 1.0 +72 90 1.0 +72 91 1.0 +72 92 1.0 +73 74 1.0 +73 75 1.0 +73 82 1.0 +73 83 1.0 +73 84 1.0 +73 86 1.0 +73 89 1.0 +73 92 1.0 +73 93 1.0 +73 94 1.0 +73 95 1.0 +73 96 1.0 +73 97 1.0 +73 98 1.0 +73 99 1.0 +73 100 1.0 +74 75 1.0 +74 78 1.0 +74 79 1.0 +74 82 1.0 +74 84 1.0 +74 87 1.0 +74 88 1.0 +74 91 1.0 +74 98 1.0 +74 99 1.0 +75 76 1.0 +75 77 1.0 +75 78 1.0 +75 79 1.0 +75 82 1.0 +75 83 1.0 +75 84 1.0 +75 91 1.0 +75 92 1.0 +76 77 1.0 +76 82 1.0 +76 83 1.0 +76 84 1.0 +76 86 1.0 +79 84 1.0 +79 91 1.0 +79 100 1.0 +81 84 1.0 +81 86 1.0 +81 97 1.0 +82 84 1.0 +83 84 1.0 +83 87 1.0 +83 100 1.0 +84 86 1.0 +84 87 1.0 +84 88 1.0 +84 89 1.0 +84 94 1.0 +84 96 1.0 +84 97 1.0 +84 99 1.0 +84 100 1.0 +84 101 1.0 +86 89 1.0 +86 93 1.0 +86 97 1.0 +86 100 1.0 +86 101 1.0 +87 98 1.0 +88 89 1.0 +90 91 1.0 +90 99 1.0 +91 98 1.0 +91 100 1.0 +93 94 1.0 +93 99 1.0 +93 102 1.0 +94 95 1.0 +94 96 1.0 +94 101 1.0 +94 102 1.0 +95 102 1.0 +96 97 1.0 +96 100 1.0 +98 100 1.0 +99 100 1.0 +100 101 1.0 +103 104 1.0 diff --git a/python/datasets/small_line.csv b/python/datasets/small_line.csv new file mode 100644 index 00000000000..55494314212 --- /dev/null +++ b/python/datasets/small_line.csv @@ -0,0 +1,9 @@ +0 1 1.0 +1 2 1.0 +2 3 1.0 +3 4 1.0 +4 5 1.0 +5 6 1.0 +6 7 1.0 +7 8 1.0 +8 9 1.0 diff --git a/python/datasets/small_tree.csv b/python/datasets/small_tree.csv new file mode 100644 index 00000000000..e8216bbb6ad --- /dev/null +++ b/python/datasets/small_tree.csv @@ -0,0 +1,11 @@ +0 1 1.0 +0 2 1.0 +0 3 1.0 +0 4 1.0 +1 5 1.0 +2 5 1.0 +3 5 1.0 +4 5 1.0 +5 6 1.0 +5 7 1.0 +5 8 1.0 diff --git a/python/pylibcugraph/pylibcugraph/graphs.pyx b/python/pylibcugraph/pylibcugraph/graphs.pyx index 8aed98cb98a..dfbbf09129b 100644 --- a/python/pylibcugraph/pylibcugraph/graphs.pyx +++ b/python/pylibcugraph/pylibcugraph/graphs.pyx @@ -142,7 +142,7 @@ cdef class SGGraph(_GPUGraph): GraphProperties graph_properties, src_or_offset_array, dst_or_index_array, - weight_array, + weight_array=None, store_transposed=False, renumber=False, do_expensive_check=False, @@ -177,18 +177,22 @@ cdef class SGGraph(_GPUGraph): create_cugraph_type_erased_device_array_view_from_py_obj( src_or_offset_array ) + cdef cugraph_type_erased_device_array_view_t* dsts_or_indices_view_ptr = \ create_cugraph_type_erased_device_array_view_from_py_obj( dst_or_index_array ) + cdef cugraph_type_erased_device_array_view_t* weights_view_ptr = \ create_cugraph_type_erased_device_array_view_from_py_obj( weight_array ) + cdef cugraph_type_erased_device_array_view_t* edge_id_view_ptr = \ create_cugraph_type_erased_device_array_view_from_py_obj( edge_id_array ) + cdef cugraph_type_erased_device_array_view_t* edge_type_view_ptr = \ create_cugraph_type_erased_device_array_view_from_py_obj( edge_type_array @@ -306,7 +310,7 @@ cdef class MGGraph(_GPUGraph): GraphProperties graph_properties, src_array, dst_array, - weight_array, + weight_array=None, store_transposed=False, num_edges=-1, do_expensive_check=False, @@ -354,18 +358,14 @@ cdef class MGGraph(_GPUGraph): create_cugraph_type_erased_device_array_view_from_py_obj( weight_array ) - cdef cugraph_type_erased_device_array_view_t* edge_id_view_ptr = NULL - if edge_id_array is not None: - edge_id_view_ptr = \ - create_cugraph_type_erased_device_array_view_from_py_obj( - edge_id_array - ) - cdef cugraph_type_erased_device_array_view_t* edge_type_view_ptr = NULL - if edge_type_array is not None: - edge_type_view_ptr = \ - create_cugraph_type_erased_device_array_view_from_py_obj( - edge_type_array - ) + cdef cugraph_type_erased_device_array_view_t* edge_id_view_ptr = \ + create_cugraph_type_erased_device_array_view_from_py_obj( + edge_id_array + ) + cdef cugraph_type_erased_device_array_view_t* edge_type_view_ptr = \ + create_cugraph_type_erased_device_array_view_from_py_obj( + edge_type_array + ) error_code = cugraph_mg_graph_create( resource_handle.c_resource_handle_ptr, diff --git a/python/pylibcugraph/pylibcugraph/internal_types/sampling_result.pyx b/python/pylibcugraph/pylibcugraph/internal_types/sampling_result.pyx index 55b3862774f..1391bbc9236 100644 --- a/python/pylibcugraph/pylibcugraph/internal_types/sampling_result.pyx +++ b/python/pylibcugraph/pylibcugraph/internal_types/sampling_result.pyx @@ -85,6 +85,10 @@ cdef class SamplingResult: cdef cugraph_type_erased_device_array_view_t* device_array_view_ptr = ( cugraph_sample_result_get_edge_weight(self.c_sample_result_ptr) ) + + if device_array_view_ptr is NULL: + return None + return create_cupy_array_view_for_device_ptr(device_array_view_ptr, self) @@ -98,6 +102,10 @@ cdef class SamplingResult: cdef cugraph_type_erased_device_array_view_t* device_array_view_ptr = ( cugraph_sample_result_get_edge_id(self.c_sample_result_ptr) ) + + if device_array_view_ptr is NULL: + return None + return create_cupy_array_view_for_device_ptr(device_array_view_ptr, self) @@ -108,6 +116,10 @@ cdef class SamplingResult: cdef cugraph_type_erased_device_array_view_t* device_array_view_ptr = ( cugraph_sample_result_get_edge_type(self.c_sample_result_ptr) ) + + if device_array_view_ptr is NULL: + return None + return create_cupy_array_view_for_device_ptr(device_array_view_ptr, self) From 5bab68b322d51457364f09a60e973b6874b0b97f Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 17 Apr 2023 20:22:13 +0000 Subject: [PATCH 02/37] remove unwanted files --- python/datasets/dolphins.csv | 318 -- python/datasets/karate.csv | 156 - python/datasets/netscience.csv | 5484 -------------------------------- python/datasets/polbooks.csv | 882 ----- python/datasets/small_line.csv | 9 - python/datasets/small_tree.csv | 11 - 6 files changed, 6860 deletions(-) delete mode 100644 python/datasets/dolphins.csv delete mode 100644 python/datasets/karate.csv delete mode 100644 python/datasets/netscience.csv delete mode 100644 python/datasets/polbooks.csv delete mode 100644 python/datasets/small_line.csv delete mode 100644 python/datasets/small_tree.csv diff --git a/python/datasets/dolphins.csv b/python/datasets/dolphins.csv deleted file mode 100644 index 80b1c8b1a18..00000000000 --- a/python/datasets/dolphins.csv +++ /dev/null @@ -1,318 +0,0 @@ -10 0 1.0 -14 0 1.0 -15 0 1.0 -40 0 1.0 -42 0 1.0 -47 0 1.0 -17 1 1.0 -19 1 1.0 -26 1 1.0 -27 1 1.0 -28 1 1.0 -36 1 1.0 -41 1 1.0 -54 1 1.0 -10 2 1.0 -42 2 1.0 -44 2 1.0 -61 2 1.0 -8 3 1.0 -14 3 1.0 -59 3 1.0 -51 4 1.0 -9 5 1.0 -13 5 1.0 -56 5 1.0 -57 5 1.0 -9 6 1.0 -13 6 1.0 -17 6 1.0 -54 6 1.0 -56 6 1.0 -57 6 1.0 -19 7 1.0 -27 7 1.0 -30 7 1.0 -40 7 1.0 -54 7 1.0 -20 8 1.0 -28 8 1.0 -37 8 1.0 -45 8 1.0 -59 8 1.0 -13 9 1.0 -17 9 1.0 -32 9 1.0 -41 9 1.0 -57 9 1.0 -29 10 1.0 -42 10 1.0 -47 10 1.0 -51 11 1.0 -33 12 1.0 -17 13 1.0 -32 13 1.0 -41 13 1.0 -54 13 1.0 -57 13 1.0 -16 14 1.0 -24 14 1.0 -33 14 1.0 -34 14 1.0 -37 14 1.0 -38 14 1.0 -40 14 1.0 -43 14 1.0 -50 14 1.0 -52 14 1.0 -18 15 1.0 -24 15 1.0 -40 15 1.0 -45 15 1.0 -55 15 1.0 -59 15 1.0 -20 16 1.0 -33 16 1.0 -37 16 1.0 -38 16 1.0 -50 16 1.0 -22 17 1.0 -25 17 1.0 -27 17 1.0 -31 17 1.0 -57 17 1.0 -20 18 1.0 -21 18 1.0 -24 18 1.0 -29 18 1.0 -45 18 1.0 -51 18 1.0 -30 19 1.0 -54 19 1.0 -28 20 1.0 -36 20 1.0 -38 20 1.0 -44 20 1.0 -47 20 1.0 -50 20 1.0 -29 21 1.0 -33 21 1.0 -37 21 1.0 -45 21 1.0 -51 21 1.0 -36 23 1.0 -45 23 1.0 -51 23 1.0 -29 24 1.0 -45 24 1.0 -51 24 1.0 -26 25 1.0 -27 25 1.0 -27 26 1.0 -30 28 1.0 -47 28 1.0 -35 29 1.0 -43 29 1.0 -45 29 1.0 -51 29 1.0 -52 29 1.0 -42 30 1.0 -47 30 1.0 -60 32 1.0 -34 33 1.0 -37 33 1.0 -38 33 1.0 -40 33 1.0 -43 33 1.0 -50 33 1.0 -37 34 1.0 -44 34 1.0 -49 34 1.0 -37 36 1.0 -39 36 1.0 -40 36 1.0 -59 36 1.0 -40 37 1.0 -43 37 1.0 -45 37 1.0 -61 37 1.0 -43 38 1.0 -44 38 1.0 -52 38 1.0 -58 38 1.0 -57 39 1.0 -52 40 1.0 -54 41 1.0 -57 41 1.0 -47 42 1.0 -50 42 1.0 -46 43 1.0 -53 43 1.0 -50 45 1.0 -51 45 1.0 -59 45 1.0 -49 46 1.0 -57 48 1.0 -51 50 1.0 -55 51 1.0 -61 53 1.0 -57 54 1.0 -0 10 1.0 -0 14 1.0 -0 15 1.0 -0 40 1.0 -0 42 1.0 -0 47 1.0 -1 17 1.0 -1 19 1.0 -1 26 1.0 -1 27 1.0 -1 28 1.0 -1 36 1.0 -1 41 1.0 -1 54 1.0 -2 10 1.0 -2 42 1.0 -2 44 1.0 -2 61 1.0 -3 8 1.0 -3 14 1.0 -3 59 1.0 -4 51 1.0 -5 9 1.0 -5 13 1.0 -5 56 1.0 -5 57 1.0 -6 9 1.0 -6 13 1.0 -6 17 1.0 -6 54 1.0 -6 56 1.0 -6 57 1.0 -7 19 1.0 -7 27 1.0 -7 30 1.0 -7 40 1.0 -7 54 1.0 -8 20 1.0 -8 28 1.0 -8 37 1.0 -8 45 1.0 -8 59 1.0 -9 13 1.0 -9 17 1.0 -9 32 1.0 -9 41 1.0 -9 57 1.0 -10 29 1.0 -10 42 1.0 -10 47 1.0 -11 51 1.0 -12 33 1.0 -13 17 1.0 -13 32 1.0 -13 41 1.0 -13 54 1.0 -13 57 1.0 -14 16 1.0 -14 24 1.0 -14 33 1.0 -14 34 1.0 -14 37 1.0 -14 38 1.0 -14 40 1.0 -14 43 1.0 -14 50 1.0 -14 52 1.0 -15 18 1.0 -15 24 1.0 -15 40 1.0 -15 45 1.0 -15 55 1.0 -15 59 1.0 -16 20 1.0 -16 33 1.0 -16 37 1.0 -16 38 1.0 -16 50 1.0 -17 22 1.0 -17 25 1.0 -17 27 1.0 -17 31 1.0 -17 57 1.0 -18 20 1.0 -18 21 1.0 -18 24 1.0 -18 29 1.0 -18 45 1.0 -18 51 1.0 -19 30 1.0 -19 54 1.0 -20 28 1.0 -20 36 1.0 -20 38 1.0 -20 44 1.0 -20 47 1.0 -20 50 1.0 -21 29 1.0 -21 33 1.0 -21 37 1.0 -21 45 1.0 -21 51 1.0 -23 36 1.0 -23 45 1.0 -23 51 1.0 -24 29 1.0 -24 45 1.0 -24 51 1.0 -25 26 1.0 -25 27 1.0 -26 27 1.0 -28 30 1.0 -28 47 1.0 -29 35 1.0 -29 43 1.0 -29 45 1.0 -29 51 1.0 -29 52 1.0 -30 42 1.0 -30 47 1.0 -32 60 1.0 -33 34 1.0 -33 37 1.0 -33 38 1.0 -33 40 1.0 -33 43 1.0 -33 50 1.0 -34 37 1.0 -34 44 1.0 -34 49 1.0 -36 37 1.0 -36 39 1.0 -36 40 1.0 -36 59 1.0 -37 40 1.0 -37 43 1.0 -37 45 1.0 -37 61 1.0 -38 43 1.0 -38 44 1.0 -38 52 1.0 -38 58 1.0 -39 57 1.0 -40 52 1.0 -41 54 1.0 -41 57 1.0 -42 47 1.0 -42 50 1.0 -43 46 1.0 -43 53 1.0 -45 50 1.0 -45 51 1.0 -45 59 1.0 -46 49 1.0 -48 57 1.0 -50 51 1.0 -51 55 1.0 -53 61 1.0 -54 57 1.0 diff --git a/python/datasets/karate.csv b/python/datasets/karate.csv deleted file mode 100644 index 4ed9f4356a9..00000000000 --- a/python/datasets/karate.csv +++ /dev/null @@ -1,156 +0,0 @@ -1 0 1.0 -2 0 1.0 -3 0 1.0 -4 0 1.0 -5 0 1.0 -6 0 1.0 -7 0 1.0 -8 0 1.0 -10 0 1.0 -11 0 1.0 -12 0 1.0 -13 0 1.0 -17 0 1.0 -19 0 1.0 -21 0 1.0 -31 0 1.0 -2 1 1.0 -3 1 1.0 -7 1 1.0 -13 1 1.0 -17 1 1.0 -19 1 1.0 -21 1 1.0 -30 1 1.0 -3 2 1.0 -7 2 1.0 -8 2 1.0 -9 2 1.0 -13 2 1.0 -27 2 1.0 -28 2 1.0 -32 2 1.0 -7 3 1.0 -12 3 1.0 -13 3 1.0 -6 4 1.0 -10 4 1.0 -6 5 1.0 -10 5 1.0 -16 5 1.0 -16 6 1.0 -30 8 1.0 -32 8 1.0 -33 8 1.0 -33 9 1.0 -33 13 1.0 -32 14 1.0 -33 14 1.0 -32 15 1.0 -33 15 1.0 -32 18 1.0 -33 18 1.0 -33 19 1.0 -32 20 1.0 -33 20 1.0 -32 22 1.0 -33 22 1.0 -25 23 1.0 -27 23 1.0 -29 23 1.0 -32 23 1.0 -33 23 1.0 -25 24 1.0 -27 24 1.0 -31 24 1.0 -31 25 1.0 -29 26 1.0 -33 26 1.0 -33 27 1.0 -31 28 1.0 -33 28 1.0 -32 29 1.0 -33 29 1.0 -32 30 1.0 -33 30 1.0 -32 31 1.0 -33 31 1.0 -33 32 1.0 -0 1 1.0 -0 2 1.0 -0 3 1.0 -0 4 1.0 -0 5 1.0 -0 6 1.0 -0 7 1.0 -0 8 1.0 -0 10 1.0 -0 11 1.0 -0 12 1.0 -0 13 1.0 -0 17 1.0 -0 19 1.0 -0 21 1.0 -0 31 1.0 -1 2 1.0 -1 3 1.0 -1 7 1.0 -1 13 1.0 -1 17 1.0 -1 19 1.0 -1 21 1.0 -1 30 1.0 -2 3 1.0 -2 7 1.0 -2 8 1.0 -2 9 1.0 -2 13 1.0 -2 27 1.0 -2 28 1.0 -2 32 1.0 -3 7 1.0 -3 12 1.0 -3 13 1.0 -4 6 1.0 -4 10 1.0 -5 6 1.0 -5 10 1.0 -5 16 1.0 -6 16 1.0 -8 30 1.0 -8 32 1.0 -8 33 1.0 -9 33 1.0 -13 33 1.0 -14 32 1.0 -14 33 1.0 -15 32 1.0 -15 33 1.0 -18 32 1.0 -18 33 1.0 -19 33 1.0 -20 32 1.0 -20 33 1.0 -22 32 1.0 -22 33 1.0 -23 25 1.0 -23 27 1.0 -23 29 1.0 -23 32 1.0 -23 33 1.0 -24 25 1.0 -24 27 1.0 -24 31 1.0 -25 31 1.0 -26 29 1.0 -26 33 1.0 -27 33 1.0 -28 31 1.0 -28 33 1.0 -29 32 1.0 -29 33 1.0 -30 32 1.0 -30 33 1.0 -31 32 1.0 -31 33 1.0 -32 33 1.0 diff --git a/python/datasets/netscience.csv b/python/datasets/netscience.csv deleted file mode 100644 index bd467aeb7da..00000000000 --- a/python/datasets/netscience.csv +++ /dev/null @@ -1,5484 +0,0 @@ -1 0 2.5 -1084 0 0.5 -946 1 1.0 -1084 1 0.5 -3 2 0.25 -4 2 0.25 -5 2 0.25 -6 2 0.25 -4 3 0.25 -5 3 0.25 -6 3 0.25 -5 4 0.25 -6 4 0.25 -6 5 0.25 -8 7 1.0 -9 7 3.16667 -10 7 1.16667 -11 7 0.666667 -10 9 1.16667 -11 9 0.666667 -1424 9 0.5 -1425 9 1.5 -1532 9 1.0 -11 10 0.666667 -13 12 0.333333 -14 12 0.333333 -15 12 0.333333 -1047 12 0.25 -1048 12 0.25 -1049 12 0.25 -1050 12 0.25 -14 13 0.333333 -15 13 0.333333 -15 14 0.333333 -17 16 0.5 -18 16 0.5 -18 17 0.5 -21 20 0.5 -22 20 0.5 -22 21 0.5 -24 23 0.5 -25 23 0.5 -25 24 2.33333 -201 24 0.333333 -202 24 0.333333 -369 24 0.5 -201 25 0.333333 -202 25 0.333333 -369 25 0.5 -28 27 0.5 -29 27 0.5 -29 28 0.5 -31 30 0.5 -32 30 0.5 -33 30 3.58333 -34 30 1.58333 -54 30 0.25 -131 30 0.333333 -327 30 0.333333 -402 30 0.333333 -840 30 0.25 -894 30 0.333333 -32 31 0.5 -34 33 4.225 -51 33 0.75 -52 33 0.25 -53 33 1.85833 -54 33 2.99167 -131 33 1.33333 -132 33 2.275 -133 33 1.025 -134 33 0.525 -190 33 0.583333 -375 33 0.25 -376 33 0.25 -377 33 0.25 -464 33 1.0 -485 33 1.0 -488 33 0.333333 -489 33 0.333333 -507 33 0.583333 -508 33 0.583333 -509 33 0.25 -561 33 0.708333 -562 33 0.458333 -839 33 0.333333 -840 33 0.45 -1008 33 0.5 -1190 33 0.2 -1191 33 0.2 -1228 33 0.25 -1229 33 0.25 -1295 33 0.25 -1529 33 0.5 -1550 33 1.33333 -1551 33 0.333333 -53 34 0.775 -54 34 1.15833 -131 34 0.333333 -132 34 0.525 -133 34 1.025 -134 34 0.525 -561 34 0.375 -562 34 0.125 -652 34 0.25 -654 34 1.25 -655 34 0.25 -657 34 0.25 -756 34 0.5 -760 34 0.5 -761 34 0.333333 -762 34 0.333333 -763 34 0.333333 -839 34 0.333333 -840 34 0.45 -865 34 0.5 -1130 34 0.5 -1190 34 0.2 -1191 34 0.2 -1550 34 0.833333 -1551 34 0.333333 -36 35 0.2 -37 35 0.2 -38 35 0.2 -39 35 0.2 -40 35 0.2 -37 36 0.2 -38 36 0.2 -39 36 0.2 -40 36 0.2 -38 37 0.2 -39 37 0.2 -40 37 0.2 -39 38 0.2 -40 38 0.2 -40 39 0.2 -43 42 1.0 -45 44 0.5 -46 44 0.5 -46 45 0.5 -609 45 0.833333 -610 45 0.5 -611 45 0.333333 -612 45 0.333333 -78 46 1.0 -191 46 0.833333 -192 46 0.333333 -193 46 0.333333 -194 46 0.5 -428 46 1.33333 -596 46 1.0 -1361 46 1.33333 -1362 46 0.333333 -1363 46 1.0 -48 47 0.333333 -49 47 0.333333 -50 47 0.333333 -49 48 0.333333 -50 48 0.333333 -216 48 0.333333 -217 48 0.333333 -218 48 0.333333 -50 49 0.333333 -52 51 0.25 -53 51 0.25 -54 51 0.25 -55 51 0.5 -56 51 0.5 -57 51 1.0 -58 51 1.0 -1008 51 0.5 -53 52 0.25 -54 52 0.25 -54 53 0.625 -132 53 1.025 -133 53 0.525 -134 53 0.525 -561 53 0.708333 -562 53 0.458333 -1024 53 0.5 -1025 53 0.5 -1315 53 0.25 -1468 53 0.25 -1469 53 0.25 -1470 53 0.25 -132 54 0.375 -133 54 0.125 -134 54 0.125 -488 54 0.333333 -489 54 0.333333 -561 54 0.375 -562 54 0.125 -839 54 0.333333 -840 54 0.45 -1190 54 0.2 -1191 54 0.2 -1228 54 0.25 -1229 54 0.25 -1529 54 0.5 -1550 54 0.5 -56 55 3.83333 -90 55 1.0 -184 55 0.5 -547 55 0.5 -654 55 0.333333 -893 55 0.333333 -934 55 0.5 -1461 55 0.5 -184 56 0.5 -547 56 0.5 -654 56 0.333333 -893 56 0.333333 -934 56 0.5 -1461 56 0.5 -58 57 1.0 -685 57 1.0 -60 59 0.5 -61 59 0.5 -61 60 0.5 -63 62 0.47619 -64 62 0.333333 -65 62 0.333333 -362 62 0.2 -805 62 0.92619 -806 62 1.25952 -807 62 0.92619 -808 62 0.25 -1016 62 1.33333 -1070 62 0.142857 -1071 62 0.67619 -1072 62 0.142857 -1073 62 0.142857 -1562 62 0.142857 -1563 62 0.142857 -1564 62 0.142857 -1565 62 0.142857 -1566 62 0.142857 -1567 62 0.142857 -64 63 0.333333 -65 63 0.333333 -1562 63 0.142857 -1563 63 0.142857 -1564 63 0.142857 -1565 63 0.142857 -1566 63 0.142857 -1567 63 0.142857 -65 64 0.333333 -795 64 0.25 -796 64 0.25 -797 64 0.25 -798 64 0.25 -67 66 0.5 -68 66 0.5 -68 67 0.5 -70 69 0.833333 -71 69 2.16667 -72 69 0.916667 -97 69 1.83333 -310 69 0.5 -709 69 0.666667 -710 69 0.333333 -757 69 0.75 -758 69 0.75 -977 69 0.25 -1082 69 0.5 -1083 69 0.5 -71 70 0.833333 -72 70 0.333333 -72 71 0.666667 -149 71 1.16667 -150 71 0.666667 -151 71 1.16667 -157 71 0.5 -158 71 0.5 -709 71 0.333333 -736 71 0.5 -737 71 0.5 -235 72 1.0 -443 72 0.5 -709 72 0.333333 -738 72 0.5 -757 72 0.25 -758 72 0.25 -977 72 0.25 -74 73 0.333333 -75 73 0.333333 -76 73 0.333333 -75 74 0.333333 -76 74 0.333333 -76 75 0.333333 -522 76 1.0 -1381 76 0.5 -1588 76 0.5 -78 77 0.333333 -79 77 0.333333 -80 77 0.333333 -79 78 0.333333 -80 78 0.333333 -121 78 1.0 -281 78 1.0 -305 78 0.583333 -306 78 0.25 -307 78 0.25 -308 78 1.58333 -309 78 3.33333 -370 78 0.5 -371 78 2.5 -490 78 0.5 -641 78 1.0 -646 78 2.5 -756 78 0.5 -759 78 0.5 -853 78 0.5 -1005 78 1.0 -1121 78 0.5 -1122 78 0.5 -1123 78 0.5 -1172 78 1.0 -1195 78 0.333333 -1196 78 0.333333 -1197 78 0.333333 -80 79 0.333333 -82 81 0.5 -83 81 0.5 -83 82 0.5 -563 82 1.0 -1498 82 1.0 -85 84 0.5 -86 84 0.5 -86 85 0.5 -88 87 2.5 -711 87 0.5 -711 88 0.5 -976 88 1.0 -991 88 2.0 -92 91 0.5 -93 91 0.5 -93 92 0.5 -95 94 0.5 -96 94 2.66667 -97 94 2.33333 -98 94 0.5 -99 94 0.5 -100 94 0.25 -150 94 0.333333 -225 94 0.333333 -708 94 0.583333 -96 95 0.5 -97 95 0.5 -98 95 0.5 -97 96 2.33333 -98 96 0.5 -99 96 0.5 -100 96 0.25 -150 96 0.833333 -225 96 0.333333 -700 96 0.333333 -701 96 0.333333 -702 96 0.333333 -708 96 0.583333 -1177 96 0.5 -1481 96 0.5 -1482 96 0.5 -98 97 0.5 -99 97 0.5 -100 97 0.25 -310 97 0.5 -708 97 0.583333 -709 97 0.333333 -710 97 0.333333 -100 99 1.25 -708 99 0.25 -103 102 0.5 -104 102 0.5 -104 103 0.5 -106 105 0.5 -107 105 0.5 -107 106 0.5 -859 106 1.0 -109 108 1.0 -112 111 1.0 -114 113 1.0 -1162 114 0.5 -1163 114 0.5 -117 116 1.0 -935 117 0.25 -936 117 0.25 -937 117 0.25 -938 117 0.25 -119 118 1.0 -439 118 0.5 -441 118 0.5 -121 120 1.0 -548 121 0.333333 -549 121 0.333333 -550 121 1.83333 -764 121 0.833333 -765 121 0.333333 -1030 121 0.5 -1255 121 0.833333 -123 122 0.5 -124 122 0.5 -124 123 0.5 -127 126 0.7 -128 126 0.5 -770 126 0.2 -771 126 0.2 -772 126 0.2 -773 126 0.2 -128 127 0.75 -151 127 0.333333 -517 127 0.333333 -770 127 0.2 -771 127 0.2 -772 127 0.2 -773 127 0.2 -1021 127 0.25 -1022 127 0.25 -1023 127 0.25 -1460 127 0.333333 -1021 128 0.75 -1022 128 0.25 -1023 128 1.75 -130 129 1.0 -203 131 1.0 -133 132 0.525 -134 132 0.525 -561 132 0.125 -562 132 0.125 -1228 132 0.25 -1229 132 0.25 -134 133 0.525 -561 133 0.125 -562 133 0.125 -561 134 0.125 -562 134 0.125 -136 135 1.0 -216 136 0.5 -223 136 0.5 -585 136 0.333333 -586 136 0.333333 -587 136 1.83333 -729 136 0.5 -138 137 1.0 -140 139 0.111111 -141 139 0.111111 -142 139 0.111111 -143 139 0.111111 -144 139 0.111111 -145 139 0.111111 -146 139 0.111111 -147 139 0.111111 -148 139 0.111111 -141 140 0.111111 -142 140 0.111111 -143 140 0.111111 -144 140 0.111111 -145 140 0.111111 -146 140 0.111111 -147 140 0.111111 -148 140 0.111111 -142 141 0.111111 -143 141 0.111111 -144 141 0.111111 -145 141 0.111111 -146 141 0.111111 -147 141 0.111111 -148 141 0.111111 -143 142 0.111111 -144 142 0.111111 -145 142 0.111111 -146 142 0.111111 -147 142 0.111111 -148 142 0.111111 -144 143 0.111111 -145 143 0.111111 -146 143 0.111111 -147 143 0.111111 -148 143 0.111111 -145 144 0.111111 -146 144 0.111111 -147 144 0.111111 -148 144 0.111111 -146 145 0.111111 -147 145 0.111111 -148 145 0.111111 -147 146 0.111111 -148 146 0.111111 -148 147 0.111111 -150 149 0.666667 -151 149 1.16667 -152 149 1.0 -151 150 4.75 -225 150 2.08333 -281 150 1.83333 -301 150 0.5 -500 150 0.5 -516 150 1.08333 -517 150 1.58333 -1177 150 0.5 -1178 150 0.833333 -1221 150 0.5 -1342 150 0.333333 -225 151 0.75 -301 151 0.5 -330 151 0.5 -331 151 0.5 -516 151 1.58333 -517 151 2.25 -963 151 0.333333 -964 151 0.333333 -1088 151 0.5 -1460 151 0.333333 -517 152 1.0 -154 153 1.33333 -155 153 0.333333 -156 153 0.333333 -155 154 0.333333 -156 154 0.333333 -156 155 0.333333 -158 157 0.5 -161 160 1.0 -163 162 1.0 -301 162 0.25 -316 162 0.25 -638 162 0.25 -639 162 0.25 -165 164 1.0 -167 166 1.0 -406 166 1.0 -170 169 0.5 -171 169 0.5 -171 170 0.5 -918 171 1.0 -173 172 0.5 -174 172 1.5 -174 173 0.5 -176 175 0.5 -177 175 0.5 -177 176 0.5 -926 177 1.0 -180 179 1.0 -181 179 1.0 -181 180 1.0 -183 182 1.0 -185 184 0.5 -186 184 0.5 -186 185 0.5 -1162 186 1.25 -1413 186 0.25 -1414 186 0.25 -1415 186 0.25 -188 187 1.5 -189 187 0.5 -189 188 0.5 -567 189 2.33333 -650 189 0.333333 -651 189 0.333333 -507 190 0.583333 -508 190 0.583333 -509 190 0.25 -192 191 0.333333 -193 191 0.333333 -194 191 0.5 -193 192 0.333333 -955 194 0.5 -956 194 1.08333 -1135 194 0.583333 -1136 194 0.25 -1137 194 0.25 -1138 194 0.333333 -1384 194 0.5 -1385 194 0.5 -196 195 1.25 -197 195 0.25 -198 195 0.25 -199 195 0.25 -197 196 0.25 -198 196 0.25 -199 196 0.25 -198 197 0.25 -199 197 0.25 -199 198 0.25 -201 200 0.5 -202 200 0.5 -202 201 0.833333 -301 203 1.16667 -302 203 0.833333 -303 203 0.333333 -316 203 0.333333 -317 203 0.333333 -206 205 1.0 -208 207 0.5 -209 207 0.5 -1477 207 0.5 -1478 207 0.5 -209 208 0.5 -211 210 0.5 -212 210 0.5 -212 211 0.5 -214 213 0.5 -215 213 0.5 -215 214 0.5 -217 216 1.08333 -218 216 1.66667 -219 216 0.5 -220 216 1.5 -221 216 0.25 -222 216 0.25 -223 216 0.5 -224 216 0.583333 -251 216 0.25 -252 216 0.5 -345 216 0.583333 -346 216 0.916667 -347 216 0.583333 -516 216 0.333333 -788 216 0.333333 -1041 216 0.333333 -1452 216 1.0 -218 217 1.08333 -251 217 0.25 -252 217 0.25 -219 218 0.25 -220 218 0.25 -224 218 0.583333 -251 218 0.25 -252 218 0.25 -1041 218 0.333333 -220 219 0.5 -221 219 0.583333 -222 219 1.75 -224 219 0.25 -343 219 2.47619 -473 219 0.5 -697 219 0.142857 -1145 219 2.14286 -1282 219 0.333333 -1283 219 0.333333 -1394 219 0.142857 -1395 219 0.142857 -1396 219 0.142857 -1397 219 0.142857 -1560 219 0.333333 -1561 219 0.333333 -221 220 0.25 -222 220 0.25 -224 220 0.25 -222 221 0.25 -343 221 0.333333 -1145 221 0.333333 -473 222 0.5 -1041 224 0.333333 -516 225 0.25 -517 225 0.25 -227 226 1.0 -1074 227 1.0 -229 228 1.33333 -230 228 0.333333 -231 228 0.333333 -230 229 0.333333 -231 229 0.333333 -231 230 0.333333 -234 233 0.5 -235 233 0.5 -235 234 0.5 -238 237 1.0 -240 239 1.0 -241 239 1.0 -1500 239 0.25 -1501 239 0.25 -1502 239 0.25 -1503 239 0.25 -243 242 1.0 -927 243 1.25 -1518 243 0.25 -1519 243 0.25 -1520 243 0.25 -245 244 3.5 -246 244 1.0 -247 244 1.0 -435 244 1.0 -513 244 0.5 -1230 244 1.0 -435 245 1.0 -513 245 0.5 -415 247 0.333333 -1124 247 0.333333 -1125 247 0.333333 -249 248 0.5 -250 248 0.5 -250 249 0.5 -252 251 0.25 -345 252 0.25 -346 252 0.25 -347 252 0.25 -255 254 1.0 -256 254 0.5 -1000 254 0.5 -256 255 0.5 -1000 255 0.5 -259 258 1.33333 -1166 258 0.333333 -1167 258 0.333333 -1166 259 0.333333 -1167 259 0.333333 -261 260 1.0 -263 262 0.142857 -264 262 0.142857 -265 262 0.142857 -266 262 0.142857 -267 262 0.142857 -268 262 0.142857 -269 262 0.142857 -264 263 0.142857 -265 263 0.67619 -266 263 0.67619 -267 263 0.142857 -268 263 0.67619 -269 263 0.142857 -944 263 0.2 -945 263 0.2 -265 264 0.142857 -266 264 0.142857 -267 264 0.142857 -268 264 0.142857 -269 264 0.142857 -266 265 0.92619 -267 265 0.142857 -268 265 0.92619 -269 265 0.142857 -307 265 0.25 -908 265 0.25 -944 265 0.2 -945 265 0.2 -267 266 0.142857 -268 266 0.92619 -269 266 0.142857 -307 266 0.25 -908 266 0.25 -944 266 0.2 -945 266 0.2 -268 267 0.142857 -269 267 0.142857 -269 268 0.142857 -307 268 0.25 -908 268 0.25 -944 268 0.2 -945 268 0.2 -271 270 1.0 -274 273 0.5 -275 273 0.5 -275 274 0.5 -606 275 0.333333 -607 275 0.333333 -608 275 0.333333 -277 276 0.5 -278 276 0.5 -278 277 1.0 -401 277 0.166667 -402 277 0.166667 -403 277 0.5 -404 277 0.166667 -405 277 0.166667 -595 277 0.333333 -401 278 0.166667 -402 278 0.166667 -403 278 0.5 -404 278 0.166667 -405 278 0.166667 -595 278 0.333333 -280 279 0.166667 -281 279 0.166667 -282 279 0.166667 -283 279 0.166667 -284 279 0.166667 -285 279 0.166667 -281 280 0.166667 -282 280 0.166667 -283 280 0.166667 -284 280 0.166667 -285 280 0.166667 -282 281 0.166667 -283 281 3.16667 -284 281 0.166667 -285 281 0.166667 -574 281 2.5 -575 281 0.5 -576 281 0.5 -1081 281 2.0 -1178 281 0.833333 -1342 281 0.333333 -1343 281 0.5 -1344 281 0.5 -1451 281 0.5 -283 282 0.166667 -284 282 0.166667 -285 282 0.166667 -450 282 1.0 -284 283 0.166667 -285 283 0.166667 -574 283 0.5 -1451 283 0.5 -285 284 0.166667 -287 286 0.5 -288 286 1.0 -289 286 0.5 -288 287 0.5 -289 288 0.5 -291 290 0.5 -292 290 0.5 -292 291 0.5 -294 293 2.1 -742 293 0.9 -743 293 0.9 -744 293 0.7 -931 293 0.4 -932 293 0.4 -1278 293 0.2 -1368 293 0.2 -1369 293 0.2 -742 294 1.9 -743 294 1.4 -744 294 2.7 -746 294 0.333333 -860 294 0.2 -931 294 0.4 -932 294 0.4 -1028 294 0.333333 -1029 294 0.333333 -1278 294 0.7 -1368 294 0.2 -1369 294 0.2 -1464 294 0.2 -1465 294 0.2 -1466 294 0.2 -1467 294 0.2 -1553 294 0.333333 -1554 294 0.333333 -1555 294 0.333333 -297 296 1.0 -298 296 0.333333 -299 296 0.333333 -300 296 1.33333 -299 298 0.333333 -300 298 0.333333 -300 299 0.333333 -973 300 1.0 -1497 300 1.0 -302 301 1.33333 -303 301 0.333333 -304 301 0.5 -316 301 0.583333 -317 301 0.333333 -463 301 0.5 -638 301 0.75 -639 301 0.25 -303 302 0.333333 -304 302 0.5 -1182 302 1.0 -499 303 1.0 -1026 303 0.333333 -1416 303 0.333333 -1417 303 0.333333 -306 305 0.25 -307 305 0.25 -308 305 0.583333 -309 305 0.333333 -307 306 0.25 -308 306 0.25 -308 307 0.25 -590 307 1.0 -908 307 0.25 -309 308 2.33333 -1039 308 0.5 -1040 308 1.5 -1549 308 1.0 -371 309 0.5 -490 309 1.5 -491 309 0.5 -493 309 0.5 -312 311 1.0 -314 313 0.5 -315 313 0.5 -315 314 0.5 -1398 314 1.0 -317 316 0.333333 -638 316 0.25 -639 316 0.25 -319 318 1.0 -421 319 1.0 -321 320 0.833333 -322 320 0.333333 -323 320 0.666667 -324 320 0.333333 -325 320 0.333333 -1270 320 0.5 -322 321 0.333333 -323 321 0.333333 -1270 321 0.5 -323 322 0.333333 -324 323 0.333333 -325 323 0.333333 -325 324 0.333333 -327 326 0.333333 -328 326 0.333333 -329 326 0.333333 -328 327 1.16667 -329 327 0.333333 -402 327 2.16667 -416 327 3.5 -417 327 1.0 -596 327 0.5 -894 327 0.333333 -1189 327 0.5 -1404 327 0.166667 -1405 327 0.166667 -1406 327 0.166667 -1407 327 0.166667 -1408 327 0.166667 -329 328 0.333333 -402 328 0.333333 -416 328 0.333333 -1189 328 0.5 -547 329 1.5 -1389 329 1.5 -331 330 0.5 -1214 330 0.25 -1215 330 0.25 -1216 330 0.25 -1217 330 0.25 -333 332 0.333333 -334 332 0.333333 -335 332 0.333333 -334 333 0.333333 -335 333 0.333333 -335 334 0.333333 -337 336 1.0 -631 337 0.2 -1570 337 0.2 -1571 337 0.2 -1572 337 0.2 -1573 337 0.2 -339 338 0.333333 -340 338 0.333333 -341 338 0.333333 -340 339 0.333333 -341 339 1.33333 -341 340 0.333333 -343 342 0.5 -344 342 0.5 -692 342 1.0 -344 343 0.5 -697 343 0.142857 -1145 343 1.47619 -1394 343 0.142857 -1395 343 0.142857 -1396 343 0.142857 -1397 343 0.142857 -346 345 0.583333 -347 345 0.583333 -347 346 0.583333 -516 346 0.333333 -788 346 0.333333 -349 348 0.2 -350 348 0.2 -351 348 0.2 -352 348 0.2 -353 348 0.2 -350 349 0.2 -351 349 0.2 -352 349 0.2 -353 349 0.2 -351 350 0.2 -352 350 0.2 -353 350 0.2 -686 350 1.0 -352 351 0.2 -353 351 0.2 -353 352 0.2 -355 354 0.5 -356 354 0.5 -356 355 0.5 -358 357 0.833333 -359 357 0.5 -360 357 0.333333 -361 357 0.333333 -359 358 0.5 -360 358 0.333333 -361 358 0.333333 -361 360 0.333333 -363 362 1.0 -364 362 0.5 -365 362 0.5 -805 362 0.2 -806 362 0.2 -807 362 0.2 -1071 362 0.2 -1349 362 0.25 -1350 362 0.25 -1351 362 0.25 -1352 362 0.25 -365 364 0.5 -367 366 0.5 -368 366 0.5 -368 367 0.5 -371 370 0.5 -759 371 0.5 -866 371 0.5 -867 371 0.5 -373 372 0.5 -374 372 0.5 -374 373 0.5 -376 375 1.91667 -377 375 2.91667 -378 375 0.333333 -1263 375 0.333333 -1295 375 0.25 -377 376 1.91667 -378 376 0.333333 -1263 376 0.333333 -1295 376 0.25 -378 377 0.333333 -1263 377 0.333333 -1295 377 0.25 -1347 377 0.5 -1348 377 0.5 -380 379 0.5 -381 379 0.5 -381 380 0.5 -383 382 0.5 -384 382 0.5 -384 383 0.5 -386 385 0.142857 -387 385 0.142857 -388 385 0.142857 -389 385 0.142857 -390 385 0.142857 -391 385 0.142857 -392 385 0.142857 -387 386 0.142857 -388 386 0.142857 -389 386 0.142857 -390 386 0.142857 -391 386 0.142857 -392 386 0.142857 -388 387 0.142857 -389 387 0.142857 -390 387 0.142857 -391 387 0.142857 -392 387 0.142857 -389 388 0.142857 -390 388 0.142857 -391 388 0.142857 -392 388 0.142857 -390 389 0.142857 -391 389 0.142857 -392 389 0.142857 -391 390 0.142857 -392 390 0.142857 -392 391 0.142857 -394 393 0.333333 -395 393 0.333333 -396 393 0.333333 -395 394 0.333333 -396 394 0.333333 -396 395 0.333333 -398 397 0.333333 -399 397 0.333333 -400 397 0.333333 -399 398 0.333333 -400 398 0.333333 -400 399 0.333333 -402 401 0.166667 -403 401 0.166667 -404 401 0.166667 -405 401 0.166667 -403 402 0.166667 -404 402 0.166667 -405 402 0.166667 -416 402 0.833333 -417 402 1.0 -894 402 0.333333 -404 403 0.166667 -405 403 0.166667 -595 403 0.333333 -405 404 0.166667 -409 408 0.25 -410 408 0.583333 -411 408 0.25 -412 408 0.583333 -413 408 0.333333 -410 409 0.25 -411 409 0.25 -412 409 0.25 -411 410 0.25 -412 410 0.583333 -413 410 0.333333 -412 411 0.25 -413 412 0.333333 -415 414 1.0 -922 415 1.0 -1124 415 0.333333 -1125 415 0.333333 -1233 415 0.5 -1234 415 0.5 -596 416 0.5 -1404 416 0.166667 -1405 416 0.166667 -1406 416 0.166667 -1407 416 0.166667 -1408 416 0.166667 -419 418 1.0 -423 422 0.5 -424 422 0.5 -424 423 0.5 -426 425 0.5 -427 425 0.5 -427 426 0.5 -429 428 1.0 -1361 428 0.333333 -1362 428 0.333333 -431 430 1.0 -432 430 1.0 -434 433 1.0 -437 436 0.5 -438 436 0.5 -438 437 0.5 -440 439 1.0 -441 439 0.5 -443 442 1.0 -675 443 0.5 -676 443 0.5 -738 443 0.5 -739 443 1.0 -445 444 1.0 -699 445 1.0 -447 446 0.333333 -448 446 0.333333 -449 446 0.333333 -448 447 0.333333 -449 447 0.333333 -449 448 0.333333 -453 452 0.142857 -454 452 0.142857 -455 452 0.142857 -456 452 0.142857 -457 452 0.142857 -458 452 0.142857 -459 452 0.142857 -454 453 0.142857 -455 453 0.142857 -456 453 0.142857 -457 453 0.142857 -458 453 0.642857 -459 453 0.642857 -455 454 0.142857 -456 454 0.142857 -457 454 0.142857 -458 454 0.142857 -459 454 0.142857 -456 455 0.142857 -457 455 0.142857 -458 455 0.142857 -459 455 0.142857 -457 456 0.142857 -458 456 0.142857 -459 456 0.142857 -458 457 0.142857 -459 457 0.142857 -459 458 0.642857 -461 460 0.333333 -462 460 0.333333 -463 460 0.333333 -462 461 0.333333 -463 461 0.333333 -463 462 0.333333 -638 463 0.5 -465 464 1.5 -466 464 0.5 -466 465 0.5 -468 467 0.25 -469 467 0.25 -470 467 0.25 -471 467 0.25 -469 468 0.25 -470 468 0.25 -471 468 0.25 -470 469 0.25 -471 469 0.25 -471 470 0.25 -473 472 0.833333 -474 472 0.5 -984 472 0.333333 -1091 472 0.333333 -474 473 0.5 -984 473 2.16667 -985 473 0.333333 -1091 473 0.333333 -1092 473 0.833333 -476 475 1.0 -477 475 0.5 -478 475 0.5 -478 477 0.5 -940 478 1.0 -480 479 0.333333 -481 479 0.333333 -482 479 0.333333 -481 480 0.333333 -482 480 0.333333 -482 481 0.333333 -1235 481 0.5 -1236 481 0.5 -1250 481 0.5 -1251 481 0.5 -1046 482 1.0 -1244 482 0.25 -1245 482 0.25 -1246 482 0.25 -1247 482 0.25 -1455 482 1.0 -484 483 1.0 -487 486 1.0 -489 488 0.333333 -491 490 0.5 -492 490 1.0 -493 490 0.5 -495 494 0.5 -496 494 0.5 -496 495 0.5 -780 496 0.5 -781 496 0.5 -1409 496 0.5 -1410 496 0.5 -498 497 1.0 -501 500 1.0 -502 500 2.5 -503 500 1.5 -1221 500 0.5 -502 501 1.0 -503 502 0.5 -506 505 1.0 -508 507 1.08333 -509 507 0.75 -509 508 0.75 -512 511 1.0 -515 514 0.833333 -516 514 0.833333 -517 514 0.333333 -516 515 2.33333 -517 515 0.333333 -674 515 0.5 -517 516 2.91667 -674 516 0.5 -788 516 0.333333 -1086 516 0.5 -1087 516 2.5 -1088 516 1.0 -1089 516 0.5 -963 517 0.333333 -964 517 0.333333 -1341 517 1.0 -1460 517 0.333333 -519 518 1.0 -521 520 1.0 -523 522 0.25 -524 522 0.25 -525 522 0.25 -526 522 0.25 -527 522 2.0 -1381 522 0.5 -1588 522 0.5 -524 523 0.25 -525 523 0.25 -526 523 0.25 -742 523 0.333333 -746 523 0.333333 -1356 523 0.333333 -525 524 0.25 -526 524 0.25 -1322 524 1.0 -526 525 0.25 -529 528 1.0 -531 530 0.533333 -532 530 0.533333 -533 530 0.333333 -1533 530 0.2 -1534 530 0.2 -1535 530 0.2 -532 531 0.533333 -533 531 0.333333 -1533 531 0.2 -1534 531 0.2 -1535 531 0.2 -533 532 0.333333 -1533 532 0.2 -1534 532 0.2 -1535 532 0.2 -535 534 1.0 -538 537 0.5 -539 537 0.833333 -540 537 0.333333 -541 537 0.333333 -542 537 0.333333 -689 537 0.333333 -690 537 0.333333 -539 538 0.5 -689 539 0.333333 -690 539 0.333333 -541 540 0.333333 -542 540 0.333333 -542 541 0.333333 -545 544 1.0 -547 546 1.0 -1239 547 1.0 -1389 547 0.5 -549 548 0.333333 -550 548 0.333333 -550 549 0.333333 -1030 550 0.5 -553 552 0.5 -554 552 0.5 -554 553 0.5 -557 556 0.5 -558 556 0.5 -558 557 0.5 -560 559 1.0 -562 561 0.458333 -564 563 0.333333 -565 563 0.333333 -566 563 0.333333 -565 564 0.333333 -566 564 0.333333 -566 565 0.333333 -650 567 0.333333 -651 567 0.333333 -569 568 1.0 -571 570 1.0 -573 572 1.0 -575 574 0.5 -576 574 0.5 -578 577 1.0 -581 580 0.5 -582 580 0.5 -582 581 0.5 -584 583 1.0 -586 585 0.333333 -587 585 0.333333 -587 586 0.333333 -729 587 0.5 -590 589 0.583333 -591 589 0.583333 -592 589 0.333333 -1180 589 0.25 -1181 589 0.25 -591 590 1.58333 -592 590 0.333333 -1180 590 0.25 -1181 590 0.25 -592 591 0.333333 -1180 591 0.25 -1181 591 0.25 -594 593 1.0 -598 597 1.0 -789 597 1.0 -790 597 1.0 -600 599 1.0 -603 602 1.0 -607 606 0.333333 -608 606 0.333333 -608 607 0.333333 -610 609 0.5 -611 609 0.333333 -612 609 0.333333 -612 611 0.333333 -615 614 1.0 -617 616 1.0 -619 618 0.5 -620 618 0.5 -620 619 0.5 -622 621 1.0 -624 623 1.0 -626 625 0.333333 -627 625 0.333333 -628 625 0.333333 -627 626 0.333333 -628 626 0.333333 -628 627 0.333333 -630 629 0.5 -631 629 0.5 -631 630 1.0 -1579 630 0.5 -783 631 1.0 -784 631 0.5 -1570 631 0.2 -1571 631 0.2 -1572 631 0.2 -1573 631 0.2 -1574 631 0.5 -1579 631 0.5 -633 632 1.0 -636 635 0.5 -637 635 0.5 -637 636 0.5 -639 638 0.25 -640 638 1.0 -643 642 1.0 -712 642 0.5 -713 642 0.5 -1429 645 0.0526316 -1430 645 0.0526316 -1431 645 0.0526316 -1432 645 0.0526316 -1433 645 0.0526316 -1434 645 0.0526316 -1435 645 0.0526316 -1436 645 0.0526316 -1437 645 0.0526316 -1438 645 0.0526316 -1439 645 0.0526316 -1440 645 0.0526316 -1441 645 0.0526316 -1442 645 0.0526316 -1443 645 0.0526316 -1444 645 0.0526316 -1445 645 0.0526316 -1446 645 0.0526316 -1447 645 0.0526316 -853 646 0.5 -648 647 1.0 -651 650 0.333333 -653 652 0.333333 -654 652 2.08333 -655 652 2.08333 -656 652 0.333333 -657 652 0.583333 -893 652 0.333333 -654 653 0.333333 -655 653 0.333333 -655 654 2.08333 -656 654 0.333333 -657 654 0.916667 -774 654 0.333333 -863 654 0.5 -864 654 0.5 -865 654 0.5 -893 654 0.666667 -1130 654 0.833333 -656 655 0.333333 -657 655 0.583333 -893 655 0.333333 -774 657 0.333333 -1130 657 0.333333 -659 658 0.333333 -660 658 0.333333 -661 658 0.333333 -660 659 0.333333 -661 659 0.333333 -661 660 0.333333 -663 662 0.75 -664 662 0.25 -665 662 0.25 -666 662 0.25 -677 662 0.5 -792 662 0.333333 -793 662 0.333333 -794 662 0.333333 -664 663 0.25 -665 663 0.25 -666 663 0.25 -677 663 0.5 -665 664 0.25 -666 664 0.25 -666 665 0.25 -668 667 1.0 -670 669 1.0 -671 669 1.0 -721 670 1.0 -673 672 1.0 -676 675 0.5 -1556 676 0.333333 -1557 676 0.333333 -1558 676 0.333333 -679 678 0.5 -680 678 0.5 -680 679 0.5 -682 681 0.333333 -683 681 0.333333 -684 681 0.333333 -683 682 0.333333 -684 682 0.333333 -684 683 0.333333 -690 689 0.333333 -694 693 0.2 -695 693 0.2 -696 693 0.2 -697 693 1.2 -698 693 0.2 -695 694 0.2 -696 694 0.2 -697 694 0.2 -698 694 0.2 -696 695 0.2 -697 695 0.2 -698 695 0.2 -715 695 0.25 -716 695 0.25 -717 695 0.25 -718 695 0.25 -697 696 0.2 -698 696 0.2 -698 697 0.2 -1145 697 0.142857 -1394 697 0.142857 -1395 697 0.142857 -1396 697 0.142857 -1397 697 0.142857 -701 700 0.333333 -702 700 0.333333 -702 701 0.333333 -705 704 0.333333 -706 704 0.333333 -707 704 0.333333 -706 705 0.333333 -707 705 0.333333 -707 706 0.333333 -710 709 0.333333 -713 712 0.5 -716 715 0.25 -717 715 0.25 -718 715 0.25 -717 716 0.25 -718 716 0.25 -718 717 0.25 -720 719 2.0 -752 719 0.5 -753 719 0.5 -1346 721 1.0 -1454 721 1.0 -724 723 0.333333 -725 723 0.333333 -726 723 0.333333 -725 724 0.333333 -726 724 0.333333 -726 725 0.333333 -731 730 1.0 -733 732 0.5 -734 732 0.5 -734 733 0.5 -737 736 0.5 -743 742 1.4 -744 742 1.2 -745 742 1.0 -746 742 2.33333 -931 742 0.7 -932 742 0.7 -1278 742 0.2 -1356 742 0.333333 -744 743 0.7 -931 743 0.2 -932 743 0.2 -1278 743 0.2 -1278 744 0.7 -1279 744 0.333333 -1280 744 0.333333 -1281 744 0.333333 -1028 746 0.333333 -1029 746 0.333333 -1356 746 0.333333 -748 747 1.0 -751 750 1.0 -753 752 0.5 -755 754 1.0 -757 756 0.5 -758 756 0.5 -759 756 1.0 -760 756 1.5 -761 756 1.86667 -762 756 0.333333 -763 756 0.333333 -764 756 0.533333 -765 756 0.533333 -775 756 0.2 -892 756 0.2 -1123 756 0.5 -758 757 1.25 -977 757 0.25 -977 758 0.25 -762 761 0.666667 -763 761 0.666667 -764 761 0.533333 -765 761 0.533333 -774 761 1.33333 -775 761 1.53333 -776 761 0.333333 -892 761 0.2 -763 762 0.666667 -765 764 0.866667 -775 764 0.2 -892 764 0.2 -1255 764 0.833333 -775 765 0.2 -892 765 0.2 -1255 765 0.333333 -767 766 0.333333 -768 766 0.333333 -769 766 0.333333 -768 767 0.333333 -769 767 0.333333 -769 768 0.333333 -771 770 0.2 -772 770 0.2 -773 770 0.2 -772 771 0.2 -773 771 0.2 -773 772 0.2 -775 774 1.33333 -776 774 0.333333 -1130 774 0.333333 -776 775 0.333333 -892 775 0.2 -778 777 1.0 -781 780 0.5 -784 783 0.5 -1574 783 0.5 -786 785 0.5 -787 785 0.5 -787 786 0.5 -790 789 1.0 -793 792 0.333333 -794 792 0.333333 -794 793 0.333333 -796 795 0.25 -797 795 0.25 -798 795 0.25 -797 796 0.25 -798 796 0.25 -798 797 0.25 -800 799 0.2 -801 799 0.2 -802 799 0.2 -803 799 0.2 -804 799 0.2 -801 800 0.2 -802 800 0.2 -803 800 0.2 -804 800 0.2 -802 801 0.2 -803 801 0.2 -804 801 0.2 -803 802 0.2 -804 802 0.2 -804 803 0.2 -806 805 0.92619 -807 805 0.92619 -808 805 0.25 -1070 805 0.142857 -1071 805 0.342857 -1072 805 0.142857 -1073 805 0.142857 -807 806 0.92619 -808 806 0.25 -1016 806 0.333333 -1070 806 0.142857 -1071 806 0.67619 -1072 806 0.142857 -1073 806 0.142857 -808 807 0.25 -1070 807 0.142857 -1071 807 0.342857 -1072 807 0.142857 -1073 807 0.142857 -810 809 1.0 -813 812 1.0 -815 814 0.5 -816 814 0.5 -816 815 0.5 -818 817 1.0 -820 819 1.0 -1170 820 1.0 -822 821 0.333333 -823 821 0.333333 -824 821 0.333333 -823 822 0.333333 -824 822 0.333333 -824 823 0.333333 -826 825 0.111111 -827 825 0.111111 -828 825 0.111111 -829 825 0.111111 -830 825 0.111111 -831 825 0.111111 -832 825 0.111111 -833 825 0.111111 -834 825 0.111111 -827 826 0.111111 -828 826 0.111111 -829 826 0.111111 -830 826 0.111111 -831 826 0.111111 -832 826 0.111111 -833 826 0.111111 -834 826 0.111111 -828 827 0.111111 -829 827 0.111111 -830 827 0.111111 -831 827 0.111111 -832 827 0.111111 -833 827 0.111111 -834 827 0.111111 -829 828 0.111111 -830 828 0.111111 -831 828 0.111111 -832 828 0.111111 -833 828 0.111111 -834 828 0.111111 -830 829 0.111111 -831 829 0.111111 -832 829 0.111111 -833 829 0.111111 -834 829 0.111111 -831 830 0.111111 -832 830 0.111111 -833 830 0.111111 -834 830 0.111111 -832 831 0.111111 -833 831 0.111111 -834 831 0.111111 -833 832 0.111111 -834 832 0.111111 -834 833 0.111111 -836 835 0.5 -837 835 0.5 -837 836 0.5 -1190 840 0.2 -1191 840 0.2 -842 841 1.5 -843 841 0.5 -843 842 0.5 -1273 843 0.75 -1274 843 0.75 -1275 843 0.25 -1276 843 0.25 -1536 843 1.0 -845 844 0.333333 -846 844 0.333333 -847 844 0.333333 -846 845 0.333333 -847 845 0.333333 -847 846 0.333333 -849 848 1.0 -851 850 0.5 -852 850 0.5 -852 851 0.5 -856 855 0.5 -857 855 0.5 -857 856 0.5 -861 860 0.5 -862 860 0.5 -1464 860 0.2 -1465 860 0.2 -1466 860 0.2 -1467 860 0.2 -862 861 0.5 -864 863 0.5 -867 866 0.5 -871 870 0.25 -872 870 0.25 -873 870 0.25 -874 870 0.25 -872 871 0.25 -873 871 0.25 -874 871 0.25 -873 872 0.25 -874 872 0.25 -1268 872 1.0 -874 873 0.25 -878 877 0.25 -879 877 0.25 -880 877 0.25 -881 877 0.25 -879 878 0.25 -880 878 0.25 -881 878 0.25 -880 879 0.25 -881 879 0.25 -881 880 0.25 -1339 882 1.0 -884 883 0.5 -885 883 0.5 -885 884 0.5 -887 886 1.0 -889 888 0.5 -890 888 0.5 -890 889 0.5 -896 895 0.25 -897 895 0.25 -898 895 0.25 -899 895 0.25 -897 896 0.25 -898 896 0.25 -899 896 0.25 -898 897 0.25 -899 897 0.25 -899 898 0.25 -901 900 0.5 -902 900 0.5 -1318 900 1.0 -902 901 0.5 -904 903 0.5 -905 903 0.5 -905 904 0.5 -907 906 1.0 -910 909 0.5 -911 909 0.5 -911 910 0.5 -913 912 0.2 -914 912 0.2 -915 912 0.2 -916 912 0.2 -917 912 0.2 -914 913 0.342857 -915 913 0.342857 -916 913 0.985714 -917 913 0.2 -1000 913 0.142857 -1201 913 0.785714 -1202 913 0.142857 -1203 913 0.142857 -1204 913 0.142857 -1205 913 0.142857 -1206 913 0.142857 -1207 913 0.142857 -1208 913 0.142857 -915 914 0.342857 -916 914 0.342857 -917 914 0.2 -1201 914 0.142857 -1206 914 0.142857 -1207 914 0.142857 -1208 914 0.142857 -916 915 0.342857 -917 915 0.2 -1201 915 0.142857 -1206 915 0.142857 -1207 915 0.142857 -1208 915 0.142857 -917 916 0.2 -1000 916 0.142857 -1201 916 1.11905 -1202 916 0.142857 -1203 916 0.142857 -1204 916 0.142857 -1205 916 0.142857 -1206 916 0.142857 -1207 916 0.142857 -1208 916 0.142857 -1256 916 0.333333 -1257 916 0.333333 -921 920 1.0 -924 923 0.5 -925 923 0.5 -925 924 0.5 -1518 927 0.25 -1519 927 0.25 -1520 927 0.25 -930 929 1.0 -1418 930 1.0 -932 931 1.9 -933 931 1.0 -1175 931 0.5 -1176 931 0.5 -1356 931 1.0 -1368 931 0.2 -1369 931 0.2 -1368 932 0.2 -1369 932 0.2 -936 935 0.25 -937 935 0.25 -938 935 0.25 -937 936 0.25 -938 936 0.25 -938 937 0.25 -942 941 0.5 -943 941 0.5 -943 942 0.5 -945 944 0.2 -948 947 1.0 -1271 947 0.5 -1272 947 0.5 -950 949 1.0 -952 951 1.16667 -953 951 1.16667 -954 951 0.666667 -953 952 1.16667 -954 952 0.666667 -954 953 0.666667 -956 955 0.5 -1135 956 0.583333 -1136 956 0.25 -1137 956 0.25 -1138 956 0.333333 -958 957 0.5 -959 957 0.5 -959 958 0.5 -961 960 0.5 -962 960 0.5 -962 961 0.5 -964 963 0.333333 -966 965 0.2 -967 965 0.2 -968 965 0.2 -969 965 0.2 -970 965 0.2 -967 966 0.2 -968 966 0.2 -969 966 0.2 -970 966 0.2 -968 967 0.2 -969 967 0.2 -970 967 0.2 -969 968 0.2 -970 968 0.2 -970 969 0.2 -973 972 1.0 -989 973 1.0 -1002 973 0.833333 -1003 973 0.833333 -1004 973 0.333333 -975 974 0.5 -976 974 0.5 -976 975 0.5 -1129 976 1.0 -979 978 1.0 -981 980 0.5 -982 980 0.5 -982 981 0.5 -984 983 1.0 -985 983 0.5 -986 983 0.5 -985 984 0.833333 -986 984 0.5 -1091 984 0.333333 -1092 984 0.833333 -1092 985 0.333333 -988 987 1.0 -993 992 1.0 -995 994 0.25 -996 994 0.25 -997 994 0.25 -998 994 0.25 -996 995 0.25 -997 995 0.25 -998 995 0.25 -997 996 0.25 -998 996 0.25 -998 997 0.25 -1000 999 1.0 -1201 1000 0.142857 -1202 1000 0.142857 -1203 1000 0.142857 -1204 1000 0.142857 -1205 1000 0.142857 -1504 1000 0.5 -1514 1000 0.5 -1003 1002 0.833333 -1004 1002 0.333333 -1004 1003 0.333333 -1007 1006 1.0 -1010 1009 1.0 -1045 1010 1.0 -1012 1011 1.0 -1014 1013 1.0 -1071 1016 0.333333 -1018 1017 1.2 -1306 1017 0.2 -1307 1017 0.2 -1308 1017 0.2 -1309 1017 0.2 -1303 1018 0.5 -1304 1018 0.5 -1305 1018 1.0 -1306 1018 0.2 -1307 1018 0.2 -1308 1018 0.2 -1309 1018 0.2 -1022 1021 0.25 -1023 1021 0.75 -1023 1022 0.25 -1025 1024 0.5 -1027 1026 1.0 -1416 1026 0.333333 -1417 1026 0.333333 -1029 1028 0.333333 -1032 1031 1.0 -1034 1033 1.0 -1036 1035 1.0 -1037 1035 0.5 -1038 1035 0.5 -1038 1037 0.5 -1040 1039 0.5 -1043 1042 0.5 -1044 1042 0.5 -1044 1043 0.5 -1048 1047 0.25 -1049 1047 0.25 -1050 1047 0.25 -1049 1048 0.25 -1050 1048 0.25 -1050 1049 0.25 -1053 1052 1.0 -1055 1054 1.0 -1056 1054 0.333333 -1057 1054 0.333333 -1058 1054 0.333333 -1057 1056 0.333333 -1058 1056 0.333333 -1058 1057 0.333333 -1061 1060 0.111111 -1062 1060 0.111111 -1063 1060 0.111111 -1064 1060 0.111111 -1065 1060 0.111111 -1066 1060 0.111111 -1067 1060 0.111111 -1068 1060 0.111111 -1069 1060 0.111111 -1412 1060 1.0 -1062 1061 0.111111 -1063 1061 0.111111 -1064 1061 0.111111 -1065 1061 0.111111 -1066 1061 0.111111 -1067 1061 0.111111 -1068 1061 0.111111 -1069 1061 0.111111 -1063 1062 0.111111 -1064 1062 0.111111 -1065 1062 0.111111 -1066 1062 0.111111 -1067 1062 0.111111 -1068 1062 0.111111 -1069 1062 0.111111 -1064 1063 0.111111 -1065 1063 0.111111 -1066 1063 0.111111 -1067 1063 0.111111 -1068 1063 0.111111 -1069 1063 0.111111 -1065 1064 0.111111 -1066 1064 0.111111 -1067 1064 0.111111 -1068 1064 0.111111 -1069 1064 0.111111 -1066 1065 0.111111 -1067 1065 0.111111 -1068 1065 0.111111 -1069 1065 0.111111 -1067 1066 0.111111 -1068 1066 0.111111 -1069 1066 0.111111 -1068 1067 0.111111 -1069 1067 0.111111 -1069 1068 0.111111 -1071 1070 0.142857 -1072 1070 0.142857 -1073 1070 0.142857 -1072 1071 0.142857 -1073 1071 0.142857 -1073 1072 0.142857 -1079 1078 1.0 -1083 1082 0.5 -1087 1086 0.5 -1088 1087 0.5 -1089 1087 0.5 -1094 1093 0.333333 -1095 1093 0.333333 -1096 1093 0.333333 -1095 1094 0.333333 -1096 1094 0.333333 -1096 1095 0.333333 -1098 1097 0.5 -1099 1097 0.5 -1099 1098 0.5 -1102 1101 0.5 -1103 1101 0.5 -1103 1102 0.5 -1106 1105 0.125 -1107 1105 0.125 -1108 1105 0.125 -1109 1105 0.125 -1110 1105 0.125 -1111 1105 0.125 -1112 1105 0.125 -1113 1105 0.125 -1107 1106 0.125 -1108 1106 0.125 -1109 1106 0.125 -1110 1106 0.125 -1111 1106 0.125 -1112 1106 0.125 -1113 1106 0.125 -1108 1107 0.125 -1109 1107 0.125 -1110 1107 0.125 -1111 1107 0.125 -1112 1107 0.125 -1113 1107 0.125 -1357 1107 0.333333 -1358 1107 0.333333 -1411 1107 0.333333 -1109 1108 0.125 -1110 1108 0.125 -1111 1108 0.125 -1112 1108 0.125 -1113 1108 0.125 -1110 1109 0.125 -1111 1109 0.125 -1112 1109 0.125 -1113 1109 0.125 -1111 1110 0.125 -1112 1110 0.125 -1113 1110 0.125 -1112 1111 0.125 -1113 1111 0.125 -1113 1112 0.125 -1115 1114 1.0 -1117 1116 0.25 -1118 1116 0.25 -1119 1116 0.25 -1120 1116 0.25 -1118 1117 0.25 -1119 1117 0.25 -1120 1117 0.25 -1119 1118 0.25 -1120 1118 0.25 -1120 1119 0.25 -1515 1120 0.333333 -1516 1120 0.333333 -1517 1120 0.333333 -1122 1121 0.5 -1125 1124 0.333333 -1128 1127 1.0 -1132 1131 1.0 -1134 1133 1.0 -1136 1135 0.25 -1137 1135 0.25 -1138 1135 0.333333 -1137 1136 0.25 -1140 1139 1.0 -1142 1141 1.0 -1488 1142 0.5 -1489 1142 0.5 -1282 1145 0.333333 -1283 1145 0.333333 -1394 1145 0.142857 -1395 1145 0.142857 -1396 1145 0.142857 -1397 1145 0.142857 -1560 1145 0.333333 -1561 1145 0.333333 -1147 1146 0.25 -1148 1146 0.25 -1149 1146 0.25 -1150 1146 0.25 -1148 1147 0.25 -1149 1147 0.25 -1150 1147 0.25 -1149 1148 0.25 -1150 1148 0.25 -1150 1149 0.25 -1153 1152 0.125 -1154 1152 0.125 -1155 1152 0.125 -1156 1152 0.125 -1157 1152 0.125 -1158 1152 0.125 -1159 1152 0.125 -1160 1152 0.125 -1154 1153 0.125 -1155 1153 0.125 -1156 1153 0.125 -1157 1153 0.125 -1158 1153 0.125 -1159 1153 0.125 -1160 1153 0.125 -1155 1154 0.125 -1156 1154 0.125 -1157 1154 0.125 -1158 1154 0.125 -1159 1154 0.125 -1160 1154 0.125 -1156 1155 0.125 -1157 1155 0.125 -1158 1155 0.125 -1159 1155 0.125 -1160 1155 0.125 -1157 1156 0.125 -1158 1156 0.125 -1159 1156 0.125 -1160 1156 0.125 -1158 1157 0.125 -1159 1157 0.125 -1160 1157 0.125 -1159 1158 0.125 -1160 1158 0.125 -1160 1159 0.125 -1163 1162 0.5 -1413 1162 0.25 -1414 1162 0.25 -1415 1162 0.25 -1165 1164 1.0 -1167 1166 0.333333 -1169 1168 1.0 -1176 1175 0.5 -1342 1178 0.333333 -1181 1180 0.25 -1185 1184 0.5 -1186 1184 0.5 -1186 1185 0.5 -1191 1190 0.2 -1194 1193 1.0 -1196 1195 0.333333 -1197 1195 0.333333 -1197 1196 0.333333 -1199 1198 0.5 -1200 1198 0.5 -1200 1199 0.5 -1202 1201 0.142857 -1203 1201 0.142857 -1204 1201 0.142857 -1205 1201 0.142857 -1206 1201 0.142857 -1207 1201 0.142857 -1208 1201 0.142857 -1256 1201 0.333333 -1257 1201 0.333333 -1203 1202 0.142857 -1204 1202 0.142857 -1205 1202 0.142857 -1204 1203 0.142857 -1205 1203 0.142857 -1205 1204 0.142857 -1207 1206 0.142857 -1208 1206 0.142857 -1208 1207 0.142857 -1210 1209 0.333333 -1211 1209 0.333333 -1212 1209 0.333333 -1211 1210 0.333333 -1212 1210 0.333333 -1212 1211 0.333333 -1215 1214 0.25 -1216 1214 0.25 -1217 1214 0.25 -1216 1215 0.25 -1217 1215 0.25 -1217 1216 0.25 -1219 1218 1.0 -1223 1222 0.5 -1224 1222 0.5 -1224 1223 0.5 -1226 1225 1.0 -1227 1225 1.0 -1345 1225 1.0 -1229 1228 0.25 -1232 1231 1.0 -1234 1233 0.5 -1236 1235 0.5 -1238 1237 1.0 -1241 1240 1.0 -1243 1242 1.0 -1245 1244 0.25 -1246 1244 0.25 -1247 1244 0.25 -1246 1245 0.25 -1247 1245 0.25 -1247 1246 0.25 -1249 1248 1.0 -1251 1250 0.5 -1253 1252 0.5 -1254 1252 1.5 -1254 1253 0.5 -1257 1256 0.333333 -1259 1258 1.0 -1261 1260 0.5 -1262 1260 0.5 -1262 1261 0.5 -1265 1264 0.333333 -1266 1264 0.333333 -1267 1264 0.333333 -1266 1265 0.333333 -1267 1265 0.333333 -1267 1266 0.333333 -1272 1271 0.5 -1274 1273 0.75 -1275 1273 0.25 -1276 1273 0.25 -1275 1274 0.25 -1276 1274 0.25 -1276 1275 0.25 -1280 1279 0.333333 -1281 1279 0.333333 -1281 1280 0.333333 -1283 1282 0.333333 -1287 1286 0.25 -1288 1286 0.25 -1289 1286 0.25 -1290 1286 0.25 -1364 1286 0.25 -1365 1286 0.25 -1366 1286 0.25 -1367 1286 0.25 -1288 1287 0.25 -1289 1287 0.25 -1290 1287 0.25 -1289 1288 0.25 -1290 1288 0.25 -1290 1289 0.25 -1293 1292 0.5 -1294 1292 0.5 -1294 1293 0.5 -1377 1294 0.5 -1378 1294 0.5 -1299 1298 1.0 -1304 1303 0.5 -1307 1306 0.2 -1308 1306 0.2 -1309 1306 0.2 -1308 1307 0.2 -1309 1307 0.2 -1309 1308 0.2 -1311 1310 1.0 -1313 1312 0.25 -1314 1312 0.25 -1315 1312 0.25 -1316 1312 0.25 -1314 1313 0.25 -1315 1313 0.25 -1316 1313 0.25 -1315 1314 0.25 -1316 1314 0.25 -1316 1315 0.25 -1468 1315 0.25 -1469 1315 0.25 -1470 1315 0.25 -1321 1320 1.0 -1324 1323 0.5 -1325 1323 0.5 -1325 1324 0.5 -1327 1326 1.0 -1329 1328 1.0 -1332 1331 0.5 -1333 1331 0.5 -1333 1332 0.5 -1336 1335 0.333333 -1337 1335 0.333333 -1338 1335 0.333333 -1337 1336 0.333333 -1338 1336 0.333333 -1419 1336 1.0 -1338 1337 0.333333 -1344 1343 0.5 -1348 1347 0.5 -1350 1349 0.25 -1351 1349 0.25 -1352 1349 0.25 -1351 1350 0.25 -1352 1350 0.25 -1352 1351 0.25 -1355 1354 1.0 -1357 1356 1.0 -1358 1356 1.0 -1359 1356 1.0 -1358 1357 2.33333 -1411 1357 0.333333 -1411 1358 0.333333 -1453 1360 1.0 -1362 1361 0.333333 -1365 1364 0.25 -1366 1364 0.25 -1367 1364 0.25 -1366 1365 0.25 -1367 1365 0.25 -1367 1366 0.25 -1369 1368 0.2 -1371 1370 1.0 -1373 1372 1.0 -1375 1374 0.5 -1376 1374 0.5 -1376 1375 0.5 -1378 1377 0.5 -1385 1384 0.5 -1387 1386 1.0 -1391 1390 0.5 -1392 1390 0.5 -1392 1391 0.5 -1395 1394 0.142857 -1396 1394 0.142857 -1397 1394 0.142857 -1396 1395 0.142857 -1397 1395 0.142857 -1397 1396 0.142857 -1400 1399 0.25 -1401 1399 0.25 -1402 1399 0.25 -1403 1399 0.25 -1401 1400 0.25 -1402 1400 0.25 -1403 1400 0.25 -1402 1401 0.25 -1403 1401 0.25 -1403 1402 0.25 -1405 1404 0.166667 -1406 1404 0.166667 -1407 1404 0.166667 -1408 1404 0.166667 -1406 1405 0.166667 -1407 1405 0.166667 -1408 1405 0.166667 -1407 1406 0.166667 -1408 1406 0.166667 -1408 1407 0.166667 -1410 1409 0.5 -1414 1413 0.25 -1415 1413 0.25 -1415 1414 0.25 -1417 1416 0.333333 -1421 1420 0.333333 -1422 1420 0.333333 -1423 1420 0.333333 -1422 1421 0.333333 -1423 1421 0.333333 -1423 1422 0.333333 -1425 1424 0.5 -1427 1426 0.5 -1428 1426 0.5 -1428 1427 0.5 -1430 1429 0.385965 -1431 1429 0.385965 -1432 1429 0.0526316 -1433 1429 0.0526316 -1434 1429 0.0526316 -1435 1429 0.0526316 -1436 1429 0.0526316 -1437 1429 0.0526316 -1438 1429 0.0526316 -1439 1429 0.0526316 -1440 1429 0.0526316 -1441 1429 0.0526316 -1442 1429 0.0526316 -1443 1429 0.0526316 -1444 1429 0.0526316 -1445 1429 0.0526316 -1446 1429 0.0526316 -1447 1429 0.0526316 -1448 1429 0.333333 -1431 1430 0.385965 -1432 1430 0.0526316 -1433 1430 0.0526316 -1434 1430 0.0526316 -1435 1430 0.0526316 -1436 1430 0.0526316 -1437 1430 0.0526316 -1438 1430 0.0526316 -1439 1430 0.0526316 -1440 1430 0.0526316 -1441 1430 0.0526316 -1442 1430 0.0526316 -1443 1430 0.0526316 -1444 1430 0.0526316 -1445 1430 0.0526316 -1446 1430 0.0526316 -1447 1430 0.0526316 -1448 1430 0.333333 -1432 1431 0.0526316 -1433 1431 0.0526316 -1434 1431 0.0526316 -1435 1431 0.0526316 -1436 1431 0.0526316 -1437 1431 0.0526316 -1438 1431 0.0526316 -1439 1431 0.0526316 -1440 1431 0.0526316 -1441 1431 0.0526316 -1442 1431 0.0526316 -1443 1431 0.0526316 -1444 1431 0.0526316 -1445 1431 0.0526316 -1446 1431 0.0526316 -1447 1431 0.0526316 -1448 1431 0.333333 -1433 1432 0.0526316 -1434 1432 0.0526316 -1435 1432 0.0526316 -1436 1432 0.0526316 -1437 1432 0.0526316 -1438 1432 0.0526316 -1439 1432 0.0526316 -1440 1432 0.0526316 -1441 1432 0.0526316 -1442 1432 0.0526316 -1443 1432 0.0526316 -1444 1432 0.0526316 -1445 1432 0.0526316 -1446 1432 0.0526316 -1447 1432 0.0526316 -1434 1433 0.0526316 -1435 1433 0.0526316 -1436 1433 0.0526316 -1437 1433 0.0526316 -1438 1433 0.0526316 -1439 1433 0.0526316 -1440 1433 0.0526316 -1441 1433 0.0526316 -1442 1433 0.0526316 -1443 1433 0.0526316 -1444 1433 0.0526316 -1445 1433 0.0526316 -1446 1433 0.0526316 -1447 1433 0.0526316 -1435 1434 0.0526316 -1436 1434 0.0526316 -1437 1434 0.0526316 -1438 1434 0.0526316 -1439 1434 0.0526316 -1440 1434 0.0526316 -1441 1434 0.0526316 -1442 1434 0.0526316 -1443 1434 0.0526316 -1444 1434 0.0526316 -1445 1434 0.0526316 -1446 1434 0.0526316 -1447 1434 0.0526316 -1436 1435 0.0526316 -1437 1435 0.0526316 -1438 1435 0.0526316 -1439 1435 0.0526316 -1440 1435 0.0526316 -1441 1435 0.0526316 -1442 1435 0.0526316 -1443 1435 0.0526316 -1444 1435 0.0526316 -1445 1435 0.0526316 -1446 1435 0.0526316 -1447 1435 0.0526316 -1437 1436 0.0526316 -1438 1436 0.0526316 -1439 1436 0.0526316 -1440 1436 0.0526316 -1441 1436 0.0526316 -1442 1436 0.0526316 -1443 1436 0.0526316 -1444 1436 0.0526316 -1445 1436 0.0526316 -1446 1436 0.0526316 -1447 1436 0.0526316 -1438 1437 0.0526316 -1439 1437 0.0526316 -1440 1437 0.0526316 -1441 1437 0.0526316 -1442 1437 0.0526316 -1443 1437 0.0526316 -1444 1437 0.0526316 -1445 1437 0.0526316 -1446 1437 0.0526316 -1447 1437 0.0526316 -1439 1438 0.0526316 -1440 1438 0.0526316 -1441 1438 0.0526316 -1442 1438 0.0526316 -1443 1438 0.0526316 -1444 1438 0.0526316 -1445 1438 0.0526316 -1446 1438 0.0526316 -1447 1438 0.0526316 -1440 1439 0.0526316 -1441 1439 0.0526316 -1442 1439 0.0526316 -1443 1439 0.0526316 -1444 1439 0.0526316 -1445 1439 0.0526316 -1446 1439 0.0526316 -1447 1439 0.0526316 -1441 1440 0.0526316 -1442 1440 0.0526316 -1443 1440 0.0526316 -1444 1440 0.0526316 -1445 1440 0.0526316 -1446 1440 0.0526316 -1447 1440 0.0526316 -1442 1441 0.0526316 -1443 1441 0.0526316 -1444 1441 0.0526316 -1445 1441 0.0526316 -1446 1441 0.0526316 -1447 1441 0.0526316 -1443 1442 0.0526316 -1444 1442 0.0526316 -1445 1442 0.0526316 -1446 1442 0.0526316 -1447 1442 0.0526316 -1444 1443 0.0526316 -1445 1443 0.0526316 -1446 1443 0.0526316 -1447 1443 0.0526316 -1445 1444 0.0526316 -1446 1444 0.0526316 -1447 1444 0.0526316 -1446 1445 0.0526316 -1447 1445 0.0526316 -1447 1446 0.0526316 -1450 1449 1.0 -1457 1456 0.333333 -1458 1456 0.333333 -1459 1456 0.333333 -1458 1457 0.333333 -1459 1457 0.333333 -1459 1458 0.333333 -1465 1464 0.2 -1466 1464 0.2 -1467 1464 0.2 -1466 1465 0.2 -1467 1465 0.2 -1467 1466 0.2 -1469 1468 0.25 -1470 1468 0.25 -1470 1469 0.25 -1472 1471 0.5 -1473 1471 0.5 -1473 1472 0.5 -1475 1474 0.5 -1476 1474 0.5 -1476 1475 0.5 -1478 1477 0.5 -1480 1479 1.0 -1482 1481 0.5 -1484 1483 0.5 -1485 1483 0.5 -1485 1484 0.5 -1487 1486 1.0 -1489 1488 0.5 -1492 1491 1.0 -1493 1491 0.25 -1540 1491 0.25 -1541 1491 0.25 -1542 1491 0.25 -1494 1493 1.0 -1540 1493 0.25 -1541 1493 0.25 -1542 1493 0.25 -1496 1495 1.0 -1501 1500 0.25 -1502 1500 0.25 -1503 1500 0.25 -1502 1501 0.25 -1503 1501 0.25 -1503 1502 0.25 -1505 1504 0.2 -1506 1504 0.2 -1507 1504 0.2 -1508 1504 0.2 -1509 1504 0.2 -1514 1504 0.5 -1506 1505 0.2 -1507 1505 0.2 -1508 1505 0.2 -1509 1505 0.2 -1507 1506 0.2 -1508 1506 0.2 -1509 1506 0.2 -1508 1507 0.2 -1509 1507 0.2 -1509 1508 0.2 -1512 1511 0.5 -1513 1511 0.5 -1513 1512 0.5 -1516 1515 0.333333 -1517 1515 0.333333 -1517 1516 0.333333 -1519 1518 0.25 -1520 1518 0.25 -1520 1519 0.25 -1523 1522 1.0 -1526 1525 1.0 -1531 1530 1.0 -1534 1533 0.2 -1535 1533 0.2 -1535 1534 0.2 -1538 1537 0.5 -1539 1537 0.5 -1539 1538 0.5 -1541 1540 0.25 -1542 1540 0.25 -1542 1541 0.25 -1544 1543 1.0 -1546 1545 0.333333 -1547 1545 0.333333 -1548 1545 0.333333 -1547 1546 0.333333 -1548 1546 0.333333 -1548 1547 0.333333 -1551 1550 0.333333 -1554 1553 0.333333 -1555 1553 0.333333 -1555 1554 0.333333 -1557 1556 0.333333 -1558 1556 0.333333 -1558 1557 0.333333 -1561 1560 0.333333 -1563 1562 0.142857 -1564 1562 0.142857 -1565 1562 0.142857 -1566 1562 0.142857 -1567 1562 0.142857 -1564 1563 0.142857 -1565 1563 0.142857 -1566 1563 0.142857 -1567 1563 0.142857 -1565 1564 0.142857 -1566 1564 0.142857 -1567 1564 0.142857 -1566 1565 0.142857 -1567 1565 0.142857 -1567 1566 0.142857 -1569 1568 1.0 -1571 1570 0.2 -1572 1570 0.2 -1573 1570 0.2 -1572 1571 0.2 -1573 1571 0.2 -1573 1572 0.2 -1576 1575 0.333333 -1577 1575 0.333333 -1578 1575 0.333333 -1577 1576 0.333333 -1578 1576 0.333333 -1578 1577 0.333333 -1581 1580 1.0 -1584 1583 1.0 -1586 1585 1.0 -1587 1585 1.0 -0 1 2.5 -0 1084 0.5 -1 946 1.0 -1 1084 0.5 -2 3 0.25 -2 4 0.25 -2 5 0.25 -2 6 0.25 -3 4 0.25 -3 5 0.25 -3 6 0.25 -4 5 0.25 -4 6 0.25 -5 6 0.25 -7 8 1.0 -7 9 3.16667 -7 10 1.16667 -7 11 0.666667 -9 10 1.16667 -9 11 0.666667 -9 1424 0.5 -9 1425 1.5 -9 1532 1.0 -10 11 0.666667 -12 13 0.333333 -12 14 0.333333 -12 15 0.333333 -12 1047 0.25 -12 1048 0.25 -12 1049 0.25 -12 1050 0.25 -13 14 0.333333 -13 15 0.333333 -14 15 0.333333 -16 17 0.5 -16 18 0.5 -17 18 0.5 -20 21 0.5 -20 22 0.5 -21 22 0.5 -23 24 0.5 -23 25 0.5 -24 25 2.33333 -24 201 0.333333 -24 202 0.333333 -24 369 0.5 -25 201 0.333333 -25 202 0.333333 -25 369 0.5 -27 28 0.5 -27 29 0.5 -28 29 0.5 -30 31 0.5 -30 32 0.5 -30 33 3.58333 -30 34 1.58333 -30 54 0.25 -30 131 0.333333 -30 327 0.333333 -30 402 0.333333 -30 840 0.25 -30 894 0.333333 -31 32 0.5 -33 34 4.225 -33 51 0.75 -33 52 0.25 -33 53 1.85833 -33 54 2.99167 -33 131 1.33333 -33 132 2.275 -33 133 1.025 -33 134 0.525 -33 190 0.583333 -33 375 0.25 -33 376 0.25 -33 377 0.25 -33 464 1.0 -33 485 1.0 -33 488 0.333333 -33 489 0.333333 -33 507 0.583333 -33 508 0.583333 -33 509 0.25 -33 561 0.708333 -33 562 0.458333 -33 839 0.333333 -33 840 0.45 -33 1008 0.5 -33 1190 0.2 -33 1191 0.2 -33 1228 0.25 -33 1229 0.25 -33 1295 0.25 -33 1529 0.5 -33 1550 1.33333 -33 1551 0.333333 -34 53 0.775 -34 54 1.15833 -34 131 0.333333 -34 132 0.525 -34 133 1.025 -34 134 0.525 -34 561 0.375 -34 562 0.125 -34 652 0.25 -34 654 1.25 -34 655 0.25 -34 657 0.25 -34 756 0.5 -34 760 0.5 -34 761 0.333333 -34 762 0.333333 -34 763 0.333333 -34 839 0.333333 -34 840 0.45 -34 865 0.5 -34 1130 0.5 -34 1190 0.2 -34 1191 0.2 -34 1550 0.833333 -34 1551 0.333333 -35 36 0.2 -35 37 0.2 -35 38 0.2 -35 39 0.2 -35 40 0.2 -36 37 0.2 -36 38 0.2 -36 39 0.2 -36 40 0.2 -37 38 0.2 -37 39 0.2 -37 40 0.2 -38 39 0.2 -38 40 0.2 -39 40 0.2 -42 43 1.0 -44 45 0.5 -44 46 0.5 -45 46 0.5 -45 609 0.833333 -45 610 0.5 -45 611 0.333333 -45 612 0.333333 -46 78 1.0 -46 191 0.833333 -46 192 0.333333 -46 193 0.333333 -46 194 0.5 -46 428 1.33333 -46 596 1.0 -46 1361 1.33333 -46 1362 0.333333 -46 1363 1.0 -47 48 0.333333 -47 49 0.333333 -47 50 0.333333 -48 49 0.333333 -48 50 0.333333 -48 216 0.333333 -48 217 0.333333 -48 218 0.333333 -49 50 0.333333 -51 52 0.25 -51 53 0.25 -51 54 0.25 -51 55 0.5 -51 56 0.5 -51 57 1.0 -51 58 1.0 -51 1008 0.5 -52 53 0.25 -52 54 0.25 -53 54 0.625 -53 132 1.025 -53 133 0.525 -53 134 0.525 -53 561 0.708333 -53 562 0.458333 -53 1024 0.5 -53 1025 0.5 -53 1315 0.25 -53 1468 0.25 -53 1469 0.25 -53 1470 0.25 -54 132 0.375 -54 133 0.125 -54 134 0.125 -54 488 0.333333 -54 489 0.333333 -54 561 0.375 -54 562 0.125 -54 839 0.333333 -54 840 0.45 -54 1190 0.2 -54 1191 0.2 -54 1228 0.25 -54 1229 0.25 -54 1529 0.5 -54 1550 0.5 -55 56 3.83333 -55 90 1.0 -55 184 0.5 -55 547 0.5 -55 654 0.333333 -55 893 0.333333 -55 934 0.5 -55 1461 0.5 -56 184 0.5 -56 547 0.5 -56 654 0.333333 -56 893 0.333333 -56 934 0.5 -56 1461 0.5 -57 58 1.0 -57 685 1.0 -59 60 0.5 -59 61 0.5 -60 61 0.5 -62 63 0.47619 -62 64 0.333333 -62 65 0.333333 -62 362 0.2 -62 805 0.92619 -62 806 1.25952 -62 807 0.92619 -62 808 0.25 -62 1016 1.33333 -62 1070 0.142857 -62 1071 0.67619 -62 1072 0.142857 -62 1073 0.142857 -62 1562 0.142857 -62 1563 0.142857 -62 1564 0.142857 -62 1565 0.142857 -62 1566 0.142857 -62 1567 0.142857 -63 64 0.333333 -63 65 0.333333 -63 1562 0.142857 -63 1563 0.142857 -63 1564 0.142857 -63 1565 0.142857 -63 1566 0.142857 -63 1567 0.142857 -64 65 0.333333 -64 795 0.25 -64 796 0.25 -64 797 0.25 -64 798 0.25 -66 67 0.5 -66 68 0.5 -67 68 0.5 -69 70 0.833333 -69 71 2.16667 -69 72 0.916667 -69 97 1.83333 -69 310 0.5 -69 709 0.666667 -69 710 0.333333 -69 757 0.75 -69 758 0.75 -69 977 0.25 -69 1082 0.5 -69 1083 0.5 -70 71 0.833333 -70 72 0.333333 -71 72 0.666667 -71 149 1.16667 -71 150 0.666667 -71 151 1.16667 -71 157 0.5 -71 158 0.5 -71 709 0.333333 -71 736 0.5 -71 737 0.5 -72 235 1.0 -72 443 0.5 -72 709 0.333333 -72 738 0.5 -72 757 0.25 -72 758 0.25 -72 977 0.25 -73 74 0.333333 -73 75 0.333333 -73 76 0.333333 -74 75 0.333333 -74 76 0.333333 -75 76 0.333333 -76 522 1.0 -76 1381 0.5 -76 1588 0.5 -77 78 0.333333 -77 79 0.333333 -77 80 0.333333 -78 79 0.333333 -78 80 0.333333 -78 121 1.0 -78 281 1.0 -78 305 0.583333 -78 306 0.25 -78 307 0.25 -78 308 1.58333 -78 309 3.33333 -78 370 0.5 -78 371 2.5 -78 490 0.5 -78 641 1.0 -78 646 2.5 -78 756 0.5 -78 759 0.5 -78 853 0.5 -78 1005 1.0 -78 1121 0.5 -78 1122 0.5 -78 1123 0.5 -78 1172 1.0 -78 1195 0.333333 -78 1196 0.333333 -78 1197 0.333333 -79 80 0.333333 -81 82 0.5 -81 83 0.5 -82 83 0.5 -82 563 1.0 -82 1498 1.0 -84 85 0.5 -84 86 0.5 -85 86 0.5 -87 88 2.5 -87 711 0.5 -88 711 0.5 -88 976 1.0 -88 991 2.0 -91 92 0.5 -91 93 0.5 -92 93 0.5 -94 95 0.5 -94 96 2.66667 -94 97 2.33333 -94 98 0.5 -94 99 0.5 -94 100 0.25 -94 150 0.333333 -94 225 0.333333 -94 708 0.583333 -95 96 0.5 -95 97 0.5 -95 98 0.5 -96 97 2.33333 -96 98 0.5 -96 99 0.5 -96 100 0.25 -96 150 0.833333 -96 225 0.333333 -96 700 0.333333 -96 701 0.333333 -96 702 0.333333 -96 708 0.583333 -96 1177 0.5 -96 1481 0.5 -96 1482 0.5 -97 98 0.5 -97 99 0.5 -97 100 0.25 -97 310 0.5 -97 708 0.583333 -97 709 0.333333 -97 710 0.333333 -99 100 1.25 -99 708 0.25 -102 103 0.5 -102 104 0.5 -103 104 0.5 -105 106 0.5 -105 107 0.5 -106 107 0.5 -106 859 1.0 -108 109 1.0 -111 112 1.0 -113 114 1.0 -114 1162 0.5 -114 1163 0.5 -116 117 1.0 -117 935 0.25 -117 936 0.25 -117 937 0.25 -117 938 0.25 -118 119 1.0 -118 439 0.5 -118 441 0.5 -120 121 1.0 -121 548 0.333333 -121 549 0.333333 -121 550 1.83333 -121 764 0.833333 -121 765 0.333333 -121 1030 0.5 -121 1255 0.833333 -122 123 0.5 -122 124 0.5 -123 124 0.5 -126 127 0.7 -126 128 0.5 -126 770 0.2 -126 771 0.2 -126 772 0.2 -126 773 0.2 -127 128 0.75 -127 151 0.333333 -127 517 0.333333 -127 770 0.2 -127 771 0.2 -127 772 0.2 -127 773 0.2 -127 1021 0.25 -127 1022 0.25 -127 1023 0.25 -127 1460 0.333333 -128 1021 0.75 -128 1022 0.25 -128 1023 1.75 -129 130 1.0 -131 203 1.0 -132 133 0.525 -132 134 0.525 -132 561 0.125 -132 562 0.125 -132 1228 0.25 -132 1229 0.25 -133 134 0.525 -133 561 0.125 -133 562 0.125 -134 561 0.125 -134 562 0.125 -135 136 1.0 -136 216 0.5 -136 223 0.5 -136 585 0.333333 -136 586 0.333333 -136 587 1.83333 -136 729 0.5 -137 138 1.0 -139 140 0.111111 -139 141 0.111111 -139 142 0.111111 -139 143 0.111111 -139 144 0.111111 -139 145 0.111111 -139 146 0.111111 -139 147 0.111111 -139 148 0.111111 -140 141 0.111111 -140 142 0.111111 -140 143 0.111111 -140 144 0.111111 -140 145 0.111111 -140 146 0.111111 -140 147 0.111111 -140 148 0.111111 -141 142 0.111111 -141 143 0.111111 -141 144 0.111111 -141 145 0.111111 -141 146 0.111111 -141 147 0.111111 -141 148 0.111111 -142 143 0.111111 -142 144 0.111111 -142 145 0.111111 -142 146 0.111111 -142 147 0.111111 -142 148 0.111111 -143 144 0.111111 -143 145 0.111111 -143 146 0.111111 -143 147 0.111111 -143 148 0.111111 -144 145 0.111111 -144 146 0.111111 -144 147 0.111111 -144 148 0.111111 -145 146 0.111111 -145 147 0.111111 -145 148 0.111111 -146 147 0.111111 -146 148 0.111111 -147 148 0.111111 -149 150 0.666667 -149 151 1.16667 -149 152 1.0 -150 151 4.75 -150 225 2.08333 -150 281 1.83333 -150 301 0.5 -150 500 0.5 -150 516 1.08333 -150 517 1.58333 -150 1177 0.5 -150 1178 0.833333 -150 1221 0.5 -150 1342 0.333333 -151 225 0.75 -151 301 0.5 -151 330 0.5 -151 331 0.5 -151 516 1.58333 -151 517 2.25 -151 963 0.333333 -151 964 0.333333 -151 1088 0.5 -151 1460 0.333333 -152 517 1.0 -153 154 1.33333 -153 155 0.333333 -153 156 0.333333 -154 155 0.333333 -154 156 0.333333 -155 156 0.333333 -157 158 0.5 -160 161 1.0 -162 163 1.0 -162 301 0.25 -162 316 0.25 -162 638 0.25 -162 639 0.25 -164 165 1.0 -166 167 1.0 -166 406 1.0 -169 170 0.5 -169 171 0.5 -170 171 0.5 -171 918 1.0 -172 173 0.5 -172 174 1.5 -173 174 0.5 -175 176 0.5 -175 177 0.5 -176 177 0.5 -177 926 1.0 -179 180 1.0 -179 181 1.0 -180 181 1.0 -182 183 1.0 -184 185 0.5 -184 186 0.5 -185 186 0.5 -186 1162 1.25 -186 1413 0.25 -186 1414 0.25 -186 1415 0.25 -187 188 1.5 -187 189 0.5 -188 189 0.5 -189 567 2.33333 -189 650 0.333333 -189 651 0.333333 -190 507 0.583333 -190 508 0.583333 -190 509 0.25 -191 192 0.333333 -191 193 0.333333 -191 194 0.5 -192 193 0.333333 -194 955 0.5 -194 956 1.08333 -194 1135 0.583333 -194 1136 0.25 -194 1137 0.25 -194 1138 0.333333 -194 1384 0.5 -194 1385 0.5 -195 196 1.25 -195 197 0.25 -195 198 0.25 -195 199 0.25 -196 197 0.25 -196 198 0.25 -196 199 0.25 -197 198 0.25 -197 199 0.25 -198 199 0.25 -200 201 0.5 -200 202 0.5 -201 202 0.833333 -203 301 1.16667 -203 302 0.833333 -203 303 0.333333 -203 316 0.333333 -203 317 0.333333 -205 206 1.0 -207 208 0.5 -207 209 0.5 -207 1477 0.5 -207 1478 0.5 -208 209 0.5 -210 211 0.5 -210 212 0.5 -211 212 0.5 -213 214 0.5 -213 215 0.5 -214 215 0.5 -216 217 1.08333 -216 218 1.66667 -216 219 0.5 -216 220 1.5 -216 221 0.25 -216 222 0.25 -216 223 0.5 -216 224 0.583333 -216 251 0.25 -216 252 0.5 -216 345 0.583333 -216 346 0.916667 -216 347 0.583333 -216 516 0.333333 -216 788 0.333333 -216 1041 0.333333 -216 1452 1.0 -217 218 1.08333 -217 251 0.25 -217 252 0.25 -218 219 0.25 -218 220 0.25 -218 224 0.583333 -218 251 0.25 -218 252 0.25 -218 1041 0.333333 -219 220 0.5 -219 221 0.583333 -219 222 1.75 -219 224 0.25 -219 343 2.47619 -219 473 0.5 -219 697 0.142857 -219 1145 2.14286 -219 1282 0.333333 -219 1283 0.333333 -219 1394 0.142857 -219 1395 0.142857 -219 1396 0.142857 -219 1397 0.142857 -219 1560 0.333333 -219 1561 0.333333 -220 221 0.25 -220 222 0.25 -220 224 0.25 -221 222 0.25 -221 343 0.333333 -221 1145 0.333333 -222 473 0.5 -224 1041 0.333333 -225 516 0.25 -225 517 0.25 -226 227 1.0 -227 1074 1.0 -228 229 1.33333 -228 230 0.333333 -228 231 0.333333 -229 230 0.333333 -229 231 0.333333 -230 231 0.333333 -233 234 0.5 -233 235 0.5 -234 235 0.5 -237 238 1.0 -239 240 1.0 -239 241 1.0 -239 1500 0.25 -239 1501 0.25 -239 1502 0.25 -239 1503 0.25 -242 243 1.0 -243 927 1.25 -243 1518 0.25 -243 1519 0.25 -243 1520 0.25 -244 245 3.5 -244 246 1.0 -244 247 1.0 -244 435 1.0 -244 513 0.5 -244 1230 1.0 -245 435 1.0 -245 513 0.5 -247 415 0.333333 -247 1124 0.333333 -247 1125 0.333333 -248 249 0.5 -248 250 0.5 -249 250 0.5 -251 252 0.25 -252 345 0.25 -252 346 0.25 -252 347 0.25 -254 255 1.0 -254 256 0.5 -254 1000 0.5 -255 256 0.5 -255 1000 0.5 -258 259 1.33333 -258 1166 0.333333 -258 1167 0.333333 -259 1166 0.333333 -259 1167 0.333333 -260 261 1.0 -262 263 0.142857 -262 264 0.142857 -262 265 0.142857 -262 266 0.142857 -262 267 0.142857 -262 268 0.142857 -262 269 0.142857 -263 264 0.142857 -263 265 0.67619 -263 266 0.67619 -263 267 0.142857 -263 268 0.67619 -263 269 0.142857 -263 944 0.2 -263 945 0.2 -264 265 0.142857 -264 266 0.142857 -264 267 0.142857 -264 268 0.142857 -264 269 0.142857 -265 266 0.92619 -265 267 0.142857 -265 268 0.92619 -265 269 0.142857 -265 307 0.25 -265 908 0.25 -265 944 0.2 -265 945 0.2 -266 267 0.142857 -266 268 0.92619 -266 269 0.142857 -266 307 0.25 -266 908 0.25 -266 944 0.2 -266 945 0.2 -267 268 0.142857 -267 269 0.142857 -268 269 0.142857 -268 307 0.25 -268 908 0.25 -268 944 0.2 -268 945 0.2 -270 271 1.0 -273 274 0.5 -273 275 0.5 -274 275 0.5 -275 606 0.333333 -275 607 0.333333 -275 608 0.333333 -276 277 0.5 -276 278 0.5 -277 278 1.0 -277 401 0.166667 -277 402 0.166667 -277 403 0.5 -277 404 0.166667 -277 405 0.166667 -277 595 0.333333 -278 401 0.166667 -278 402 0.166667 -278 403 0.5 -278 404 0.166667 -278 405 0.166667 -278 595 0.333333 -279 280 0.166667 -279 281 0.166667 -279 282 0.166667 -279 283 0.166667 -279 284 0.166667 -279 285 0.166667 -280 281 0.166667 -280 282 0.166667 -280 283 0.166667 -280 284 0.166667 -280 285 0.166667 -281 282 0.166667 -281 283 3.16667 -281 284 0.166667 -281 285 0.166667 -281 574 2.5 -281 575 0.5 -281 576 0.5 -281 1081 2.0 -281 1178 0.833333 -281 1342 0.333333 -281 1343 0.5 -281 1344 0.5 -281 1451 0.5 -282 283 0.166667 -282 284 0.166667 -282 285 0.166667 -282 450 1.0 -283 284 0.166667 -283 285 0.166667 -283 574 0.5 -283 1451 0.5 -284 285 0.166667 -286 287 0.5 -286 288 1.0 -286 289 0.5 -287 288 0.5 -288 289 0.5 -290 291 0.5 -290 292 0.5 -291 292 0.5 -293 294 2.1 -293 742 0.9 -293 743 0.9 -293 744 0.7 -293 931 0.4 -293 932 0.4 -293 1278 0.2 -293 1368 0.2 -293 1369 0.2 -294 742 1.9 -294 743 1.4 -294 744 2.7 -294 746 0.333333 -294 860 0.2 -294 931 0.4 -294 932 0.4 -294 1028 0.333333 -294 1029 0.333333 -294 1278 0.7 -294 1368 0.2 -294 1369 0.2 -294 1464 0.2 -294 1465 0.2 -294 1466 0.2 -294 1467 0.2 -294 1553 0.333333 -294 1554 0.333333 -294 1555 0.333333 -296 297 1.0 -296 298 0.333333 -296 299 0.333333 -296 300 1.33333 -298 299 0.333333 -298 300 0.333333 -299 300 0.333333 -300 973 1.0 -300 1497 1.0 -301 302 1.33333 -301 303 0.333333 -301 304 0.5 -301 316 0.583333 -301 317 0.333333 -301 463 0.5 -301 638 0.75 -301 639 0.25 -302 303 0.333333 -302 304 0.5 -302 1182 1.0 -303 499 1.0 -303 1026 0.333333 -303 1416 0.333333 -303 1417 0.333333 -305 306 0.25 -305 307 0.25 -305 308 0.583333 -305 309 0.333333 -306 307 0.25 -306 308 0.25 -307 308 0.25 -307 590 1.0 -307 908 0.25 -308 309 2.33333 -308 1039 0.5 -308 1040 1.5 -308 1549 1.0 -309 371 0.5 -309 490 1.5 -309 491 0.5 -309 493 0.5 -311 312 1.0 -313 314 0.5 -313 315 0.5 -314 315 0.5 -314 1398 1.0 -316 317 0.333333 -316 638 0.25 -316 639 0.25 -318 319 1.0 -319 421 1.0 -320 321 0.833333 -320 322 0.333333 -320 323 0.666667 -320 324 0.333333 -320 325 0.333333 -320 1270 0.5 -321 322 0.333333 -321 323 0.333333 -321 1270 0.5 -322 323 0.333333 -323 324 0.333333 -323 325 0.333333 -324 325 0.333333 -326 327 0.333333 -326 328 0.333333 -326 329 0.333333 -327 328 1.16667 -327 329 0.333333 -327 402 2.16667 -327 416 3.5 -327 417 1.0 -327 596 0.5 -327 894 0.333333 -327 1189 0.5 -327 1404 0.166667 -327 1405 0.166667 -327 1406 0.166667 -327 1407 0.166667 -327 1408 0.166667 -328 329 0.333333 -328 402 0.333333 -328 416 0.333333 -328 1189 0.5 -329 547 1.5 -329 1389 1.5 -330 331 0.5 -330 1214 0.25 -330 1215 0.25 -330 1216 0.25 -330 1217 0.25 -332 333 0.333333 -332 334 0.333333 -332 335 0.333333 -333 334 0.333333 -333 335 0.333333 -334 335 0.333333 -336 337 1.0 -337 631 0.2 -337 1570 0.2 -337 1571 0.2 -337 1572 0.2 -337 1573 0.2 -338 339 0.333333 -338 340 0.333333 -338 341 0.333333 -339 340 0.333333 -339 341 1.33333 -340 341 0.333333 -342 343 0.5 -342 344 0.5 -342 692 1.0 -343 344 0.5 -343 697 0.142857 -343 1145 1.47619 -343 1394 0.142857 -343 1395 0.142857 -343 1396 0.142857 -343 1397 0.142857 -345 346 0.583333 -345 347 0.583333 -346 347 0.583333 -346 516 0.333333 -346 788 0.333333 -348 349 0.2 -348 350 0.2 -348 351 0.2 -348 352 0.2 -348 353 0.2 -349 350 0.2 -349 351 0.2 -349 352 0.2 -349 353 0.2 -350 351 0.2 -350 352 0.2 -350 353 0.2 -350 686 1.0 -351 352 0.2 -351 353 0.2 -352 353 0.2 -354 355 0.5 -354 356 0.5 -355 356 0.5 -357 358 0.833333 -357 359 0.5 -357 360 0.333333 -357 361 0.333333 -358 359 0.5 -358 360 0.333333 -358 361 0.333333 -360 361 0.333333 -362 363 1.0 -362 364 0.5 -362 365 0.5 -362 805 0.2 -362 806 0.2 -362 807 0.2 -362 1071 0.2 -362 1349 0.25 -362 1350 0.25 -362 1351 0.25 -362 1352 0.25 -364 365 0.5 -366 367 0.5 -366 368 0.5 -367 368 0.5 -370 371 0.5 -371 759 0.5 -371 866 0.5 -371 867 0.5 -372 373 0.5 -372 374 0.5 -373 374 0.5 -375 376 1.91667 -375 377 2.91667 -375 378 0.333333 -375 1263 0.333333 -375 1295 0.25 -376 377 1.91667 -376 378 0.333333 -376 1263 0.333333 -376 1295 0.25 -377 378 0.333333 -377 1263 0.333333 -377 1295 0.25 -377 1347 0.5 -377 1348 0.5 -379 380 0.5 -379 381 0.5 -380 381 0.5 -382 383 0.5 -382 384 0.5 -383 384 0.5 -385 386 0.142857 -385 387 0.142857 -385 388 0.142857 -385 389 0.142857 -385 390 0.142857 -385 391 0.142857 -385 392 0.142857 -386 387 0.142857 -386 388 0.142857 -386 389 0.142857 -386 390 0.142857 -386 391 0.142857 -386 392 0.142857 -387 388 0.142857 -387 389 0.142857 -387 390 0.142857 -387 391 0.142857 -387 392 0.142857 -388 389 0.142857 -388 390 0.142857 -388 391 0.142857 -388 392 0.142857 -389 390 0.142857 -389 391 0.142857 -389 392 0.142857 -390 391 0.142857 -390 392 0.142857 -391 392 0.142857 -393 394 0.333333 -393 395 0.333333 -393 396 0.333333 -394 395 0.333333 -394 396 0.333333 -395 396 0.333333 -397 398 0.333333 -397 399 0.333333 -397 400 0.333333 -398 399 0.333333 -398 400 0.333333 -399 400 0.333333 -401 402 0.166667 -401 403 0.166667 -401 404 0.166667 -401 405 0.166667 -402 403 0.166667 -402 404 0.166667 -402 405 0.166667 -402 416 0.833333 -402 417 1.0 -402 894 0.333333 -403 404 0.166667 -403 405 0.166667 -403 595 0.333333 -404 405 0.166667 -408 409 0.25 -408 410 0.583333 -408 411 0.25 -408 412 0.583333 -408 413 0.333333 -409 410 0.25 -409 411 0.25 -409 412 0.25 -410 411 0.25 -410 412 0.583333 -410 413 0.333333 -411 412 0.25 -412 413 0.333333 -414 415 1.0 -415 922 1.0 -415 1124 0.333333 -415 1125 0.333333 -415 1233 0.5 -415 1234 0.5 -416 596 0.5 -416 1404 0.166667 -416 1405 0.166667 -416 1406 0.166667 -416 1407 0.166667 -416 1408 0.166667 -418 419 1.0 -422 423 0.5 -422 424 0.5 -423 424 0.5 -425 426 0.5 -425 427 0.5 -426 427 0.5 -428 429 1.0 -428 1361 0.333333 -428 1362 0.333333 -430 431 1.0 -430 432 1.0 -433 434 1.0 -436 437 0.5 -436 438 0.5 -437 438 0.5 -439 440 1.0 -439 441 0.5 -442 443 1.0 -443 675 0.5 -443 676 0.5 -443 738 0.5 -443 739 1.0 -444 445 1.0 -445 699 1.0 -446 447 0.333333 -446 448 0.333333 -446 449 0.333333 -447 448 0.333333 -447 449 0.333333 -448 449 0.333333 -452 453 0.142857 -452 454 0.142857 -452 455 0.142857 -452 456 0.142857 -452 457 0.142857 -452 458 0.142857 -452 459 0.142857 -453 454 0.142857 -453 455 0.142857 -453 456 0.142857 -453 457 0.142857 -453 458 0.642857 -453 459 0.642857 -454 455 0.142857 -454 456 0.142857 -454 457 0.142857 -454 458 0.142857 -454 459 0.142857 -455 456 0.142857 -455 457 0.142857 -455 458 0.142857 -455 459 0.142857 -456 457 0.142857 -456 458 0.142857 -456 459 0.142857 -457 458 0.142857 -457 459 0.142857 -458 459 0.642857 -460 461 0.333333 -460 462 0.333333 -460 463 0.333333 -461 462 0.333333 -461 463 0.333333 -462 463 0.333333 -463 638 0.5 -464 465 1.5 -464 466 0.5 -465 466 0.5 -467 468 0.25 -467 469 0.25 -467 470 0.25 -467 471 0.25 -468 469 0.25 -468 470 0.25 -468 471 0.25 -469 470 0.25 -469 471 0.25 -470 471 0.25 -472 473 0.833333 -472 474 0.5 -472 984 0.333333 -472 1091 0.333333 -473 474 0.5 -473 984 2.16667 -473 985 0.333333 -473 1091 0.333333 -473 1092 0.833333 -475 476 1.0 -475 477 0.5 -475 478 0.5 -477 478 0.5 -478 940 1.0 -479 480 0.333333 -479 481 0.333333 -479 482 0.333333 -480 481 0.333333 -480 482 0.333333 -481 482 0.333333 -481 1235 0.5 -481 1236 0.5 -481 1250 0.5 -481 1251 0.5 -482 1046 1.0 -482 1244 0.25 -482 1245 0.25 -482 1246 0.25 -482 1247 0.25 -482 1455 1.0 -483 484 1.0 -486 487 1.0 -488 489 0.333333 -490 491 0.5 -490 492 1.0 -490 493 0.5 -494 495 0.5 -494 496 0.5 -495 496 0.5 -496 780 0.5 -496 781 0.5 -496 1409 0.5 -496 1410 0.5 -497 498 1.0 -500 501 1.0 -500 502 2.5 -500 503 1.5 -500 1221 0.5 -501 502 1.0 -502 503 0.5 -505 506 1.0 -507 508 1.08333 -507 509 0.75 -508 509 0.75 -511 512 1.0 -514 515 0.833333 -514 516 0.833333 -514 517 0.333333 -515 516 2.33333 -515 517 0.333333 -515 674 0.5 -516 517 2.91667 -516 674 0.5 -516 788 0.333333 -516 1086 0.5 -516 1087 2.5 -516 1088 1.0 -516 1089 0.5 -517 963 0.333333 -517 964 0.333333 -517 1341 1.0 -517 1460 0.333333 -518 519 1.0 -520 521 1.0 -522 523 0.25 -522 524 0.25 -522 525 0.25 -522 526 0.25 -522 527 2.0 -522 1381 0.5 -522 1588 0.5 -523 524 0.25 -523 525 0.25 -523 526 0.25 -523 742 0.333333 -523 746 0.333333 -523 1356 0.333333 -524 525 0.25 -524 526 0.25 -524 1322 1.0 -525 526 0.25 -528 529 1.0 -530 531 0.533333 -530 532 0.533333 -530 533 0.333333 -530 1533 0.2 -530 1534 0.2 -530 1535 0.2 -531 532 0.533333 -531 533 0.333333 -531 1533 0.2 -531 1534 0.2 -531 1535 0.2 -532 533 0.333333 -532 1533 0.2 -532 1534 0.2 -532 1535 0.2 -534 535 1.0 -537 538 0.5 -537 539 0.833333 -537 540 0.333333 -537 541 0.333333 -537 542 0.333333 -537 689 0.333333 -537 690 0.333333 -538 539 0.5 -539 689 0.333333 -539 690 0.333333 -540 541 0.333333 -540 542 0.333333 -541 542 0.333333 -544 545 1.0 -546 547 1.0 -547 1239 1.0 -547 1389 0.5 -548 549 0.333333 -548 550 0.333333 -549 550 0.333333 -550 1030 0.5 -552 553 0.5 -552 554 0.5 -553 554 0.5 -556 557 0.5 -556 558 0.5 -557 558 0.5 -559 560 1.0 -561 562 0.458333 -563 564 0.333333 -563 565 0.333333 -563 566 0.333333 -564 565 0.333333 -564 566 0.333333 -565 566 0.333333 -567 650 0.333333 -567 651 0.333333 -568 569 1.0 -570 571 1.0 -572 573 1.0 -574 575 0.5 -574 576 0.5 -577 578 1.0 -580 581 0.5 -580 582 0.5 -581 582 0.5 -583 584 1.0 -585 586 0.333333 -585 587 0.333333 -586 587 0.333333 -587 729 0.5 -589 590 0.583333 -589 591 0.583333 -589 592 0.333333 -589 1180 0.25 -589 1181 0.25 -590 591 1.58333 -590 592 0.333333 -590 1180 0.25 -590 1181 0.25 -591 592 0.333333 -591 1180 0.25 -591 1181 0.25 -593 594 1.0 -597 598 1.0 -597 789 1.0 -597 790 1.0 -599 600 1.0 -602 603 1.0 -606 607 0.333333 -606 608 0.333333 -607 608 0.333333 -609 610 0.5 -609 611 0.333333 -609 612 0.333333 -611 612 0.333333 -614 615 1.0 -616 617 1.0 -618 619 0.5 -618 620 0.5 -619 620 0.5 -621 622 1.0 -623 624 1.0 -625 626 0.333333 -625 627 0.333333 -625 628 0.333333 -626 627 0.333333 -626 628 0.333333 -627 628 0.333333 -629 630 0.5 -629 631 0.5 -630 631 1.0 -630 1579 0.5 -631 783 1.0 -631 784 0.5 -631 1570 0.2 -631 1571 0.2 -631 1572 0.2 -631 1573 0.2 -631 1574 0.5 -631 1579 0.5 -632 633 1.0 -635 636 0.5 -635 637 0.5 -636 637 0.5 -638 639 0.25 -638 640 1.0 -642 643 1.0 -642 712 0.5 -642 713 0.5 -645 1429 0.0526316 -645 1430 0.0526316 -645 1431 0.0526316 -645 1432 0.0526316 -645 1433 0.0526316 -645 1434 0.0526316 -645 1435 0.0526316 -645 1436 0.0526316 -645 1437 0.0526316 -645 1438 0.0526316 -645 1439 0.0526316 -645 1440 0.0526316 -645 1441 0.0526316 -645 1442 0.0526316 -645 1443 0.0526316 -645 1444 0.0526316 -645 1445 0.0526316 -645 1446 0.0526316 -645 1447 0.0526316 -646 853 0.5 -647 648 1.0 -650 651 0.333333 -652 653 0.333333 -652 654 2.08333 -652 655 2.08333 -652 656 0.333333 -652 657 0.583333 -652 893 0.333333 -653 654 0.333333 -653 655 0.333333 -654 655 2.08333 -654 656 0.333333 -654 657 0.916667 -654 774 0.333333 -654 863 0.5 -654 864 0.5 -654 865 0.5 -654 893 0.666667 -654 1130 0.833333 -655 656 0.333333 -655 657 0.583333 -655 893 0.333333 -657 774 0.333333 -657 1130 0.333333 -658 659 0.333333 -658 660 0.333333 -658 661 0.333333 -659 660 0.333333 -659 661 0.333333 -660 661 0.333333 -662 663 0.75 -662 664 0.25 -662 665 0.25 -662 666 0.25 -662 677 0.5 -662 792 0.333333 -662 793 0.333333 -662 794 0.333333 -663 664 0.25 -663 665 0.25 -663 666 0.25 -663 677 0.5 -664 665 0.25 -664 666 0.25 -665 666 0.25 -667 668 1.0 -669 670 1.0 -669 671 1.0 -670 721 1.0 -672 673 1.0 -675 676 0.5 -676 1556 0.333333 -676 1557 0.333333 -676 1558 0.333333 -678 679 0.5 -678 680 0.5 -679 680 0.5 -681 682 0.333333 -681 683 0.333333 -681 684 0.333333 -682 683 0.333333 -682 684 0.333333 -683 684 0.333333 -689 690 0.333333 -693 694 0.2 -693 695 0.2 -693 696 0.2 -693 697 1.2 -693 698 0.2 -694 695 0.2 -694 696 0.2 -694 697 0.2 -694 698 0.2 -695 696 0.2 -695 697 0.2 -695 698 0.2 -695 715 0.25 -695 716 0.25 -695 717 0.25 -695 718 0.25 -696 697 0.2 -696 698 0.2 -697 698 0.2 -697 1145 0.142857 -697 1394 0.142857 -697 1395 0.142857 -697 1396 0.142857 -697 1397 0.142857 -700 701 0.333333 -700 702 0.333333 -701 702 0.333333 -704 705 0.333333 -704 706 0.333333 -704 707 0.333333 -705 706 0.333333 -705 707 0.333333 -706 707 0.333333 -709 710 0.333333 -712 713 0.5 -715 716 0.25 -715 717 0.25 -715 718 0.25 -716 717 0.25 -716 718 0.25 -717 718 0.25 -719 720 2.0 -719 752 0.5 -719 753 0.5 -721 1346 1.0 -721 1454 1.0 -723 724 0.333333 -723 725 0.333333 -723 726 0.333333 -724 725 0.333333 -724 726 0.333333 -725 726 0.333333 -730 731 1.0 -732 733 0.5 -732 734 0.5 -733 734 0.5 -736 737 0.5 -742 743 1.4 -742 744 1.2 -742 745 1.0 -742 746 2.33333 -742 931 0.7 -742 932 0.7 -742 1278 0.2 -742 1356 0.333333 -743 744 0.7 -743 931 0.2 -743 932 0.2 -743 1278 0.2 -744 1278 0.7 -744 1279 0.333333 -744 1280 0.333333 -744 1281 0.333333 -746 1028 0.333333 -746 1029 0.333333 -746 1356 0.333333 -747 748 1.0 -750 751 1.0 -752 753 0.5 -754 755 1.0 -756 757 0.5 -756 758 0.5 -756 759 1.0 -756 760 1.5 -756 761 1.86667 -756 762 0.333333 -756 763 0.333333 -756 764 0.533333 -756 765 0.533333 -756 775 0.2 -756 892 0.2 -756 1123 0.5 -757 758 1.25 -757 977 0.25 -758 977 0.25 -761 762 0.666667 -761 763 0.666667 -761 764 0.533333 -761 765 0.533333 -761 774 1.33333 -761 775 1.53333 -761 776 0.333333 -761 892 0.2 -762 763 0.666667 -764 765 0.866667 -764 775 0.2 -764 892 0.2 -764 1255 0.833333 -765 775 0.2 -765 892 0.2 -765 1255 0.333333 -766 767 0.333333 -766 768 0.333333 -766 769 0.333333 -767 768 0.333333 -767 769 0.333333 -768 769 0.333333 -770 771 0.2 -770 772 0.2 -770 773 0.2 -771 772 0.2 -771 773 0.2 -772 773 0.2 -774 775 1.33333 -774 776 0.333333 -774 1130 0.333333 -775 776 0.333333 -775 892 0.2 -777 778 1.0 -780 781 0.5 -783 784 0.5 -783 1574 0.5 -785 786 0.5 -785 787 0.5 -786 787 0.5 -789 790 1.0 -792 793 0.333333 -792 794 0.333333 -793 794 0.333333 -795 796 0.25 -795 797 0.25 -795 798 0.25 -796 797 0.25 -796 798 0.25 -797 798 0.25 -799 800 0.2 -799 801 0.2 -799 802 0.2 -799 803 0.2 -799 804 0.2 -800 801 0.2 -800 802 0.2 -800 803 0.2 -800 804 0.2 -801 802 0.2 -801 803 0.2 -801 804 0.2 -802 803 0.2 -802 804 0.2 -803 804 0.2 -805 806 0.92619 -805 807 0.92619 -805 808 0.25 -805 1070 0.142857 -805 1071 0.342857 -805 1072 0.142857 -805 1073 0.142857 -806 807 0.92619 -806 808 0.25 -806 1016 0.333333 -806 1070 0.142857 -806 1071 0.67619 -806 1072 0.142857 -806 1073 0.142857 -807 808 0.25 -807 1070 0.142857 -807 1071 0.342857 -807 1072 0.142857 -807 1073 0.142857 -809 810 1.0 -812 813 1.0 -814 815 0.5 -814 816 0.5 -815 816 0.5 -817 818 1.0 -819 820 1.0 -820 1170 1.0 -821 822 0.333333 -821 823 0.333333 -821 824 0.333333 -822 823 0.333333 -822 824 0.333333 -823 824 0.333333 -825 826 0.111111 -825 827 0.111111 -825 828 0.111111 -825 829 0.111111 -825 830 0.111111 -825 831 0.111111 -825 832 0.111111 -825 833 0.111111 -825 834 0.111111 -826 827 0.111111 -826 828 0.111111 -826 829 0.111111 -826 830 0.111111 -826 831 0.111111 -826 832 0.111111 -826 833 0.111111 -826 834 0.111111 -827 828 0.111111 -827 829 0.111111 -827 830 0.111111 -827 831 0.111111 -827 832 0.111111 -827 833 0.111111 -827 834 0.111111 -828 829 0.111111 -828 830 0.111111 -828 831 0.111111 -828 832 0.111111 -828 833 0.111111 -828 834 0.111111 -829 830 0.111111 -829 831 0.111111 -829 832 0.111111 -829 833 0.111111 -829 834 0.111111 -830 831 0.111111 -830 832 0.111111 -830 833 0.111111 -830 834 0.111111 -831 832 0.111111 -831 833 0.111111 -831 834 0.111111 -832 833 0.111111 -832 834 0.111111 -833 834 0.111111 -835 836 0.5 -835 837 0.5 -836 837 0.5 -840 1190 0.2 -840 1191 0.2 -841 842 1.5 -841 843 0.5 -842 843 0.5 -843 1273 0.75 -843 1274 0.75 -843 1275 0.25 -843 1276 0.25 -843 1536 1.0 -844 845 0.333333 -844 846 0.333333 -844 847 0.333333 -845 846 0.333333 -845 847 0.333333 -846 847 0.333333 -848 849 1.0 -850 851 0.5 -850 852 0.5 -851 852 0.5 -855 856 0.5 -855 857 0.5 -856 857 0.5 -860 861 0.5 -860 862 0.5 -860 1464 0.2 -860 1465 0.2 -860 1466 0.2 -860 1467 0.2 -861 862 0.5 -863 864 0.5 -866 867 0.5 -870 871 0.25 -870 872 0.25 -870 873 0.25 -870 874 0.25 -871 872 0.25 -871 873 0.25 -871 874 0.25 -872 873 0.25 -872 874 0.25 -872 1268 1.0 -873 874 0.25 -877 878 0.25 -877 879 0.25 -877 880 0.25 -877 881 0.25 -878 879 0.25 -878 880 0.25 -878 881 0.25 -879 880 0.25 -879 881 0.25 -880 881 0.25 -882 1339 1.0 -883 884 0.5 -883 885 0.5 -884 885 0.5 -886 887 1.0 -888 889 0.5 -888 890 0.5 -889 890 0.5 -895 896 0.25 -895 897 0.25 -895 898 0.25 -895 899 0.25 -896 897 0.25 -896 898 0.25 -896 899 0.25 -897 898 0.25 -897 899 0.25 -898 899 0.25 -900 901 0.5 -900 902 0.5 -900 1318 1.0 -901 902 0.5 -903 904 0.5 -903 905 0.5 -904 905 0.5 -906 907 1.0 -909 910 0.5 -909 911 0.5 -910 911 0.5 -912 913 0.2 -912 914 0.2 -912 915 0.2 -912 916 0.2 -912 917 0.2 -913 914 0.342857 -913 915 0.342857 -913 916 0.985714 -913 917 0.2 -913 1000 0.142857 -913 1201 0.785714 -913 1202 0.142857 -913 1203 0.142857 -913 1204 0.142857 -913 1205 0.142857 -913 1206 0.142857 -913 1207 0.142857 -913 1208 0.142857 -914 915 0.342857 -914 916 0.342857 -914 917 0.2 -914 1201 0.142857 -914 1206 0.142857 -914 1207 0.142857 -914 1208 0.142857 -915 916 0.342857 -915 917 0.2 -915 1201 0.142857 -915 1206 0.142857 -915 1207 0.142857 -915 1208 0.142857 -916 917 0.2 -916 1000 0.142857 -916 1201 1.11905 -916 1202 0.142857 -916 1203 0.142857 -916 1204 0.142857 -916 1205 0.142857 -916 1206 0.142857 -916 1207 0.142857 -916 1208 0.142857 -916 1256 0.333333 -916 1257 0.333333 -920 921 1.0 -923 924 0.5 -923 925 0.5 -924 925 0.5 -927 1518 0.25 -927 1519 0.25 -927 1520 0.25 -929 930 1.0 -930 1418 1.0 -931 932 1.9 -931 933 1.0 -931 1175 0.5 -931 1176 0.5 -931 1356 1.0 -931 1368 0.2 -931 1369 0.2 -932 1368 0.2 -932 1369 0.2 -935 936 0.25 -935 937 0.25 -935 938 0.25 -936 937 0.25 -936 938 0.25 -937 938 0.25 -941 942 0.5 -941 943 0.5 -942 943 0.5 -944 945 0.2 -947 948 1.0 -947 1271 0.5 -947 1272 0.5 -949 950 1.0 -951 952 1.16667 -951 953 1.16667 -951 954 0.666667 -952 953 1.16667 -952 954 0.666667 -953 954 0.666667 -955 956 0.5 -956 1135 0.583333 -956 1136 0.25 -956 1137 0.25 -956 1138 0.333333 -957 958 0.5 -957 959 0.5 -958 959 0.5 -960 961 0.5 -960 962 0.5 -961 962 0.5 -963 964 0.333333 -965 966 0.2 -965 967 0.2 -965 968 0.2 -965 969 0.2 -965 970 0.2 -966 967 0.2 -966 968 0.2 -966 969 0.2 -966 970 0.2 -967 968 0.2 -967 969 0.2 -967 970 0.2 -968 969 0.2 -968 970 0.2 -969 970 0.2 -972 973 1.0 -973 989 1.0 -973 1002 0.833333 -973 1003 0.833333 -973 1004 0.333333 -974 975 0.5 -974 976 0.5 -975 976 0.5 -976 1129 1.0 -978 979 1.0 -980 981 0.5 -980 982 0.5 -981 982 0.5 -983 984 1.0 -983 985 0.5 -983 986 0.5 -984 985 0.833333 -984 986 0.5 -984 1091 0.333333 -984 1092 0.833333 -985 1092 0.333333 -987 988 1.0 -992 993 1.0 -994 995 0.25 -994 996 0.25 -994 997 0.25 -994 998 0.25 -995 996 0.25 -995 997 0.25 -995 998 0.25 -996 997 0.25 -996 998 0.25 -997 998 0.25 -999 1000 1.0 -1000 1201 0.142857 -1000 1202 0.142857 -1000 1203 0.142857 -1000 1204 0.142857 -1000 1205 0.142857 -1000 1504 0.5 -1000 1514 0.5 -1002 1003 0.833333 -1002 1004 0.333333 -1003 1004 0.333333 -1006 1007 1.0 -1009 1010 1.0 -1010 1045 1.0 -1011 1012 1.0 -1013 1014 1.0 -1016 1071 0.333333 -1017 1018 1.2 -1017 1306 0.2 -1017 1307 0.2 -1017 1308 0.2 -1017 1309 0.2 -1018 1303 0.5 -1018 1304 0.5 -1018 1305 1.0 -1018 1306 0.2 -1018 1307 0.2 -1018 1308 0.2 -1018 1309 0.2 -1021 1022 0.25 -1021 1023 0.75 -1022 1023 0.25 -1024 1025 0.5 -1026 1027 1.0 -1026 1416 0.333333 -1026 1417 0.333333 -1028 1029 0.333333 -1031 1032 1.0 -1033 1034 1.0 -1035 1036 1.0 -1035 1037 0.5 -1035 1038 0.5 -1037 1038 0.5 -1039 1040 0.5 -1042 1043 0.5 -1042 1044 0.5 -1043 1044 0.5 -1047 1048 0.25 -1047 1049 0.25 -1047 1050 0.25 -1048 1049 0.25 -1048 1050 0.25 -1049 1050 0.25 -1052 1053 1.0 -1054 1055 1.0 -1054 1056 0.333333 -1054 1057 0.333333 -1054 1058 0.333333 -1056 1057 0.333333 -1056 1058 0.333333 -1057 1058 0.333333 -1060 1061 0.111111 -1060 1062 0.111111 -1060 1063 0.111111 -1060 1064 0.111111 -1060 1065 0.111111 -1060 1066 0.111111 -1060 1067 0.111111 -1060 1068 0.111111 -1060 1069 0.111111 -1060 1412 1.0 -1061 1062 0.111111 -1061 1063 0.111111 -1061 1064 0.111111 -1061 1065 0.111111 -1061 1066 0.111111 -1061 1067 0.111111 -1061 1068 0.111111 -1061 1069 0.111111 -1062 1063 0.111111 -1062 1064 0.111111 -1062 1065 0.111111 -1062 1066 0.111111 -1062 1067 0.111111 -1062 1068 0.111111 -1062 1069 0.111111 -1063 1064 0.111111 -1063 1065 0.111111 -1063 1066 0.111111 -1063 1067 0.111111 -1063 1068 0.111111 -1063 1069 0.111111 -1064 1065 0.111111 -1064 1066 0.111111 -1064 1067 0.111111 -1064 1068 0.111111 -1064 1069 0.111111 -1065 1066 0.111111 -1065 1067 0.111111 -1065 1068 0.111111 -1065 1069 0.111111 -1066 1067 0.111111 -1066 1068 0.111111 -1066 1069 0.111111 -1067 1068 0.111111 -1067 1069 0.111111 -1068 1069 0.111111 -1070 1071 0.142857 -1070 1072 0.142857 -1070 1073 0.142857 -1071 1072 0.142857 -1071 1073 0.142857 -1072 1073 0.142857 -1078 1079 1.0 -1082 1083 0.5 -1086 1087 0.5 -1087 1088 0.5 -1087 1089 0.5 -1093 1094 0.333333 -1093 1095 0.333333 -1093 1096 0.333333 -1094 1095 0.333333 -1094 1096 0.333333 -1095 1096 0.333333 -1097 1098 0.5 -1097 1099 0.5 -1098 1099 0.5 -1101 1102 0.5 -1101 1103 0.5 -1102 1103 0.5 -1105 1106 0.125 -1105 1107 0.125 -1105 1108 0.125 -1105 1109 0.125 -1105 1110 0.125 -1105 1111 0.125 -1105 1112 0.125 -1105 1113 0.125 -1106 1107 0.125 -1106 1108 0.125 -1106 1109 0.125 -1106 1110 0.125 -1106 1111 0.125 -1106 1112 0.125 -1106 1113 0.125 -1107 1108 0.125 -1107 1109 0.125 -1107 1110 0.125 -1107 1111 0.125 -1107 1112 0.125 -1107 1113 0.125 -1107 1357 0.333333 -1107 1358 0.333333 -1107 1411 0.333333 -1108 1109 0.125 -1108 1110 0.125 -1108 1111 0.125 -1108 1112 0.125 -1108 1113 0.125 -1109 1110 0.125 -1109 1111 0.125 -1109 1112 0.125 -1109 1113 0.125 -1110 1111 0.125 -1110 1112 0.125 -1110 1113 0.125 -1111 1112 0.125 -1111 1113 0.125 -1112 1113 0.125 -1114 1115 1.0 -1116 1117 0.25 -1116 1118 0.25 -1116 1119 0.25 -1116 1120 0.25 -1117 1118 0.25 -1117 1119 0.25 -1117 1120 0.25 -1118 1119 0.25 -1118 1120 0.25 -1119 1120 0.25 -1120 1515 0.333333 -1120 1516 0.333333 -1120 1517 0.333333 -1121 1122 0.5 -1124 1125 0.333333 -1127 1128 1.0 -1131 1132 1.0 -1133 1134 1.0 -1135 1136 0.25 -1135 1137 0.25 -1135 1138 0.333333 -1136 1137 0.25 -1139 1140 1.0 -1141 1142 1.0 -1142 1488 0.5 -1142 1489 0.5 -1145 1282 0.333333 -1145 1283 0.333333 -1145 1394 0.142857 -1145 1395 0.142857 -1145 1396 0.142857 -1145 1397 0.142857 -1145 1560 0.333333 -1145 1561 0.333333 -1146 1147 0.25 -1146 1148 0.25 -1146 1149 0.25 -1146 1150 0.25 -1147 1148 0.25 -1147 1149 0.25 -1147 1150 0.25 -1148 1149 0.25 -1148 1150 0.25 -1149 1150 0.25 -1152 1153 0.125 -1152 1154 0.125 -1152 1155 0.125 -1152 1156 0.125 -1152 1157 0.125 -1152 1158 0.125 -1152 1159 0.125 -1152 1160 0.125 -1153 1154 0.125 -1153 1155 0.125 -1153 1156 0.125 -1153 1157 0.125 -1153 1158 0.125 -1153 1159 0.125 -1153 1160 0.125 -1154 1155 0.125 -1154 1156 0.125 -1154 1157 0.125 -1154 1158 0.125 -1154 1159 0.125 -1154 1160 0.125 -1155 1156 0.125 -1155 1157 0.125 -1155 1158 0.125 -1155 1159 0.125 -1155 1160 0.125 -1156 1157 0.125 -1156 1158 0.125 -1156 1159 0.125 -1156 1160 0.125 -1157 1158 0.125 -1157 1159 0.125 -1157 1160 0.125 -1158 1159 0.125 -1158 1160 0.125 -1159 1160 0.125 -1162 1163 0.5 -1162 1413 0.25 -1162 1414 0.25 -1162 1415 0.25 -1164 1165 1.0 -1166 1167 0.333333 -1168 1169 1.0 -1175 1176 0.5 -1178 1342 0.333333 -1180 1181 0.25 -1184 1185 0.5 -1184 1186 0.5 -1185 1186 0.5 -1190 1191 0.2 -1193 1194 1.0 -1195 1196 0.333333 -1195 1197 0.333333 -1196 1197 0.333333 -1198 1199 0.5 -1198 1200 0.5 -1199 1200 0.5 -1201 1202 0.142857 -1201 1203 0.142857 -1201 1204 0.142857 -1201 1205 0.142857 -1201 1206 0.142857 -1201 1207 0.142857 -1201 1208 0.142857 -1201 1256 0.333333 -1201 1257 0.333333 -1202 1203 0.142857 -1202 1204 0.142857 -1202 1205 0.142857 -1203 1204 0.142857 -1203 1205 0.142857 -1204 1205 0.142857 -1206 1207 0.142857 -1206 1208 0.142857 -1207 1208 0.142857 -1209 1210 0.333333 -1209 1211 0.333333 -1209 1212 0.333333 -1210 1211 0.333333 -1210 1212 0.333333 -1211 1212 0.333333 -1214 1215 0.25 -1214 1216 0.25 -1214 1217 0.25 -1215 1216 0.25 -1215 1217 0.25 -1216 1217 0.25 -1218 1219 1.0 -1222 1223 0.5 -1222 1224 0.5 -1223 1224 0.5 -1225 1226 1.0 -1225 1227 1.0 -1225 1345 1.0 -1228 1229 0.25 -1231 1232 1.0 -1233 1234 0.5 -1235 1236 0.5 -1237 1238 1.0 -1240 1241 1.0 -1242 1243 1.0 -1244 1245 0.25 -1244 1246 0.25 -1244 1247 0.25 -1245 1246 0.25 -1245 1247 0.25 -1246 1247 0.25 -1248 1249 1.0 -1250 1251 0.5 -1252 1253 0.5 -1252 1254 1.5 -1253 1254 0.5 -1256 1257 0.333333 -1258 1259 1.0 -1260 1261 0.5 -1260 1262 0.5 -1261 1262 0.5 -1264 1265 0.333333 -1264 1266 0.333333 -1264 1267 0.333333 -1265 1266 0.333333 -1265 1267 0.333333 -1266 1267 0.333333 -1271 1272 0.5 -1273 1274 0.75 -1273 1275 0.25 -1273 1276 0.25 -1274 1275 0.25 -1274 1276 0.25 -1275 1276 0.25 -1279 1280 0.333333 -1279 1281 0.333333 -1280 1281 0.333333 -1282 1283 0.333333 -1286 1287 0.25 -1286 1288 0.25 -1286 1289 0.25 -1286 1290 0.25 -1286 1364 0.25 -1286 1365 0.25 -1286 1366 0.25 -1286 1367 0.25 -1287 1288 0.25 -1287 1289 0.25 -1287 1290 0.25 -1288 1289 0.25 -1288 1290 0.25 -1289 1290 0.25 -1292 1293 0.5 -1292 1294 0.5 -1293 1294 0.5 -1294 1377 0.5 -1294 1378 0.5 -1298 1299 1.0 -1303 1304 0.5 -1306 1307 0.2 -1306 1308 0.2 -1306 1309 0.2 -1307 1308 0.2 -1307 1309 0.2 -1308 1309 0.2 -1310 1311 1.0 -1312 1313 0.25 -1312 1314 0.25 -1312 1315 0.25 -1312 1316 0.25 -1313 1314 0.25 -1313 1315 0.25 -1313 1316 0.25 -1314 1315 0.25 -1314 1316 0.25 -1315 1316 0.25 -1315 1468 0.25 -1315 1469 0.25 -1315 1470 0.25 -1320 1321 1.0 -1323 1324 0.5 -1323 1325 0.5 -1324 1325 0.5 -1326 1327 1.0 -1328 1329 1.0 -1331 1332 0.5 -1331 1333 0.5 -1332 1333 0.5 -1335 1336 0.333333 -1335 1337 0.333333 -1335 1338 0.333333 -1336 1337 0.333333 -1336 1338 0.333333 -1336 1419 1.0 -1337 1338 0.333333 -1343 1344 0.5 -1347 1348 0.5 -1349 1350 0.25 -1349 1351 0.25 -1349 1352 0.25 -1350 1351 0.25 -1350 1352 0.25 -1351 1352 0.25 -1354 1355 1.0 -1356 1357 1.0 -1356 1358 1.0 -1356 1359 1.0 -1357 1358 2.33333 -1357 1411 0.333333 -1358 1411 0.333333 -1360 1453 1.0 -1361 1362 0.333333 -1364 1365 0.25 -1364 1366 0.25 -1364 1367 0.25 -1365 1366 0.25 -1365 1367 0.25 -1366 1367 0.25 -1368 1369 0.2 -1370 1371 1.0 -1372 1373 1.0 -1374 1375 0.5 -1374 1376 0.5 -1375 1376 0.5 -1377 1378 0.5 -1384 1385 0.5 -1386 1387 1.0 -1390 1391 0.5 -1390 1392 0.5 -1391 1392 0.5 -1394 1395 0.142857 -1394 1396 0.142857 -1394 1397 0.142857 -1395 1396 0.142857 -1395 1397 0.142857 -1396 1397 0.142857 -1399 1400 0.25 -1399 1401 0.25 -1399 1402 0.25 -1399 1403 0.25 -1400 1401 0.25 -1400 1402 0.25 -1400 1403 0.25 -1401 1402 0.25 -1401 1403 0.25 -1402 1403 0.25 -1404 1405 0.166667 -1404 1406 0.166667 -1404 1407 0.166667 -1404 1408 0.166667 -1405 1406 0.166667 -1405 1407 0.166667 -1405 1408 0.166667 -1406 1407 0.166667 -1406 1408 0.166667 -1407 1408 0.166667 -1409 1410 0.5 -1413 1414 0.25 -1413 1415 0.25 -1414 1415 0.25 -1416 1417 0.333333 -1420 1421 0.333333 -1420 1422 0.333333 -1420 1423 0.333333 -1421 1422 0.333333 -1421 1423 0.333333 -1422 1423 0.333333 -1424 1425 0.5 -1426 1427 0.5 -1426 1428 0.5 -1427 1428 0.5 -1429 1430 0.385965 -1429 1431 0.385965 -1429 1432 0.0526316 -1429 1433 0.0526316 -1429 1434 0.0526316 -1429 1435 0.0526316 -1429 1436 0.0526316 -1429 1437 0.0526316 -1429 1438 0.0526316 -1429 1439 0.0526316 -1429 1440 0.0526316 -1429 1441 0.0526316 -1429 1442 0.0526316 -1429 1443 0.0526316 -1429 1444 0.0526316 -1429 1445 0.0526316 -1429 1446 0.0526316 -1429 1447 0.0526316 -1429 1448 0.333333 -1430 1431 0.385965 -1430 1432 0.0526316 -1430 1433 0.0526316 -1430 1434 0.0526316 -1430 1435 0.0526316 -1430 1436 0.0526316 -1430 1437 0.0526316 -1430 1438 0.0526316 -1430 1439 0.0526316 -1430 1440 0.0526316 -1430 1441 0.0526316 -1430 1442 0.0526316 -1430 1443 0.0526316 -1430 1444 0.0526316 -1430 1445 0.0526316 -1430 1446 0.0526316 -1430 1447 0.0526316 -1430 1448 0.333333 -1431 1432 0.0526316 -1431 1433 0.0526316 -1431 1434 0.0526316 -1431 1435 0.0526316 -1431 1436 0.0526316 -1431 1437 0.0526316 -1431 1438 0.0526316 -1431 1439 0.0526316 -1431 1440 0.0526316 -1431 1441 0.0526316 -1431 1442 0.0526316 -1431 1443 0.0526316 -1431 1444 0.0526316 -1431 1445 0.0526316 -1431 1446 0.0526316 -1431 1447 0.0526316 -1431 1448 0.333333 -1432 1433 0.0526316 -1432 1434 0.0526316 -1432 1435 0.0526316 -1432 1436 0.0526316 -1432 1437 0.0526316 -1432 1438 0.0526316 -1432 1439 0.0526316 -1432 1440 0.0526316 -1432 1441 0.0526316 -1432 1442 0.0526316 -1432 1443 0.0526316 -1432 1444 0.0526316 -1432 1445 0.0526316 -1432 1446 0.0526316 -1432 1447 0.0526316 -1433 1434 0.0526316 -1433 1435 0.0526316 -1433 1436 0.0526316 -1433 1437 0.0526316 -1433 1438 0.0526316 -1433 1439 0.0526316 -1433 1440 0.0526316 -1433 1441 0.0526316 -1433 1442 0.0526316 -1433 1443 0.0526316 -1433 1444 0.0526316 -1433 1445 0.0526316 -1433 1446 0.0526316 -1433 1447 0.0526316 -1434 1435 0.0526316 -1434 1436 0.0526316 -1434 1437 0.0526316 -1434 1438 0.0526316 -1434 1439 0.0526316 -1434 1440 0.0526316 -1434 1441 0.0526316 -1434 1442 0.0526316 -1434 1443 0.0526316 -1434 1444 0.0526316 -1434 1445 0.0526316 -1434 1446 0.0526316 -1434 1447 0.0526316 -1435 1436 0.0526316 -1435 1437 0.0526316 -1435 1438 0.0526316 -1435 1439 0.0526316 -1435 1440 0.0526316 -1435 1441 0.0526316 -1435 1442 0.0526316 -1435 1443 0.0526316 -1435 1444 0.0526316 -1435 1445 0.0526316 -1435 1446 0.0526316 -1435 1447 0.0526316 -1436 1437 0.0526316 -1436 1438 0.0526316 -1436 1439 0.0526316 -1436 1440 0.0526316 -1436 1441 0.0526316 -1436 1442 0.0526316 -1436 1443 0.0526316 -1436 1444 0.0526316 -1436 1445 0.0526316 -1436 1446 0.0526316 -1436 1447 0.0526316 -1437 1438 0.0526316 -1437 1439 0.0526316 -1437 1440 0.0526316 -1437 1441 0.0526316 -1437 1442 0.0526316 -1437 1443 0.0526316 -1437 1444 0.0526316 -1437 1445 0.0526316 -1437 1446 0.0526316 -1437 1447 0.0526316 -1438 1439 0.0526316 -1438 1440 0.0526316 -1438 1441 0.0526316 -1438 1442 0.0526316 -1438 1443 0.0526316 -1438 1444 0.0526316 -1438 1445 0.0526316 -1438 1446 0.0526316 -1438 1447 0.0526316 -1439 1440 0.0526316 -1439 1441 0.0526316 -1439 1442 0.0526316 -1439 1443 0.0526316 -1439 1444 0.0526316 -1439 1445 0.0526316 -1439 1446 0.0526316 -1439 1447 0.0526316 -1440 1441 0.0526316 -1440 1442 0.0526316 -1440 1443 0.0526316 -1440 1444 0.0526316 -1440 1445 0.0526316 -1440 1446 0.0526316 -1440 1447 0.0526316 -1441 1442 0.0526316 -1441 1443 0.0526316 -1441 1444 0.0526316 -1441 1445 0.0526316 -1441 1446 0.0526316 -1441 1447 0.0526316 -1442 1443 0.0526316 -1442 1444 0.0526316 -1442 1445 0.0526316 -1442 1446 0.0526316 -1442 1447 0.0526316 -1443 1444 0.0526316 -1443 1445 0.0526316 -1443 1446 0.0526316 -1443 1447 0.0526316 -1444 1445 0.0526316 -1444 1446 0.0526316 -1444 1447 0.0526316 -1445 1446 0.0526316 -1445 1447 0.0526316 -1446 1447 0.0526316 -1449 1450 1.0 -1456 1457 0.333333 -1456 1458 0.333333 -1456 1459 0.333333 -1457 1458 0.333333 -1457 1459 0.333333 -1458 1459 0.333333 -1464 1465 0.2 -1464 1466 0.2 -1464 1467 0.2 -1465 1466 0.2 -1465 1467 0.2 -1466 1467 0.2 -1468 1469 0.25 -1468 1470 0.25 -1469 1470 0.25 -1471 1472 0.5 -1471 1473 0.5 -1472 1473 0.5 -1474 1475 0.5 -1474 1476 0.5 -1475 1476 0.5 -1477 1478 0.5 -1479 1480 1.0 -1481 1482 0.5 -1483 1484 0.5 -1483 1485 0.5 -1484 1485 0.5 -1486 1487 1.0 -1488 1489 0.5 -1491 1492 1.0 -1491 1493 0.25 -1491 1540 0.25 -1491 1541 0.25 -1491 1542 0.25 -1493 1494 1.0 -1493 1540 0.25 -1493 1541 0.25 -1493 1542 0.25 -1495 1496 1.0 -1500 1501 0.25 -1500 1502 0.25 -1500 1503 0.25 -1501 1502 0.25 -1501 1503 0.25 -1502 1503 0.25 -1504 1505 0.2 -1504 1506 0.2 -1504 1507 0.2 -1504 1508 0.2 -1504 1509 0.2 -1504 1514 0.5 -1505 1506 0.2 -1505 1507 0.2 -1505 1508 0.2 -1505 1509 0.2 -1506 1507 0.2 -1506 1508 0.2 -1506 1509 0.2 -1507 1508 0.2 -1507 1509 0.2 -1508 1509 0.2 -1511 1512 0.5 -1511 1513 0.5 -1512 1513 0.5 -1515 1516 0.333333 -1515 1517 0.333333 -1516 1517 0.333333 -1518 1519 0.25 -1518 1520 0.25 -1519 1520 0.25 -1522 1523 1.0 -1525 1526 1.0 -1530 1531 1.0 -1533 1534 0.2 -1533 1535 0.2 -1534 1535 0.2 -1537 1538 0.5 -1537 1539 0.5 -1538 1539 0.5 -1540 1541 0.25 -1540 1542 0.25 -1541 1542 0.25 -1543 1544 1.0 -1545 1546 0.333333 -1545 1547 0.333333 -1545 1548 0.333333 -1546 1547 0.333333 -1546 1548 0.333333 -1547 1548 0.333333 -1550 1551 0.333333 -1553 1554 0.333333 -1553 1555 0.333333 -1554 1555 0.333333 -1556 1557 0.333333 -1556 1558 0.333333 -1557 1558 0.333333 -1560 1561 0.333333 -1562 1563 0.142857 -1562 1564 0.142857 -1562 1565 0.142857 -1562 1566 0.142857 -1562 1567 0.142857 -1563 1564 0.142857 -1563 1565 0.142857 -1563 1566 0.142857 -1563 1567 0.142857 -1564 1565 0.142857 -1564 1566 0.142857 -1564 1567 0.142857 -1565 1566 0.142857 -1565 1567 0.142857 -1566 1567 0.142857 -1568 1569 1.0 -1570 1571 0.2 -1570 1572 0.2 -1570 1573 0.2 -1571 1572 0.2 -1571 1573 0.2 -1572 1573 0.2 -1575 1576 0.333333 -1575 1577 0.333333 -1575 1578 0.333333 -1576 1577 0.333333 -1576 1578 0.333333 -1577 1578 0.333333 -1580 1581 1.0 -1583 1584 1.0 -1585 1586 1.0 -1585 1587 1.0 diff --git a/python/datasets/polbooks.csv b/python/datasets/polbooks.csv deleted file mode 100644 index e48e7fc4618..00000000000 --- a/python/datasets/polbooks.csv +++ /dev/null @@ -1,882 +0,0 @@ -1 0 1.0 -2 0 1.0 -3 0 1.0 -4 0 1.0 -5 0 1.0 -6 0 1.0 -3 1 1.0 -5 1 1.0 -6 1 1.0 -4 2 1.0 -5 2 1.0 -7 2 1.0 -5 3 1.0 -8 3 1.0 -9 3 1.0 -10 3 1.0 -11 3 1.0 -12 3 1.0 -13 3 1.0 -14 3 1.0 -15 3 1.0 -16 3 1.0 -17 3 1.0 -18 3 1.0 -19 3 1.0 -20 3 1.0 -21 3 1.0 -22 3 1.0 -23 3 1.0 -24 3 1.0 -25 3 1.0 -26 3 1.0 -27 3 1.0 -5 4 1.0 -6 4 1.0 -28 4 1.0 -29 4 1.0 -30 4 1.0 -31 4 1.0 -6 5 1.0 -7 5 1.0 -7 6 1.0 -10 6 1.0 -12 6 1.0 -18 6 1.0 -22 6 1.0 -25 6 1.0 -29 6 1.0 -14 7 1.0 -30 7 1.0 -58 7 1.0 -71 7 1.0 -85 7 1.0 -9 8 1.0 -10 8 1.0 -11 8 1.0 -12 8 1.0 -13 8 1.0 -14 8 1.0 -20 8 1.0 -21 8 1.0 -22 8 1.0 -23 8 1.0 -24 8 1.0 -26 8 1.0 -27 8 1.0 -32 8 1.0 -33 8 1.0 -35 8 1.0 -37 8 1.0 -40 8 1.0 -41 8 1.0 -42 8 1.0 -43 8 1.0 -44 8 1.0 -45 8 1.0 -46 8 1.0 -11 9 1.0 -12 9 1.0 -14 9 1.0 -20 9 1.0 -24 9 1.0 -27 9 1.0 -41 9 1.0 -45 9 1.0 -47 9 1.0 -48 9 1.0 -49 9 1.0 -50 9 1.0 -51 9 1.0 -52 9 1.0 -11 10 1.0 -12 10 1.0 -15 10 1.0 -16 10 1.0 -19 10 1.0 -21 10 1.0 -33 10 1.0 -35 10 1.0 -37 10 1.0 -38 10 1.0 -39 10 1.0 -55 10 1.0 -12 11 1.0 -13 11 1.0 -14 11 1.0 -17 11 1.0 -20 11 1.0 -21 11 1.0 -22 11 1.0 -26 11 1.0 -27 11 1.0 -29 11 1.0 -45 11 1.0 -47 11 1.0 -50 11 1.0 -56 11 1.0 -13 12 1.0 -14 12 1.0 -15 12 1.0 -17 12 1.0 -18 12 1.0 -23 12 1.0 -24 12 1.0 -32 12 1.0 -33 12 1.0 -36 12 1.0 -38 12 1.0 -39 12 1.0 -40 12 1.0 -41 12 1.0 -44 12 1.0 -46 12 1.0 -47 12 1.0 -54 12 1.0 -55 12 1.0 -17 13 1.0 -29 13 1.0 -32 13 1.0 -40 13 1.0 -42 13 1.0 -43 13 1.0 -44 13 1.0 -47 13 1.0 -57 13 1.0 -25 14 1.0 -26 14 1.0 -58 14 1.0 -16 15 1.0 -55 15 1.0 -47 17 1.0 -55 19 1.0 -56 19 1.0 -77 19 1.0 -24 20 1.0 -40 20 1.0 -48 20 1.0 -49 20 1.0 -53 20 1.0 -57 20 1.0 -23 21 1.0 -25 22 1.0 -40 22 1.0 -52 22 1.0 -27 23 1.0 -32 23 1.0 -33 23 1.0 -47 23 1.0 -54 23 1.0 -26 24 1.0 -40 24 1.0 -47 24 1.0 -53 24 1.0 -40 25 1.0 -40 26 1.0 -45 26 1.0 -47 26 1.0 -53 26 1.0 -40 27 1.0 -41 27 1.0 -47 27 1.0 -54 27 1.0 -66 28 1.0 -72 28 1.0 -31 30 1.0 -58 30 1.0 -66 30 1.0 -67 30 1.0 -70 30 1.0 -73 30 1.0 -74 30 1.0 -75 30 1.0 -76 30 1.0 -77 30 1.0 -79 30 1.0 -80 30 1.0 -82 30 1.0 -83 30 1.0 -84 30 1.0 -86 30 1.0 -93 30 1.0 -99 30 1.0 -49 31 1.0 -73 31 1.0 -74 31 1.0 -75 31 1.0 -76 31 1.0 -77 31 1.0 -78 31 1.0 -82 31 1.0 -91 31 1.0 -33 32 1.0 -37 33 1.0 -38 33 1.0 -39 33 1.0 -47 33 1.0 -35 34 1.0 -36 34 1.0 -37 34 1.0 -38 34 1.0 -39 34 1.0 -36 35 1.0 -37 35 1.0 -38 35 1.0 -39 35 1.0 -40 35 1.0 -43 35 1.0 -44 35 1.0 -41 36 1.0 -47 36 1.0 -38 37 1.0 -47 37 1.0 -39 38 1.0 -40 39 1.0 -42 39 1.0 -41 40 1.0 -42 40 1.0 -44 40 1.0 -45 40 1.0 -47 40 1.0 -53 40 1.0 -54 40 1.0 -47 41 1.0 -54 41 1.0 -43 42 1.0 -47 42 1.0 -56 43 1.0 -47 45 1.0 -47 46 1.0 -102 46 1.0 -54 47 1.0 -49 48 1.0 -57 48 1.0 -57 49 1.0 -58 49 1.0 -72 49 1.0 -76 49 1.0 -58 50 1.0 -52 51 1.0 -58 51 1.0 -64 51 1.0 -65 51 1.0 -69 51 1.0 -58 52 1.0 -64 52 1.0 -76 53 1.0 -57 56 1.0 -64 58 1.0 -65 58 1.0 -68 58 1.0 -69 58 1.0 -77 58 1.0 -85 58 1.0 -60 59 1.0 -61 59 1.0 -62 59 1.0 -63 59 1.0 -99 59 1.0 -62 60 1.0 -63 60 1.0 -84 60 1.0 -86 60 1.0 -99 60 1.0 -86 61 1.0 -95 61 1.0 -101 61 1.0 -63 62 1.0 -84 62 1.0 -99 62 1.0 -100 62 1.0 -99 63 1.0 -65 64 1.0 -66 64 1.0 -67 64 1.0 -68 64 1.0 -69 64 1.0 -70 64 1.0 -67 65 1.0 -68 65 1.0 -69 65 1.0 -85 65 1.0 -67 66 1.0 -70 66 1.0 -72 66 1.0 -73 66 1.0 -74 66 1.0 -76 66 1.0 -80 66 1.0 -84 66 1.0 -85 66 1.0 -86 66 1.0 -88 66 1.0 -89 66 1.0 -90 66 1.0 -93 66 1.0 -96 66 1.0 -97 66 1.0 -99 66 1.0 -100 66 1.0 -103 67 1.0 -104 67 1.0 -71 68 1.0 -104 69 1.0 -71 70 1.0 -72 70 1.0 -75 70 1.0 -90 70 1.0 -72 71 1.0 -73 71 1.0 -74 71 1.0 -75 71 1.0 -76 71 1.0 -77 71 1.0 -78 71 1.0 -79 71 1.0 -80 71 1.0 -81 71 1.0 -82 71 1.0 -83 71 1.0 -73 72 1.0 -74 72 1.0 -75 72 1.0 -76 72 1.0 -78 72 1.0 -79 72 1.0 -80 72 1.0 -82 72 1.0 -84 72 1.0 -85 72 1.0 -86 72 1.0 -87 72 1.0 -88 72 1.0 -89 72 1.0 -90 72 1.0 -91 72 1.0 -92 72 1.0 -74 73 1.0 -75 73 1.0 -82 73 1.0 -83 73 1.0 -84 73 1.0 -86 73 1.0 -89 73 1.0 -92 73 1.0 -93 73 1.0 -94 73 1.0 -95 73 1.0 -96 73 1.0 -97 73 1.0 -98 73 1.0 -99 73 1.0 -100 73 1.0 -75 74 1.0 -78 74 1.0 -79 74 1.0 -82 74 1.0 -84 74 1.0 -87 74 1.0 -88 74 1.0 -91 74 1.0 -98 74 1.0 -99 74 1.0 -76 75 1.0 -77 75 1.0 -78 75 1.0 -79 75 1.0 -82 75 1.0 -83 75 1.0 -84 75 1.0 -91 75 1.0 -92 75 1.0 -77 76 1.0 -82 76 1.0 -83 76 1.0 -84 76 1.0 -86 76 1.0 -84 79 1.0 -91 79 1.0 -100 79 1.0 -84 81 1.0 -86 81 1.0 -97 81 1.0 -84 82 1.0 -84 83 1.0 -87 83 1.0 -100 83 1.0 -86 84 1.0 -87 84 1.0 -88 84 1.0 -89 84 1.0 -94 84 1.0 -96 84 1.0 -97 84 1.0 -99 84 1.0 -100 84 1.0 -101 84 1.0 -89 86 1.0 -93 86 1.0 -97 86 1.0 -100 86 1.0 -101 86 1.0 -98 87 1.0 -89 88 1.0 -91 90 1.0 -99 90 1.0 -98 91 1.0 -100 91 1.0 -94 93 1.0 -99 93 1.0 -102 93 1.0 -95 94 1.0 -96 94 1.0 -101 94 1.0 -102 94 1.0 -102 95 1.0 -97 96 1.0 -100 96 1.0 -100 98 1.0 -100 99 1.0 -101 100 1.0 -104 103 1.0 -0 1 1.0 -0 2 1.0 -0 3 1.0 -0 4 1.0 -0 5 1.0 -0 6 1.0 -1 3 1.0 -1 5 1.0 -1 6 1.0 -2 4 1.0 -2 5 1.0 -2 7 1.0 -3 5 1.0 -3 8 1.0 -3 9 1.0 -3 10 1.0 -3 11 1.0 -3 12 1.0 -3 13 1.0 -3 14 1.0 -3 15 1.0 -3 16 1.0 -3 17 1.0 -3 18 1.0 -3 19 1.0 -3 20 1.0 -3 21 1.0 -3 22 1.0 -3 23 1.0 -3 24 1.0 -3 25 1.0 -3 26 1.0 -3 27 1.0 -4 5 1.0 -4 6 1.0 -4 28 1.0 -4 29 1.0 -4 30 1.0 -4 31 1.0 -5 6 1.0 -5 7 1.0 -6 7 1.0 -6 10 1.0 -6 12 1.0 -6 18 1.0 -6 22 1.0 -6 25 1.0 -6 29 1.0 -7 14 1.0 -7 30 1.0 -7 58 1.0 -7 71 1.0 -7 85 1.0 -8 9 1.0 -8 10 1.0 -8 11 1.0 -8 12 1.0 -8 13 1.0 -8 14 1.0 -8 20 1.0 -8 21 1.0 -8 22 1.0 -8 23 1.0 -8 24 1.0 -8 26 1.0 -8 27 1.0 -8 32 1.0 -8 33 1.0 -8 35 1.0 -8 37 1.0 -8 40 1.0 -8 41 1.0 -8 42 1.0 -8 43 1.0 -8 44 1.0 -8 45 1.0 -8 46 1.0 -9 11 1.0 -9 12 1.0 -9 14 1.0 -9 20 1.0 -9 24 1.0 -9 27 1.0 -9 41 1.0 -9 45 1.0 -9 47 1.0 -9 48 1.0 -9 49 1.0 -9 50 1.0 -9 51 1.0 -9 52 1.0 -10 11 1.0 -10 12 1.0 -10 15 1.0 -10 16 1.0 -10 19 1.0 -10 21 1.0 -10 33 1.0 -10 35 1.0 -10 37 1.0 -10 38 1.0 -10 39 1.0 -10 55 1.0 -11 12 1.0 -11 13 1.0 -11 14 1.0 -11 17 1.0 -11 20 1.0 -11 21 1.0 -11 22 1.0 -11 26 1.0 -11 27 1.0 -11 29 1.0 -11 45 1.0 -11 47 1.0 -11 50 1.0 -11 56 1.0 -12 13 1.0 -12 14 1.0 -12 15 1.0 -12 17 1.0 -12 18 1.0 -12 23 1.0 -12 24 1.0 -12 32 1.0 -12 33 1.0 -12 36 1.0 -12 38 1.0 -12 39 1.0 -12 40 1.0 -12 41 1.0 -12 44 1.0 -12 46 1.0 -12 47 1.0 -12 54 1.0 -12 55 1.0 -13 17 1.0 -13 29 1.0 -13 32 1.0 -13 40 1.0 -13 42 1.0 -13 43 1.0 -13 44 1.0 -13 47 1.0 -13 57 1.0 -14 25 1.0 -14 26 1.0 -14 58 1.0 -15 16 1.0 -15 55 1.0 -17 47 1.0 -19 55 1.0 -19 56 1.0 -19 77 1.0 -20 24 1.0 -20 40 1.0 -20 48 1.0 -20 49 1.0 -20 53 1.0 -20 57 1.0 -21 23 1.0 -22 25 1.0 -22 40 1.0 -22 52 1.0 -23 27 1.0 -23 32 1.0 -23 33 1.0 -23 47 1.0 -23 54 1.0 -24 26 1.0 -24 40 1.0 -24 47 1.0 -24 53 1.0 -25 40 1.0 -26 40 1.0 -26 45 1.0 -26 47 1.0 -26 53 1.0 -27 40 1.0 -27 41 1.0 -27 47 1.0 -27 54 1.0 -28 66 1.0 -28 72 1.0 -30 31 1.0 -30 58 1.0 -30 66 1.0 -30 67 1.0 -30 70 1.0 -30 73 1.0 -30 74 1.0 -30 75 1.0 -30 76 1.0 -30 77 1.0 -30 79 1.0 -30 80 1.0 -30 82 1.0 -30 83 1.0 -30 84 1.0 -30 86 1.0 -30 93 1.0 -30 99 1.0 -31 49 1.0 -31 73 1.0 -31 74 1.0 -31 75 1.0 -31 76 1.0 -31 77 1.0 -31 78 1.0 -31 82 1.0 -31 91 1.0 -32 33 1.0 -33 37 1.0 -33 38 1.0 -33 39 1.0 -33 47 1.0 -34 35 1.0 -34 36 1.0 -34 37 1.0 -34 38 1.0 -34 39 1.0 -35 36 1.0 -35 37 1.0 -35 38 1.0 -35 39 1.0 -35 40 1.0 -35 43 1.0 -35 44 1.0 -36 41 1.0 -36 47 1.0 -37 38 1.0 -37 47 1.0 -38 39 1.0 -39 40 1.0 -39 42 1.0 -40 41 1.0 -40 42 1.0 -40 44 1.0 -40 45 1.0 -40 47 1.0 -40 53 1.0 -40 54 1.0 -41 47 1.0 -41 54 1.0 -42 43 1.0 -42 47 1.0 -43 56 1.0 -45 47 1.0 -46 47 1.0 -46 102 1.0 -47 54 1.0 -48 49 1.0 -48 57 1.0 -49 57 1.0 -49 58 1.0 -49 72 1.0 -49 76 1.0 -50 58 1.0 -51 52 1.0 -51 58 1.0 -51 64 1.0 -51 65 1.0 -51 69 1.0 -52 58 1.0 -52 64 1.0 -53 76 1.0 -56 57 1.0 -58 64 1.0 -58 65 1.0 -58 68 1.0 -58 69 1.0 -58 77 1.0 -58 85 1.0 -59 60 1.0 -59 61 1.0 -59 62 1.0 -59 63 1.0 -59 99 1.0 -60 62 1.0 -60 63 1.0 -60 84 1.0 -60 86 1.0 -60 99 1.0 -61 86 1.0 -61 95 1.0 -61 101 1.0 -62 63 1.0 -62 84 1.0 -62 99 1.0 -62 100 1.0 -63 99 1.0 -64 65 1.0 -64 66 1.0 -64 67 1.0 -64 68 1.0 -64 69 1.0 -64 70 1.0 -65 67 1.0 -65 68 1.0 -65 69 1.0 -65 85 1.0 -66 67 1.0 -66 70 1.0 -66 72 1.0 -66 73 1.0 -66 74 1.0 -66 76 1.0 -66 80 1.0 -66 84 1.0 -66 85 1.0 -66 86 1.0 -66 88 1.0 -66 89 1.0 -66 90 1.0 -66 93 1.0 -66 96 1.0 -66 97 1.0 -66 99 1.0 -66 100 1.0 -67 103 1.0 -67 104 1.0 -68 71 1.0 -69 104 1.0 -70 71 1.0 -70 72 1.0 -70 75 1.0 -70 90 1.0 -71 72 1.0 -71 73 1.0 -71 74 1.0 -71 75 1.0 -71 76 1.0 -71 77 1.0 -71 78 1.0 -71 79 1.0 -71 80 1.0 -71 81 1.0 -71 82 1.0 -71 83 1.0 -72 73 1.0 -72 74 1.0 -72 75 1.0 -72 76 1.0 -72 78 1.0 -72 79 1.0 -72 80 1.0 -72 82 1.0 -72 84 1.0 -72 85 1.0 -72 86 1.0 -72 87 1.0 -72 88 1.0 -72 89 1.0 -72 90 1.0 -72 91 1.0 -72 92 1.0 -73 74 1.0 -73 75 1.0 -73 82 1.0 -73 83 1.0 -73 84 1.0 -73 86 1.0 -73 89 1.0 -73 92 1.0 -73 93 1.0 -73 94 1.0 -73 95 1.0 -73 96 1.0 -73 97 1.0 -73 98 1.0 -73 99 1.0 -73 100 1.0 -74 75 1.0 -74 78 1.0 -74 79 1.0 -74 82 1.0 -74 84 1.0 -74 87 1.0 -74 88 1.0 -74 91 1.0 -74 98 1.0 -74 99 1.0 -75 76 1.0 -75 77 1.0 -75 78 1.0 -75 79 1.0 -75 82 1.0 -75 83 1.0 -75 84 1.0 -75 91 1.0 -75 92 1.0 -76 77 1.0 -76 82 1.0 -76 83 1.0 -76 84 1.0 -76 86 1.0 -79 84 1.0 -79 91 1.0 -79 100 1.0 -81 84 1.0 -81 86 1.0 -81 97 1.0 -82 84 1.0 -83 84 1.0 -83 87 1.0 -83 100 1.0 -84 86 1.0 -84 87 1.0 -84 88 1.0 -84 89 1.0 -84 94 1.0 -84 96 1.0 -84 97 1.0 -84 99 1.0 -84 100 1.0 -84 101 1.0 -86 89 1.0 -86 93 1.0 -86 97 1.0 -86 100 1.0 -86 101 1.0 -87 98 1.0 -88 89 1.0 -90 91 1.0 -90 99 1.0 -91 98 1.0 -91 100 1.0 -93 94 1.0 -93 99 1.0 -93 102 1.0 -94 95 1.0 -94 96 1.0 -94 101 1.0 -94 102 1.0 -95 102 1.0 -96 97 1.0 -96 100 1.0 -98 100 1.0 -99 100 1.0 -100 101 1.0 -103 104 1.0 diff --git a/python/datasets/small_line.csv b/python/datasets/small_line.csv deleted file mode 100644 index 55494314212..00000000000 --- a/python/datasets/small_line.csv +++ /dev/null @@ -1,9 +0,0 @@ -0 1 1.0 -1 2 1.0 -2 3 1.0 -3 4 1.0 -4 5 1.0 -5 6 1.0 -6 7 1.0 -7 8 1.0 -8 9 1.0 diff --git a/python/datasets/small_tree.csv b/python/datasets/small_tree.csv deleted file mode 100644 index e8216bbb6ad..00000000000 --- a/python/datasets/small_tree.csv +++ /dev/null @@ -1,11 +0,0 @@ -0 1 1.0 -0 2 1.0 -0 3 1.0 -0 4 1.0 -1 5 1.0 -2 5 1.0 -3 5 1.0 -4 5 1.0 -5 6 1.0 -5 7 1.0 -5 8 1.0 From ed462b76fbf7c63e15876f2203f64af5189b359d Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 17 Apr 2023 20:52:38 +0000 Subject: [PATCH 03/37] fix style --- cpp/src/c_api/graph_mg.cpp | 17 +++---- cpp/src/c_api/graph_sg.cpp | 15 +++---- .../sampling/uniform_neighbor_sample.py | 2 +- .../cugraph/structure/convert_matrix.py | 18 ++++++-- .../cugraph/structure/graph_classes.py | 12 ++--- .../simpleDistributedGraph.py | 8 ++-- .../graph_implementation/simpleGraph.py | 45 ++++++++++++------- .../cugraph/tests/structure/test_graph.py | 29 +++++++----- .../cugraph/tests/structure/test_graph_mg.py | 28 +++++++----- 9 files changed, 101 insertions(+), 73 deletions(-) diff --git a/cpp/src/c_api/graph_mg.cpp b/cpp/src/c_api/graph_mg.cpp index abd8a9e3fa7..f59bf703f19 100644 --- a/cpp/src/c_api/graph_mg.cpp +++ b/cpp/src/c_api/graph_mg.cpp @@ -338,20 +338,17 @@ extern "C" cugraph_error_code_t cugraph_mg_graph_create( weight_type = cugraph_data_type_id_t::FLOAT32; } - CAPI_EXPECTS( - (edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), - CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", - *error); - - CAPI_EXPECTS( - (edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), + CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), + CUGRAPH_INVALID_INPUT, + "Invalid input arguments: Edge id type must match edge (src/dst) type", + *error); + + CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, "Invalid input arguments: src size != edge id prop size", *error); - CAPI_EXPECTS( - (edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), + CAPI_EXPECTS((edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, "Invalid input arguments: src size != edge type prop size", *error); diff --git a/cpp/src/c_api/graph_sg.cpp b/cpp/src/c_api/graph_sg.cpp index 4d0c73f38d1..2ec1c536651 100644 --- a/cpp/src/c_api/graph_sg.cpp +++ b/cpp/src/c_api/graph_sg.cpp @@ -513,20 +513,17 @@ extern "C" cugraph_error_code_t cugraph_sg_graph_create( weight_type = cugraph_data_type_id_t::FLOAT32; } - CAPI_EXPECTS( - (edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), - CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", - *error); + CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), + CUGRAPH_INVALID_INPUT, + "Invalid input arguments: Edge id type must match edge (src/dst) type", + *error); - CAPI_EXPECTS( - (edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), + CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, "Invalid input arguments: src size != edge id prop size", *error); - CAPI_EXPECTS( - (edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), + CAPI_EXPECTS((edge_type_ids == nullptr) || (p_edge_type_ids->size_ == p_src->size_), CUGRAPH_INVALID_INPUT, "Invalid input arguments: src size != edge type prop size", *error); diff --git a/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py index f363aaca4b3..d6acaa550eb 100644 --- a/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/sampling/uniform_neighbor_sample.py @@ -234,7 +234,7 @@ def uniform_neighbor_sample( df["destinations"] = destinations if indices is None: - df['indices'] = None + df["indices"] = None else: df["indices"] = indices if weight_t == "int32": diff --git a/python/cugraph/cugraph/structure/convert_matrix.py b/python/cugraph/cugraph/structure/convert_matrix.py index 85c4b9f6bd1..ca8e93c482b 100644 --- a/python/cugraph/cugraph/structure/convert_matrix.py +++ b/python/cugraph/cugraph/structure/convert_matrix.py @@ -77,12 +77,22 @@ def from_edgelist( if df_type is cudf.DataFrame: return from_cudf_edgelist( - df, source, destination, edge_attr=edge_attr, create_using=create_using, renumber=renumber + df, + source, + destination, + edge_attr=edge_attr, + create_using=create_using, + renumber=renumber, ) elif (pd is not None) and (df_type is pd.DataFrame): return from_pandas_edgelist( - df, source, destination, edge_attr=edge_attr, create_using=create_using, renumber=renumber + df, + source, + destination, + edge_attr=edge_attr, + create_using=create_using, + renumber=renumber, ) elif df_type is dask_cudf.core.DataFrame: @@ -99,7 +109,9 @@ def from_edgelist( "(or subclass) type or instance, got: " f"{type(create_using)}" ) - G.from_dask_cudf_edgelist(df, source, destination, edge_attr=edge_attr, renumber=renumber) + G.from_dask_cudf_edgelist( + df, source, destination, edge_attr=edge_attr, renumber=renumber + ) return G else: diff --git a/python/cugraph/cugraph/structure/graph_classes.py b/python/cugraph/cugraph/structure/graph_classes.py index 03d55bc4dd7..0b6efce2bd2 100644 --- a/python/cugraph/cugraph/structure/graph_classes.py +++ b/python/cugraph/cugraph/structure/graph_classes.py @@ -149,10 +149,10 @@ def from_cudf_edgelist( weight : str, optional (default=None) Name of the weight column in the input dataframe. - + edge_id : str, optional (default=None) Name of the edge id column in the input dataframe. - + edge_type : str, optional (default=None) Name of the edge type column in the input dataframe. @@ -311,10 +311,10 @@ def from_dask_cudf_edgelist( weight : str, optional (default=None) Name of the weight column in the input dataframe. - + edge_id : str, optional (default=None) Name of the edge id column in the input dataframe. - + edge_type : str, optional (default=None) Name of the edge type column in the input dataframe. @@ -399,10 +399,10 @@ def from_pandas_edgelist( weight : str, optional (default=None) Name of the weight column in the input dataframe. - + edge_id : str, optional (default=None) Name of the edge id column in the input dataframe. - + edge_type : str, optional (default=None) Name of the edge type column in the input dataframe. diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index 74178ab300b..f4b193d015e 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -207,19 +207,19 @@ def __from_edgelist( value_col_names = {} if weight is not None: value_col_names[weight] = self.edgeWeightCol - self.properties.weighted=True + self.properties.weighted = True if edge_id is not None: value_col_names[edge_id] = self.edgeIdCol if edge_type is not None: value_col_names[edge_type] = self.edgeTypeCol - + if len(value_col_names.keys()) > 0: input_ddf = input_ddf.rename(columns=value_col_names) value_col_names = list(value_col_names.values()) - + ddf_columns += value_col_names input_ddf = input_ddf[ddf_columns] - + if len(value_col_names) == 0: source_col, dest_col = symmetrize( input_ddf, diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index e15e3e852e3..78d7aedfc5a 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -16,7 +16,6 @@ from cugraph.structure.symmetrize import symmetrize from cugraph.structure.number_map import NumberMap import cugraph.dask.common.mg_utils as mg_utils -import cupy import cudf import dask_cudf import cugraph.dask.comms.comms as Comms @@ -24,8 +23,8 @@ import numpy as np import warnings from cugraph.dask.structure import replication -from typing import Union, Dict, List -from pylibcugraph import ( +from typing import Union, Dict +from pylibcugraph import ( get_two_hop_neighbors as pylibcugraph_get_two_hop_neighbors, select_random_vertices as pylibcugraph_select_random_vertices, ) @@ -46,8 +45,13 @@ class simpleGraphImpl: dstCol = "dst" class EdgeList: - def __init__(self, source:str, destination:str, edge_attr:Union[cudf.DataFrame, Dict[str, cudf.DataFrame]]=None): - print('edge attr: ', edge_attr) + def __init__( + self, + source: str, + destination: str, + edge_attr: Union[cudf.DataFrame, Dict[str, cudf.DataFrame]] = None, + ): + print("edge attr: ", edge_attr) self.edgelist_df = cudf.DataFrame() self.edgelist_df[simpleGraphImpl.srcCol] = source self.edgelist_df[simpleGraphImpl.dstCol] = destination @@ -57,7 +61,11 @@ def __init__(self, source:str, destination:str, edge_attr:Union[cudf.DataFrame, if edge_attr[simpleGraphImpl.edgeWeightCol] is not None: self.weights = True - for ea in [simpleGraphImpl.edgeIdCol, simpleGraphImpl.edgeTypeCol, simpleGraphImpl.edgeWeightCol]: + for ea in [ + simpleGraphImpl.edgeIdCol, + simpleGraphImpl.edgeTypeCol, + simpleGraphImpl.edgeWeightCol, + ]: if edge_attr[ea] is not None: self.edgelist_df[ea] = edge_attr[ea] else: @@ -173,13 +181,13 @@ def __from_edgelist( "types are not permitted for an " "undirected graph." ) - + weight, edge_id, edge_type = edge_attr else: edge_attr = [] if weight is not None: edge_attr.append(weight) - self.properties.weighted=True + self.properties.weighted = True if edge_id is not None: edge_attr.append(edge_id) if edge_type is not None: @@ -204,9 +212,7 @@ def __from_edgelist( ) elist = input_df.compute().reset_index(drop=True) else: - raise TypeError( - "input should be a cudf.DataFrame or a dask_cudf dataFrame" - ) + raise TypeError("input should be a cudf.DataFrame or a dask_cudf dataFrame") # Original, unmodified input dataframe. self.input_df = elist @@ -249,7 +255,7 @@ def __from_edgelist( multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) - print('symmetrized df:\n', value_col) + print("symmetrized df:\n", value_col) if isinstance(value_col, cudf.DataFrame): value_dict = {} @@ -270,11 +276,13 @@ def __from_edgelist( value_col = { self.edgeWeightCol: value_col[weight] if weight in value_col else None, self.edgeIdCol: value_col[edge_id] if edge_id in value_col else None, - self.edgeTypeCol: value_col[edge_type] if edge_type in value_col else None, + self.edgeTypeCol: value_col[edge_type] + if edge_type in value_col + else None, } - print('weight name:', weight) - print('vc:') + print("weight name:", weight) + print("vc:") print(value_col) self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, value_col) @@ -971,7 +979,12 @@ def _degree(self, vertex_subset, direction=Direction.ALL): return df - def _make_plc_graph(self, value_col: Dict[str, cudf.DataFrame]=None, store_transposed:bool=False, renumber:bool=True): + def _make_plc_graph( + self, + value_col: Dict[str, cudf.DataFrame] = None, + store_transposed: bool = False, + renumber: bool = True, + ): """ Parameters ---------- diff --git a/python/cugraph/cugraph/tests/structure/test_graph.py b/python/cugraph/cugraph/tests/structure/test_graph.py index 9ce8e58c00d..f0a82b20a08 100644 --- a/python/cugraph/cugraph/tests/structure/test_graph.py +++ b/python/cugraph/cugraph/tests/structure/test_graph.py @@ -864,22 +864,27 @@ def test_select_random_vertices(graph_file, random_state, num_vertices): assert len(join) == len(sampled_vertices) + @pytest.mark.sg @pytest.mark.parametrize("graph_file", utils.DATASETS_SMALL) -@pytest.mark.parametrize("edge_props", [['edge_id', 'edge_type', 'weight'], ['edge_id', 'edge_type'], ['edge_type', 'weight'], ['edge_id'], ['weight']]) +@pytest.mark.parametrize( + "edge_props", + [ + ["edge_id", "edge_type", "weight"], + ["edge_id", "edge_type"], + ["edge_type", "weight"], + ["edge_id"], + ["weight"], + ], +) def test_graph_creation_edge_properties(graph_file, edge_props): df = utils.read_csv_file(graph_file) - - df['edge_id'] = cupy.arange(len(df), dtype='int32') - df['edge_type'] = cupy.int32(3) - df['weight'] = 0.5 - prop_keys = {k : k for k in edge_props} + df["edge_id"] = cupy.arange(len(df), dtype="int32") + df["edge_type"] = cupy.int32(3) + df["weight"] = 0.5 + + prop_keys = {k: k for k in edge_props} G = cugraph.Graph(directed=True) - G.from_cudf_edgelist( - df, - source="0", - destination="1", - **prop_keys - ) \ No newline at end of file + G.from_cudf_edgelist(df, source="0", destination="1", **prop_keys) diff --git a/python/cugraph/cugraph/tests/structure/test_graph_mg.py b/python/cugraph/cugraph/tests/structure/test_graph_mg.py index 31c5afcdcf0..ebaae38a8a4 100644 --- a/python/cugraph/cugraph/tests/structure/test_graph_mg.py +++ b/python/cugraph/cugraph/tests/structure/test_graph_mg.py @@ -339,22 +339,26 @@ def test_mg_select_random_vertices( @pytest.mark.sg @pytest.mark.parametrize("graph_file", utils.DATASETS_SMALL) -@pytest.mark.parametrize("edge_props", [['edge_id', 'edge_type', 'weight'], ['edge_id', 'edge_type'], ['edge_type', 'weight'], ['edge_id'], ['weight']]) +@pytest.mark.parametrize( + "edge_props", + [ + ["edge_id", "edge_type", "weight"], + ["edge_id", "edge_type"], + ["edge_type", "weight"], + ["edge_id"], + ["weight"], + ], +) def test_graph_creation_edge_properties(dask_client, graph_file, edge_props): df = utils.read_csv_file(graph_file) - - df['edge_id'] = cupy.arange(len(df), dtype='int32') - df['edge_type'] = cupy.int32(3) - df['weight'] = 0.5 + + df["edge_id"] = cupy.arange(len(df), dtype="int32") + df["edge_type"] = cupy.int32(3) + df["weight"] = 0.5 df = dask_cudf.from_cudf(df, npartitions=2) - prop_keys = {k : k for k in edge_props} + prop_keys = {k: k for k in edge_props} G = cugraph.Graph(directed=True) - G.from_dask_cudf_edgelist( - df, - source="0", - destination="1", - **prop_keys - ) \ No newline at end of file + G.from_dask_cudf_edgelist(df, source="0", destination="1", **prop_keys) From f13f2b6ef23002da2f751e49eef47bfcea96c4ef Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 24 Apr 2023 17:13:42 +0000 Subject: [PATCH 04/37] updates to store --- .../cugraph_pyg/data/cugraph_store.py | 6 ++-- .../dask/sampling/uniform_neighbor_sample.py | 7 +++++ .../cugraph/gnn/data_loading/bulk_sampler.py | 29 ++++++++++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py b/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py index 7c8767e2a70..27f63d70d25 100644 --- a/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py +++ b/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py @@ -420,8 +420,6 @@ def __construct_graph( { "src": pandas.Series(na_src), "dst": pandas.Series(na_dst), - "w": pandas.Series(np.zeros(len(na_src))), - "eid": pandas.Series(np.arange(len(na_src))), "etp": pandas.Series(na_etp), } ) @@ -441,7 +439,7 @@ def __construct_graph( df, source="src", destination="dst", - edge_attr=["w", "eid", "etp"], + edge_type='etp', ) distributed.get_client().publish_dataset(cugraph_graph=graph) else: @@ -449,7 +447,7 @@ def __construct_graph( df, source="src", destination="dst", - edge_attr=["w", "eid", "etp"], + edge_type='etp', ) return graph diff --git a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py index c4e0c2da9b9..27cf9a233d1 100644 --- a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py @@ -119,6 +119,13 @@ def convert_to_cudf(cp_arrays, weight_t, with_edge_properties, return_offsets=Fa df[edge_type_n] = edge_types df[hop_id_n] = hop_ids + print( + f'sources: {sources}\n' + f'destinations: {destinations}\n' + f'batch: {batch_ids}\n' + f'offset: {offsets}\n' + ) + if return_offsets: offsets_df = cudf.DataFrame( { diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py index 95fab240eb2..0a00cf9754d 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py @@ -15,8 +15,11 @@ from typing import Union +import cupy import cudf import dask_cudf +import cugraph.dask as dask_cugraph + import cugraph import pylibcugraph @@ -196,17 +199,21 @@ def flush(self) -> None: else: sample_fn = cugraph.dask.uniform_neighbor_sample self.__sample_call_args["_multiple_clients"] = True + self.__sample_call_args["label_to_output_comm_rank"] = ( + self.__get_label_to_output_comm_rank(min_batch_id, max_batch_id) + ) - samples = sample_fn( + samples, offsets = sample_fn( self.__graph, **self.__sample_call_args, start_list=self.__batches[self.start_col_name][batch_id_filter], batch_id_list=self.__batches[self.batch_col_name][batch_id_filter], with_edge_properties=True, + return_offsets=True, ) self.__batches = self.__batches[~batch_id_filter] - self.__write(samples, min_batch_id, npartitions) + self.__write(samples, offsets, min_batch_id, npartitions) if self.size > 0: self.flush() @@ -214,13 +221,11 @@ def flush(self) -> None: def __write( self, samples: Union[cudf.DataFrame, dask_cudf.DataFrame], + offsets: Union[cudf.DataFrame, dask_cudf.DataFrame], min_batch_id: int, npartitions: int, ) -> None: - # Ensure each rank writes to its own partition so there is no conflict - outer_partition = f"rank={self.__rank}" - outer_partition_path = os.path.join(self.__output_path, outer_partition) - os.makedirs(outer_partition_path, exist_ok=True) + os.makedirs(self.__output_path, exist_ok=True) for partition_k in range(npartitions): ix_partition_start_inclusive = ( @@ -241,9 +246,19 @@ def __write( ix_partition_end_inclusive = int(ix_partition_end_inclusive) inner_path = os.path.join( - outer_partition_path, + self.__output_path, f"batch={ix_partition_start_inclusive}-{ix_partition_end_inclusive}" ".parquet", ) samples[f].to_parquet(inner_path, index=False) + + def __get_label_to_output_comm_rank(min_batch_id, max_batch_id): + num_workers = dask_cugraph.get_n_workers() + num_batches = max_batch_id - min_batch_id + 1 + z = cupy.zeros(num_batches, dtype='int32') + s = cupy.array_split(cupy.arange(num_batches), num_workers) + for i, t in enumerate(s): + z[t] = i + + return cudf.Series(z) \ No newline at end of file From 8fe9acb03f5d0965172fa86328652eeddc2fdae6 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 24 Apr 2023 19:06:43 +0000 Subject: [PATCH 05/37] throw exception for unweighted sssp --- python/cugraph/cugraph/dask/traversal/sssp.py | 11 +++++------ python/cugraph/cugraph/traversal/sssp.py | 9 ++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/python/cugraph/cugraph/dask/traversal/sssp.py b/python/cugraph/cugraph/dask/traversal/sssp.py index b55f48dc86b..6740ef5a3f1 100644 --- a/python/cugraph/cugraph/dask/traversal/sssp.py +++ b/python/cugraph/cugraph/dask/traversal/sssp.py @@ -20,7 +20,6 @@ import cudf import dask_cudf from pylibcugraph import sssp as pylibcugraph_sssp, ResourceHandle -import warnings def _call_plc_sssp( @@ -102,12 +101,12 @@ def sssp(input_graph, source, cutoff=None, check_source=True): # FIXME: Implement a better way to check if the graph is weighted similar # to 'simpleGraph' - if len(input_graph.edgelist.edgelist_df.columns) != 3: - warning_msg = ( - "'SSSP' requires the input graph to be weighted: Unweighted " - "graphs will not be supported in the next release." + if not input_graph.weighted: + err_msg = ( + "'SSSP' requires the input graph to be weighted." + "'BFS' should be used instead of 'SSSP' for unweighted graphs." ) - warnings.warn(warning_msg, PendingDeprecationWarning) + raise RuntimeError(err_msg) client = default_client() diff --git a/python/cugraph/cugraph/traversal/sssp.py b/python/cugraph/cugraph/traversal/sssp.py index 9557650cbbc..bccbc21b515 100644 --- a/python/cugraph/cugraph/traversal/sssp.py +++ b/python/cugraph/cugraph/traversal/sssp.py @@ -12,7 +12,6 @@ # limitations under the License. import numpy as np -import warnings import cudf from cugraph.structure import Graph, MultiGraph @@ -217,11 +216,11 @@ def sssp( ) if not G.edgelist.weights: - warning_msg = ( - "'SSSP' requires the input graph to be weighted: Unweighted " - "graphs will not be supported in the next release." + err_msg = ( + "'SSSP' requires the input graph to be weighted." + "'BFS' should be used instead of 'SSSP' for unweighted graphs." ) - warnings.warn(warning_msg, PendingDeprecationWarning) + raise RuntimeError(err_msg) if not G.has_node(source): raise ValueError("Graph does not contain source vertex") From 7a29d57161fad392f7f9029cfb13a03b6456e2ab Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Tue, 25 Apr 2023 12:56:11 -0700 Subject: [PATCH 06/37] add tests for unweighted graphs in C API, update C API implementations to support unweighted graphs --- cpp/include/cugraph/edge_property.hpp | 21 ++++++++ cpp/src/c_api/core_result.cpp | 8 +-- cpp/src/c_api/induced_subgraph_result.cpp | 7 ++- cpp/src/c_api/legacy_spectral.cpp | 50 ++++++++++++++++-- cpp/src/c_api/leiden.cpp | 10 +++- cpp/src/c_api/louvain.cpp | 10 +++- cpp/tests/c_api/egonet_test.c | 50 ++++++++++++++---- cpp/tests/c_api/k_core_test.c | 55 ++++++++++++++------ cpp/tests/c_api/legacy_spectral_test.c | 62 ++++++++++++++++++++--- cpp/tests/c_api/leiden_test.c | 39 +++++++++++--- cpp/tests/c_api/louvain_test.c | 35 ++++++++++++- 11 files changed, 295 insertions(+), 52 deletions(-) diff --git a/cpp/include/cugraph/edge_property.hpp b/cpp/include/cugraph/edge_property.hpp index fdd28bc1eb6..e67ee61a9c9 100644 --- a/cpp/include/cugraph/edge_property.hpp +++ b/cpp/include/cugraph/edge_property.hpp @@ -16,6 +16,7 @@ #pragma once +#include #include #include @@ -125,6 +126,26 @@ class edge_dummy_property_t { auto view() const { return edge_dummy_property_view_t{}; } }; +template +auto create_constant_edge_property(raft::handle_t const& handle, + GraphViewType const& graph_view, + T constant_value) +{ + edge_property_t edge_property(handle, graph_view); + + auto mutable_view = edge_property.mutable_view(); + + std::for_each( + thrust::make_zip_iterator(mutable_view.value_firsts().begin(), + mutable_view.edge_counts().begin()), + thrust::make_zip_iterator(mutable_view.value_firsts().end(), mutable_view.edge_counts().end()), + [&handle, constant_value](auto tuple) { + detail::scalar_fill(handle, thrust::get<0>(tuple), thrust::get<1>(tuple), constant_value); + }); + + return edge_property; +} + template auto view_concat(edge_property_view_t const&... views) { diff --git a/cpp/src/c_api/core_result.cpp b/cpp/src/c_api/core_result.cpp index 9cdf34e468b..09476060967 100644 --- a/cpp/src/c_api/core_result.cpp +++ b/cpp/src/c_api/core_result.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, NVIDIA CORPORATION. + * Copyright (c) 2022-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. @@ -95,8 +95,10 @@ cugraph_type_erased_device_array_view_t* cugraph_k_core_result_get_weights( cugraph_k_core_result_t* result) { auto internal_pointer = reinterpret_cast(result); - return reinterpret_cast( - internal_pointer->weights_->view()); + return (internal_pointer->weights_ == nullptr) + ? NULL + : reinterpret_cast( + internal_pointer->weights_->view()); } void cugraph_k_core_result_free(cugraph_k_core_result_t* result) diff --git a/cpp/src/c_api/induced_subgraph_result.cpp b/cpp/src/c_api/induced_subgraph_result.cpp index 2e22a4c47b5..b9ad0e0d66f 100644 --- a/cpp/src/c_api/induced_subgraph_result.cpp +++ b/cpp/src/c_api/induced_subgraph_result.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, NVIDIA CORPORATION. + * Copyright (c) 2022-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. @@ -39,7 +39,10 @@ extern "C" cugraph_type_erased_device_array_view_t* cugraph_induced_subgraph_get { auto internal_pointer = reinterpret_cast(induced_subgraph); - return reinterpret_cast(internal_pointer->wgt_->view()); + return (internal_pointer->wgt_ == nullptr) + ? NULL + : reinterpret_cast( + internal_pointer->wgt_->view()); } extern "C" cugraph_type_erased_device_array_view_t* cugraph_induced_subgraph_get_subgraph_offsets( diff --git a/cpp/src/c_api/legacy_spectral.cpp b/cpp/src/c_api/legacy_spectral.cpp index 9d1a0273057..4b465eebd0f 100644 --- a/cpp/src/c_api/legacy_spectral.cpp +++ b/cpp/src/c_api/legacy_spectral.cpp @@ -110,10 +110,18 @@ struct balanced_cut_clustering_functor : public cugraph::c_api::abstract_functor auto graph_view = graph->view(); auto edge_partition_view = graph_view.local_edge_partition_view(); + rmm::device_uvector tmp_weights(0, handle_.get_stream()); + if (edge_weights == nullptr) { + tmp_weights.resize(edge_partition_view.indices().size(), handle_.get_stream()); + cugraph::detail::scalar_fill(handle_, tmp_weights.data(), tmp_weights.size(), weight_t{1}); + } + cugraph::legacy::GraphCSRView legacy_graph_view( const_cast(edge_partition_view.offsets().data()), const_cast(edge_partition_view.indices().data()), - const_cast(edge_weights->view().value_firsts().front()), + (edge_weights == nullptr) + ? tmp_weights.data() + : const_cast(edge_weights->view().value_firsts().front()), edge_partition_view.offsets().size() - 1, edge_partition_view.indices().size()); @@ -209,10 +217,18 @@ struct spectral_clustering_functor : public cugraph::c_api::abstract_functor { auto graph_view = graph->view(); auto edge_partition_view = graph_view.local_edge_partition_view(); + rmm::device_uvector tmp_weights(0, handle_.get_stream()); + if (edge_weights == nullptr) { + tmp_weights.resize(edge_partition_view.indices().size(), handle_.get_stream()); + cugraph::detail::scalar_fill(handle_, tmp_weights.data(), tmp_weights.size(), weight_t{1}); + } + cugraph::legacy::GraphCSRView legacy_graph_view( const_cast(edge_partition_view.offsets().data()), const_cast(edge_partition_view.indices().data()), - const_cast(edge_weights->view().value_firsts().front()), + (edge_weights == nullptr) + ? tmp_weights.data() + : const_cast(edge_weights->view().value_firsts().front()), edge_partition_view.offsets().size() - 1, edge_partition_view.indices().size()); @@ -298,10 +314,18 @@ struct analyze_clustering_ratio_cut_functor : public cugraph::c_api::abstract_fu auto graph_view = graph->view(); auto edge_partition_view = graph_view.local_edge_partition_view(); + rmm::device_uvector tmp_weights(0, handle_.get_stream()); + if (edge_weights == nullptr) { + tmp_weights.resize(edge_partition_view.indices().size(), handle_.get_stream()); + cugraph::detail::scalar_fill(handle_, tmp_weights.data(), tmp_weights.size(), weight_t{1}); + } + cugraph::legacy::GraphCSRView legacy_graph_view( const_cast(edge_partition_view.offsets().data()), const_cast(edge_partition_view.indices().data()), - const_cast(edge_weights->view().value_firsts().front()), + (edge_weights == nullptr) + ? tmp_weights.data() + : const_cast(edge_weights->view().value_firsts().front()), edge_partition_view.offsets().size() - 1, edge_partition_view.indices().size()); @@ -405,10 +429,18 @@ struct analyze_clustering_edge_cut_functor : public cugraph::c_api::abstract_fun auto graph_view = graph->view(); auto edge_partition_view = graph_view.local_edge_partition_view(); + rmm::device_uvector tmp_weights(0, handle_.get_stream()); + if (edge_weights == nullptr) { + tmp_weights.resize(edge_partition_view.indices().size(), handle_.get_stream()); + cugraph::detail::scalar_fill(handle_, tmp_weights.data(), tmp_weights.size(), weight_t{1}); + } + cugraph::legacy::GraphCSRView legacy_graph_view( const_cast(edge_partition_view.offsets().data()), const_cast(edge_partition_view.indices().data()), - const_cast(edge_weights->view().value_firsts().front()), + (edge_weights == nullptr) + ? tmp_weights.data() + : const_cast(edge_weights->view().value_firsts().front()), edge_partition_view.offsets().size() - 1, edge_partition_view.indices().size()); @@ -512,10 +544,18 @@ struct analyze_clustering_modularity_functor : public cugraph::c_api::abstract_f auto graph_view = graph->view(); auto edge_partition_view = graph_view.local_edge_partition_view(); + rmm::device_uvector tmp_weights(0, handle_.get_stream()); + if (edge_weights == nullptr) { + tmp_weights.resize(edge_partition_view.indices().size(), handle_.get_stream()); + cugraph::detail::scalar_fill(handle_, tmp_weights.data(), tmp_weights.size(), weight_t{1}); + } + cugraph::legacy::GraphCSRView legacy_graph_view( const_cast(edge_partition_view.offsets().data()), const_cast(edge_partition_view.indices().data()), - const_cast(edge_weights->view().value_firsts().front()), + (edge_weights == nullptr) + ? tmp_weights.data() + : const_cast(edge_weights->view().value_firsts().front()), edge_partition_view.offsets().size() - 1, edge_partition_view.indices().size()); diff --git a/cpp/src/c_api/leiden.cpp b/cpp/src/c_api/leiden.cpp index 074ffc2d195..cc6f67c5812 100644 --- a/cpp/src/c_api/leiden.cpp +++ b/cpp/src/c_api/leiden.cpp @@ -86,10 +86,18 @@ struct leiden_functor : public cugraph::c_api::abstract_functor { rmm::device_uvector clusters(graph_view.local_vertex_partition_range_size(), handle_.get_stream()); + // FIXME: Revisit the constant edge property idea. We could consider an alternate + // implementation (perhaps involving the thrust::constant_iterator), or we + // could add support in Leiden for std::nullopt as the edge weights behaving + // as desired and only instantiating a real edge_property_view_t for the + // coarsened graphs. auto [level, modularity] = cugraph::leiden( handle_, graph_view, - (edge_weights != nullptr) ? std::make_optional(edge_weights->view()) : std::nullopt, + (edge_weights != nullptr) + ? std::make_optional(edge_weights->view()) + : std::make_optional( + cugraph::create_constant_edge_property(handle_, graph_view, weight_t{1}).view()), clusters.data(), max_level_, static_cast(resolution_)); diff --git a/cpp/src/c_api/louvain.cpp b/cpp/src/c_api/louvain.cpp index 0982b2b091c..527a235c249 100644 --- a/cpp/src/c_api/louvain.cpp +++ b/cpp/src/c_api/louvain.cpp @@ -86,10 +86,18 @@ struct louvain_functor : public cugraph::c_api::abstract_functor { rmm::device_uvector clusters(graph_view.local_vertex_partition_range_size(), handle_.get_stream()); + // FIXME: Revisit the constant edge property idea. We could consider an alternate + // implementation (perhaps involving the thrust::constant_iterator), or we + // could add support in Louvain for std::nullopt as the edge weights behaving + // as desired and only instantiating a real edge_property_view_t for the + // coarsened graphs. auto [level, modularity] = cugraph::louvain( handle_, graph_view, - (edge_weights != nullptr) ? std::make_optional(edge_weights->view()) : std::nullopt, + (edge_weights != nullptr) + ? std::make_optional(edge_weights->view()) + : std::make_optional( + cugraph::create_constant_edge_property(handle_, graph_view, weight_t{1}).view()), clusters.data(), max_level_, static_cast(resolution_)); diff --git a/cpp/tests/c_api/egonet_test.c b/cpp/tests/c_api/egonet_test.c index fac9815c150..d5db421a343 100644 --- a/cpp/tests/c_api/egonet_test.c +++ b/cpp/tests/c_api/egonet_test.c @@ -43,6 +43,12 @@ int generic_egonet_test(vertex_t* h_src, cugraph_error_code_t ret_code = CUGRAPH_SUCCESS; cugraph_error_t* ret_error; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + cugraph_resource_handle_t* resource_handle = NULL; cugraph_graph_t* graph = NULL; cugraph_type_erased_device_array_t* seeds = NULL; @@ -52,16 +58,7 @@ int generic_egonet_test(vertex_t* h_src, resource_handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, resource_handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph(resource_handle, - h_src, - h_dst, - h_wgt, - num_edges, - store_transposed, - FALSE, - FALSE, - &graph, - &ret_error); + ret_code = create_sg_test_graph(resource_handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, FALSE, FALSE, &graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); @@ -109,9 +106,11 @@ int generic_egonet_test(vertex_t* h_src, resource_handle, (byte_t*)h_result_dst, dst, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); +#if 0 ret_code = cugraph_type_erased_device_array_view_copy_to_host( resource_handle, (byte_t*)h_result_wgt, wgt, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); +#endif ret_code = cugraph_type_erased_device_array_view_copy_to_host( resource_handle, (byte_t*)h_result_offsets, offsets, &ret_error); @@ -185,11 +184,42 @@ int test_egonet() FALSE); } +int test_egonet_no_weights() +{ + size_t num_edges = 9; + size_t num_vertices = 6; + size_t radius = 2; + size_t num_seeds = 2; + + vertex_t h_src[] = {0, 1, 1, 2, 2, 2, 3, 3, 4}; + vertex_t h_dst[] = {1, 3, 4, 0, 1, 3, 4, 5, 5}; + vertex_t h_seeds[] = {0, 1}; + + vertex_t h_result_src[] = {0, 1, 1, 3, 1, 1, 3, 3, 4}; + vertex_t h_result_dst[] = {1, 3, 4, 4, 3, 4, 4, 5, 5}; + size_t h_result_offsets[] = {0, 4, 9}; + + // Egonet wants store_transposed = FALSE + return generic_egonet_test(h_src, + h_dst, + NULL, + h_seeds, + h_result_src, + h_result_dst, + h_result_offsets, + num_vertices, + num_edges, + num_seeds, + radius, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) { int result = 0; result |= RUN_TEST(test_egonet); + result |= RUN_TEST(test_egonet_no_weights); return result; } diff --git a/cpp/tests/c_api/k_core_test.c b/cpp/tests/c_api/k_core_test.c index dabeefe0289..32b8ed50908 100644 --- a/cpp/tests/c_api/k_core_test.c +++ b/cpp/tests/c_api/k_core_test.c @@ -43,6 +43,12 @@ int generic_k_core_test(vertex_t* h_src, cugraph_error_code_t ret_code = CUGRAPH_SUCCESS; cugraph_error_t* ret_error; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + cugraph_resource_handle_t* resource_handle = NULL; cugraph_graph_t* graph = NULL; cugraph_core_result_t* core_result = NULL; @@ -51,16 +57,7 @@ int generic_k_core_test(vertex_t* h_src, resource_handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, resource_handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph(resource_handle, - h_src, - h_dst, - h_wgt, - num_edges, - store_transposed, - FALSE, - TRUE, - &graph, - &ret_error); + ret_code = create_sg_test_graph(resource_handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, TRUE, FALSE, &graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); @@ -101,9 +98,11 @@ int generic_k_core_test(vertex_t* h_src, resource_handle, (byte_t*)h_dst_vertices, dst_vertices, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); - ret_code = cugraph_type_erased_device_array_view_copy_to_host( - resource_handle, (byte_t*)h_weights, weights, &ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + if (weights != NULL) { + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + resource_handle, (byte_t*)h_weights, weights, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + } TEST_ASSERT(test_ret_value, number_of_result_edges == num_result_edges, @@ -115,11 +114,11 @@ int generic_k_core_test(vertex_t* h_src, M[i][j] = 0; for (int i = 0; i < num_result_edges; ++i) - M[h_result_src[i]][h_result_dst[i]] = h_result_wgt[i]; + M[h_result_src[i]][h_result_dst[i]] = (h_result_wgt != NULL) ? h_result_wgt[i] : 1.0; for (int i = 0; (i < number_of_result_edges) && (test_ret_value == 0); ++i) { TEST_ASSERT(test_ret_value, - M[h_src_vertices[i]][h_dst_vertices[i]] == h_weights[i], + M[h_src_vertices[i]][h_dst_vertices[i]] == (h_result_wgt != NULL) ? h_weights[i] : 1.0, "edge does not match"); } @@ -160,11 +159,37 @@ int test_k_core() FALSE); } +int test_k_core_no_weights() +{ + size_t num_edges = 22; + size_t num_vertices = 7; + size_t num_result_edges = 12; + size_t k = 3; + + vertex_t h_src[] = {0, 1, 1, 2, 2, 2, 3, 4, 1, 3, 4, 0, 1, 3, 5, 5, 3, 1, 4, 5, 5, 6}; + vertex_t h_dst[] = {1, 3, 4, 0, 1, 3, 5, 5, 0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 3, 1, 6, 5}; + vertex_t h_result_src[] = {1, 1, 3, 4, 3, 4, 3, 4, 5, 5, 1, 5}; + vertex_t h_result_dst[] = {3, 4, 5, 5, 1, 3, 4, 1, 3, 4, 5, 1}; + + return generic_k_core_test(h_src, + h_dst, + NULL, + h_result_src, + h_result_dst, + NULL, + num_vertices, + num_edges, + num_result_edges, + k, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) { int result = 0; result |= RUN_TEST(test_k_core); + result |= RUN_TEST(test_k_core_no_weights); return result; } diff --git a/cpp/tests/c_api/legacy_spectral_test.c b/cpp/tests/c_api/legacy_spectral_test.c index 71b3be92d39..64451ad663e 100644 --- a/cpp/tests/c_api/legacy_spectral_test.c +++ b/cpp/tests/c_api/legacy_spectral_test.c @@ -51,11 +51,16 @@ int generic_spectral_test(vertex_t* h_src, cugraph_graph_t* graph = NULL; cugraph_clustering_result_t* result = NULL; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph( - handle, h_src, h_dst, h_wgt, num_edges, store_transposed, FALSE, FALSE, &graph, &ret_error); + ret_code = create_sg_test_graph(handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, FALSE, FALSE, &graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); @@ -141,6 +146,12 @@ int generic_balanced_cut_test(vertex_t* h_src, cugraph_error_code_t ret_code = CUGRAPH_SUCCESS; cugraph_error_t* ret_error; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + cugraph_resource_handle_t* handle = NULL; cugraph_graph_t* graph = NULL; cugraph_clustering_result_t* result = NULL; @@ -148,8 +159,7 @@ int generic_balanced_cut_test(vertex_t* h_src, handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph( - handle, h_src, h_dst, h_wgt, num_edges, store_transposed, FALSE, FALSE, &graph, &ret_error); + ret_code = create_sg_test_graph(handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, FALSE, FALSE, &graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); @@ -238,7 +248,7 @@ int test_spectral() weight_t expected_edge_cut = 0; weight_t expected_ratio_cut = 0; - // Louvain wants store_transposed = FALSE + // spectral clustering wants store_transposed = FALSE return generic_spectral_test(h_src, h_dst, h_wgt, @@ -276,7 +286,7 @@ int test_balanced_cut_unequal_weight() weight_t expected_edge_cut = 3.7; weight_t expected_ratio_cut = 4.44; - // Louvain wants store_transposed = FALSE + // balanced cut clustering wants store_transposed = FALSE return generic_balanced_cut_test(h_src, h_dst, h_wgt, @@ -314,7 +324,7 @@ int test_balanced_cut_equal_weight() weight_t expected_edge_cut = 1; weight_t expected_ratio_cut = 0.666667; - // Louvain wants store_transposed = FALSE + // balanced cut clustering wants store_transposed = FALSE return generic_balanced_cut_test(h_src, h_dst, h_wgt, @@ -333,6 +343,43 @@ int test_balanced_cut_equal_weight() FALSE); } +int test_balanced_cut_no_weight() +{ + size_t num_clusters = 2; + size_t num_eigenvectors = 2; + size_t num_edges = 14; + size_t num_vertices = 6; + double evs_tolerance = 0.001; + int evs_max_iterations = 100; + double k_means_tolerance = 0.001; + int k_means_max_iterations = 100; + + vertex_t h_src[] = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5 }; + vertex_t h_dst[] = { 1, 2, 0, 2, 0, 1, 3, 2, 4, 5, 3, 5, 3, 4 }; + vertex_t h_result[] = { 1, 1, 1, 0, 0, 0 }; + weight_t expected_modularity = 0.357143; + weight_t expected_edge_cut = 1; + weight_t expected_ratio_cut = 0.666667; + + // balanced cut clustering wants store_transposed = FALSE + return generic_balanced_cut_test(h_src, + h_dst, + NULL, + h_result, + expected_modularity, + expected_edge_cut, + expected_ratio_cut, + num_vertices, + num_edges, + num_clusters, + num_eigenvectors, + evs_tolerance, + evs_max_iterations, + k_means_tolerance, + k_means_max_iterations, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) @@ -341,5 +388,6 @@ int main(int argc, char** argv) result |= RUN_TEST(test_spectral); result |= RUN_TEST(test_balanced_cut_equal_weight); result |= RUN_TEST(test_balanced_cut_unequal_weight); + result |= RUN_TEST(test_balanced_cut_no_weight); return result; } diff --git a/cpp/tests/c_api/leiden_test.c b/cpp/tests/c_api/leiden_test.c index 64d1b68b032..f88eee3699b 100644 --- a/cpp/tests/c_api/leiden_test.c +++ b/cpp/tests/c_api/leiden_test.c @@ -45,20 +45,22 @@ int generic_leiden_test(vertex_t* h_src, cugraph_graph_t* p_graph = NULL; cugraph_hierarchical_clustering_result_t* p_result = NULL; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + p_handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, p_handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph( - p_handle, h_src, h_dst, h_wgt, num_edges, store_transposed, FALSE, FALSE, &p_graph, &ret_error); + ret_code = create_sg_test_graph(p_handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, FALSE, FALSE, &p_graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); ret_code = cugraph_leiden(p_handle, p_graph, max_level, resolution, FALSE, &p_result, &ret_error); -#if 0 - TEST_ASSERT(test_ret_value, ret_code != CUGRAPH_SUCCESS, "cugraph_leiden should have failed"); -#else TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, "cugraph_leiden failed."); @@ -87,7 +89,6 @@ int generic_leiden_test(vertex_t* h_src, cugraph_hierarchical_clustering_result_free(p_result); } -#endif cugraph_sg_graph_free(p_graph); cugraph_free_resource_handle(p_handle); @@ -123,11 +124,37 @@ int test_leiden() FALSE); } +int test_leiden_no_weights() +{ + size_t num_edges = 16; + size_t num_vertices = 6; + size_t max_level = 10; + weight_t resolution = 1.0; + + vertex_t h_src[] = {0, 1, 1, 2, 2, 2, 3, 4, 1, 3, 4, 0, 1, 3, 5, 5}; + vertex_t h_dst[] = {1, 3, 4, 0, 1, 3, 5, 5, 0, 1, 1, 2, 2, 2, 3, 4}; + vertex_t h_result[] = {1, 1, 1, 2, 0, 0}; + weight_t expected_modularity = 0.0859375; + + // Louvain wants store_transposed = FALSE + return generic_leiden_test(h_src, + h_dst, + NULL, + h_result, + expected_modularity, + num_vertices, + num_edges, + max_level, + resolution, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) { int result = 0; result |= RUN_TEST(test_leiden); + result |= RUN_TEST(test_leiden_no_weights); return result; } diff --git a/cpp/tests/c_api/louvain_test.c b/cpp/tests/c_api/louvain_test.c index eed8af4bdc7..f3813b5a1ac 100644 --- a/cpp/tests/c_api/louvain_test.c +++ b/cpp/tests/c_api/louvain_test.c @@ -45,11 +45,16 @@ int generic_louvain_test(vertex_t* h_src, cugraph_graph_t* p_graph = NULL; cugraph_hierarchical_clustering_result_t* p_result = NULL; + data_type_id_t vertex_tid = INT32; + data_type_id_t edge_tid = INT32; + data_type_id_t weight_tid = FLOAT32; + data_type_id_t edge_id_tid = INT32; + data_type_id_t edge_type_tid = INT32; + p_handle = cugraph_create_resource_handle(NULL); TEST_ASSERT(test_ret_value, p_handle != NULL, "resource handle creation failed."); - ret_code = create_test_graph( - p_handle, h_src, h_dst, h_wgt, num_edges, store_transposed, FALSE, FALSE, &p_graph, &ret_error); + ret_code = create_sg_test_graph(p_handle, vertex_tid, edge_tid, h_src, h_dst, weight_tid, h_wgt, edge_type_tid, NULL, edge_id_tid, NULL, num_edges, store_transposed, FALSE, FALSE, FALSE, &p_graph, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); @@ -125,11 +130,37 @@ int test_louvain() FALSE); } +int test_louvain_no_weight() +{ + size_t num_edges = 16; + size_t num_vertices = 6; + size_t max_level = 10; + weight_t resolution = 1.0; + + vertex_t h_src[] = {0, 1, 1, 2, 2, 2, 3, 4, 1, 3, 4, 0, 1, 3, 5, 5}; + vertex_t h_dst[] = {1, 3, 4, 0, 1, 3, 5, 5, 0, 1, 1, 2, 2, 2, 3, 4}; + vertex_t h_result[] = {1, 1, 1, 2, 0, 0}; + weight_t expected_modularity = 0.0859375; + + // Louvain wants store_transposed = FALSE + return generic_louvain_test(h_src, + h_dst, + NULL, + h_result, + expected_modularity, + num_vertices, + num_edges, + max_level, + resolution, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) { int result = 0; result |= RUN_TEST(test_louvain); + result |= RUN_TEST(test_louvain_no_weight); return result; } From a44483e5b0338f394f8f78b46125d0e21639b02d Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Wed, 26 Apr 2023 08:09:14 -0700 Subject: [PATCH 07/37] refactor to use new fill_edge_property --- cpp/CMakeLists.txt | 1 + cpp/include/cugraph/edge_property.hpp | 20 ------ cpp/src/c_api/graph_helper.cu | 84 ++++++++++++++++++++++--- cpp/src/c_api/graph_helper.hpp | 7 ++- cpp/src/c_api/graph_helper_impl.cuh | 45 ++++++++++++++ cpp/src/c_api/graph_helper_mg.cu | 89 +++++++++++++++++++++++++++ cpp/src/c_api/leiden.cpp | 22 ++++--- cpp/src/c_api/louvain.cpp | 22 ++++--- 8 files changed, 239 insertions(+), 51 deletions(-) create mode 100644 cpp/src/c_api/graph_helper_impl.cuh create mode 100644 cpp/src/c_api/graph_helper_mg.cu diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d592b45609c..912ac393d82 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -404,6 +404,7 @@ add_library(cugraph_c src/c_api/legacy_spectral.cpp src/c_api/legacy_ecg.cpp src/c_api/graph_helper.cu + src/c_api/graph_helper_mg.cu src/c_api/graph_generators.cpp src/c_api/induced_subgraph_result.cpp src/c_api/hits.cpp diff --git a/cpp/include/cugraph/edge_property.hpp b/cpp/include/cugraph/edge_property.hpp index a4abd927bde..03f93b06823 100644 --- a/cpp/include/cugraph/edge_property.hpp +++ b/cpp/include/cugraph/edge_property.hpp @@ -127,26 +127,6 @@ class edge_dummy_property_t { auto view() const { return edge_dummy_property_view_t{}; } }; -template -auto create_constant_edge_property(raft::handle_t const& handle, - GraphViewType const& graph_view, - T constant_value) -{ - edge_property_t edge_property(handle, graph_view); - - auto mutable_view = edge_property.mutable_view(); - - std::for_each( - thrust::make_zip_iterator(mutable_view.value_firsts().begin(), - mutable_view.edge_counts().begin()), - thrust::make_zip_iterator(mutable_view.value_firsts().end(), mutable_view.edge_counts().end()), - [&handle, constant_value](auto tuple) { - detail::scalar_fill(handle, thrust::get<0>(tuple), thrust::get<1>(tuple), constant_value); - }); - - return edge_property; -} - template auto view_concat(edge_property_view_t const&... views) { diff --git a/cpp/src/c_api/graph_helper.cu b/cpp/src/c_api/graph_helper.cu index 914344f8722..dcd6c92325f 100644 --- a/cpp/src/c_api/graph_helper.cu +++ b/cpp/src/c_api/graph_helper.cu @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, NVIDIA CORPORATION. + * Copyright (c) 2022-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. @@ -14,19 +14,11 @@ * limitations under the License. */ -#include +#include namespace cugraph { namespace c_api { -template -rmm::device_uvector expand_sparse_offsets(raft::device_span offsets, - vertex_t base_vertex_id, - rmm::cuda_stream_view const& stream) -{ - return cugraph::detail::expand_sparse_offsets(offsets, base_vertex_id, stream); -} - template rmm::device_uvector expand_sparse_offsets( raft::device_span offsets, int32_t base_vertex_id, @@ -50,5 +42,77 @@ template rmm::device_uvector expand_sparse_offsets(raft::device_span, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + } // namespace c_api } // namespace cugraph diff --git a/cpp/src/c_api/graph_helper.hpp b/cpp/src/c_api/graph_helper.hpp index 22e8e317ad0..c4f7aaeabc9 100644 --- a/cpp/src/c_api/graph_helper.hpp +++ b/cpp/src/c_api/graph_helper.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, NVIDIA CORPORATION. + * Copyright (c) 2022-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. @@ -26,5 +26,10 @@ rmm::device_uvector expand_sparse_offsets(raft::device_span +edge_property_t create_constant_edge_property(raft::handle_t const& handle, + GraphViewType const& graph_view, + T constant_value); + } // namespace c_api } // namespace cugraph diff --git a/cpp/src/c_api/graph_helper_impl.cuh b/cpp/src/c_api/graph_helper_impl.cuh new file mode 100644 index 00000000000..759d7a85286 --- /dev/null +++ b/cpp/src/c_api/graph_helper_impl.cuh @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022-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. + */ +#pragma once + +#include +#include + +namespace cugraph { +namespace c_api { + +template +rmm::device_uvector expand_sparse_offsets(raft::device_span offsets, + vertex_t base_vertex_id, + rmm::cuda_stream_view const& stream) +{ + return cugraph::detail::expand_sparse_offsets(offsets, base_vertex_id, stream); +} + +template +edge_property_t create_constant_edge_property(raft::handle_t const& handle, + GraphViewType const& graph_view, + T constant_value) +{ + edge_property_t edge_property(handle, graph_view); + + cugraph::fill_edge_property(handle, graph_view, constant_value, edge_property); + + return edge_property; +} + +} // namespace c_api +} // namespace cugraph diff --git a/cpp/src/c_api/graph_helper_mg.cu b/cpp/src/c_api/graph_helper_mg.cu new file mode 100644 index 00000000000..15e24ba530b --- /dev/null +++ b/cpp/src/c_api/graph_helper_mg.cu @@ -0,0 +1,89 @@ +/* + * 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. + */ + +#include + +namespace cugraph { +namespace c_api { + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, float> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + float constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property( + raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +template edge_property_t, double> +create_constant_edge_property(raft::handle_t const& handle, + cugraph::graph_view_t const& graph_view, + double constant_value); + +} // namespace c_api +} // namespace cugraph diff --git a/cpp/src/c_api/leiden.cpp b/cpp/src/c_api/leiden.cpp index cc6f67c5812..e03c7dc0aa9 100644 --- a/cpp/src/c_api/leiden.cpp +++ b/cpp/src/c_api/leiden.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -91,16 +92,17 @@ struct leiden_functor : public cugraph::c_api::abstract_functor { // could add support in Leiden for std::nullopt as the edge weights behaving // as desired and only instantiating a real edge_property_view_t for the // coarsened graphs. - auto [level, modularity] = cugraph::leiden( - handle_, - graph_view, - (edge_weights != nullptr) - ? std::make_optional(edge_weights->view()) - : std::make_optional( - cugraph::create_constant_edge_property(handle_, graph_view, weight_t{1}).view()), - clusters.data(), - max_level_, - static_cast(resolution_)); + auto [level, modularity] = + cugraph::leiden(handle_, + graph_view, + (edge_weights != nullptr) + ? std::make_optional(edge_weights->view()) + : std::make_optional(cugraph::c_api::create_constant_edge_property( + handle_, graph_view, weight_t{1}) + .view()), + clusters.data(), + max_level_, + static_cast(resolution_)); rmm::device_uvector vertices(graph_view.local_vertex_partition_range_size(), handle_.get_stream()); diff --git a/cpp/src/c_api/louvain.cpp b/cpp/src/c_api/louvain.cpp index 527a235c249..ff75cafa031 100644 --- a/cpp/src/c_api/louvain.cpp +++ b/cpp/src/c_api/louvain.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -91,16 +92,17 @@ struct louvain_functor : public cugraph::c_api::abstract_functor { // could add support in Louvain for std::nullopt as the edge weights behaving // as desired and only instantiating a real edge_property_view_t for the // coarsened graphs. - auto [level, modularity] = cugraph::louvain( - handle_, - graph_view, - (edge_weights != nullptr) - ? std::make_optional(edge_weights->view()) - : std::make_optional( - cugraph::create_constant_edge_property(handle_, graph_view, weight_t{1}).view()), - clusters.data(), - max_level_, - static_cast(resolution_)); + auto [level, modularity] = + cugraph::louvain(handle_, + graph_view, + (edge_weights != nullptr) + ? std::make_optional(edge_weights->view()) + : std::make_optional(cugraph::c_api::create_constant_edge_property( + handle_, graph_view, weight_t{1}) + .view()), + clusters.data(), + max_level_, + static_cast(resolution_)); rmm::device_uvector vertices(graph_view.local_vertex_partition_range_size(), handle_.get_stream()); From 442e1ce9a67610bb020e6d7515bbf275de9f061b Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Wed, 26 Apr 2023 08:12:00 -0700 Subject: [PATCH 08/37] Rename graph_helper.cu --- cpp/CMakeLists.txt | 2 +- cpp/src/c_api/{graph_helper.cu => graph_helper_sg.cu} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename cpp/src/c_api/{graph_helper.cu => graph_helper_sg.cu} (100%) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 912ac393d82..6c8da74aa56 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -403,7 +403,7 @@ add_library(cugraph_c src/c_api/capi_helper.cu src/c_api/legacy_spectral.cpp src/c_api/legacy_ecg.cpp - src/c_api/graph_helper.cu + src/c_api/graph_helper_sg.cu src/c_api/graph_helper_mg.cu src/c_api/graph_generators.cpp src/c_api/induced_subgraph_result.cpp diff --git a/cpp/src/c_api/graph_helper.cu b/cpp/src/c_api/graph_helper_sg.cu similarity index 100% rename from cpp/src/c_api/graph_helper.cu rename to cpp/src/c_api/graph_helper_sg.cu From 7e347de785a90a2f269242ce8c531086243c44ee Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Wed, 26 Apr 2023 11:25:24 -0700 Subject: [PATCH 09/37] need to sort after shuffling --- .../sampling/detail/sampling_utils_impl.cuh | 306 +++++++++--------- cpp/tests/c_api/mg_test_utils.cpp | 108 +++---- .../c_api/mg_uniform_neighbor_sample_test.c | 240 ++++++++++++++ 3 files changed, 453 insertions(+), 201 deletions(-) diff --git a/cpp/src/sampling/detail/sampling_utils_impl.cuh b/cpp/src/sampling/detail/sampling_utils_impl.cuh index 3ab13d0c7d2..48d13fa39ec 100644 --- a/cpp/src/sampling/detail/sampling_utils_impl.cuh +++ b/cpp/src/sampling/detail/sampling_utils_impl.cuh @@ -626,6 +626,164 @@ sample_edges(raft::handle_t const& handle, std::move(labels)); } +template +void sort_sampled_tuples(raft::handle_t const& handle, + rmm::device_uvector& majors, + rmm::device_uvector& minors, + std::optional>& weights, + std::optional>& edge_ids, + std::optional>& edge_types, + std::optional>& hops, + std::optional>& labels) +{ + if (weights) { + if (edge_ids) { + if (edge_types) { + if (hops) { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), + minors.begin(), + weights->begin(), + edge_ids->begin(), + edge_types->begin(), + hops->begin())); + } else { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), + minors.begin(), + weights->begin(), + edge_ids->begin(), + edge_types->begin())); + } + } else { + if (hops) { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), weights->begin(), edge_ids->begin(), hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), weights->begin(), edge_ids->begin())); + } + } + } else { + if (edge_types) { + if (hops) { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), + minors.begin(), + weights->begin(), + edge_types->begin(), + hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), weights->begin(), edge_types->begin())); + } + } else { + if (hops) { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), weights->begin(), hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), minors.begin(), weights->begin())); + } + } + } + } else { + if (edge_ids) { + if (edge_types) { + if (hops) { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), + minors.begin(), + edge_ids->begin(), + edge_types->begin(), + hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), edge_ids->begin(), edge_types->begin())); + } + } else { + if (hops) { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), edge_ids->begin(), hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), minors.begin(), edge_ids->begin())); + } + } + } else { + if (edge_types) { + if (hops) { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator( + majors.begin(), minors.begin(), edge_types->begin(), hops->begin())); + } else { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), minors.begin(), edge_types->begin())); + } + } else { + if (hops) { + thrust::sort_by_key( + handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), minors.begin(), hops->begin())); + } else { + thrust::sort_by_key(handle.get_thrust_policy(), + labels->begin(), + labels->end(), + thrust::make_zip_iterator(majors.begin(), minors.begin())); + } + } + } + } +} + template > offsets{std::nullopt}; if (labels) { - if (weights) { - if (edge_ids) { - if (edge_types) { - if (hops) { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), - minors.begin(), - weights->begin(), - edge_ids->begin(), - edge_types->begin(), - hops->begin())); - } else { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), - minors.begin(), - weights->begin(), - edge_ids->begin(), - edge_types->begin())); - } - } else { - if (hops) { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), - minors.begin(), - weights->begin(), - edge_ids->begin(), - hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), weights->begin(), edge_ids->begin())); - } - } - } else { - if (edge_types) { - if (hops) { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), - minors.begin(), - weights->begin(), - edge_types->begin(), - hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), weights->begin(), edge_types->begin())); - } - } else { - if (hops) { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), weights->begin(), hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), minors.begin(), weights->begin())); - } - } - } - } else { - if (edge_ids) { - if (edge_types) { - if (hops) { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), - minors.begin(), - edge_ids->begin(), - edge_types->begin(), - hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), edge_ids->begin(), edge_types->begin())); - } - } else { - if (hops) { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), edge_ids->begin(), hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), minors.begin(), edge_ids->begin())); - } - } - } else { - if (edge_types) { - if (hops) { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator( - majors.begin(), minors.begin(), edge_types->begin(), hops->begin())); - } else { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), minors.begin(), edge_types->begin())); - } - } else { - if (hops) { - thrust::sort_by_key( - handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), minors.begin(), hops->begin())); - } else { - thrust::sort_by_key(handle.get_thrust_policy(), - labels->begin(), - labels->end(), - thrust::make_zip_iterator(majors.begin(), minors.begin())); - } - } - } - } + sort_sampled_tuples(handle, majors, minors, weights, edge_ids, edge_types, hops, labels); if (label_to_output_comm_rank) { CUGRAPH_EXPECTS(labels, "labels must be specified in order to shuffle sampling results"); @@ -1030,6 +1044,8 @@ shuffle_and_organize_output( } } } + + sort_sampled_tuples(handle, majors, minors, weights, edge_ids, edge_types, hops, labels); } size_t num_unique_labels = diff --git a/cpp/tests/c_api/mg_test_utils.cpp b/cpp/tests/c_api/mg_test_utils.cpp index 7e8c9b22aac..5a94dff78dc 100644 --- a/cpp/tests/c_api/mg_test_utils.cpp +++ b/cpp/tests/c_api/mg_test_utils.cpp @@ -441,63 +441,35 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl data_type_id_t type_tid = INT32; data_type_id_t weight_tid = FLOAT32; - cugraph_type_erased_device_array_t* src; - cugraph_type_erased_device_array_t* dst; - cugraph_type_erased_device_array_t* idx; - cugraph_type_erased_device_array_t* type; - cugraph_type_erased_device_array_t* wgt; - cugraph_type_erased_device_array_view_t* src_view; - cugraph_type_erased_device_array_view_t* dst_view; - cugraph_type_erased_device_array_view_t* idx_view; - cugraph_type_erased_device_array_view_t* type_view; - cugraph_type_erased_device_array_view_t* wgt_view; + cugraph_type_erased_device_array_t* src = NULL; + cugraph_type_erased_device_array_t* dst = NULL; + cugraph_type_erased_device_array_t* idx = NULL; + cugraph_type_erased_device_array_t* type = NULL; + cugraph_type_erased_device_array_t* wgt = NULL; + cugraph_type_erased_device_array_view_t* src_view = NULL; + cugraph_type_erased_device_array_view_t* dst_view = NULL; + cugraph_type_erased_device_array_view_t* idx_view = NULL; + cugraph_type_erased_device_array_view_t* type_view = NULL; + cugraph_type_erased_device_array_view_t* wgt_view = NULL; int rank = 0; rank = cugraph_resource_handle_get_rank(handle); - if (rank == 0) { - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &src, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &dst, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, index_tid, &idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, type_tid, &type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, weight_tid, &wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); - } else { - ret_code = cugraph_type_erased_device_array_create(handle, 0, vertex_tid, &src, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - - ret_code = cugraph_type_erased_device_array_create(handle, 0, vertex_tid, &dst, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); + size_t original_num_edges = num_edges; - ret_code = cugraph_type_erased_device_array_create(handle, 0, index_tid, &idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); + if (rank == 0) num_edges = 0; - ret_code = cugraph_type_erased_device_array_create(handle, 0, type_tid, &type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &src, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - ret_code = cugraph_type_erased_device_array_create(handle, 0, weight_tid, &wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); - } + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &dst, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); src_view = cugraph_type_erased_device_array_view(src); dst_view = cugraph_type_erased_device_array_view(dst); - idx_view = cugraph_type_erased_device_array_view(idx); - type_view = cugraph_type_erased_device_array_view(type); - wgt_view = cugraph_type_erased_device_array_view(wgt); ret_code = cugraph_type_erased_device_array_view_copy_from_host( handle, src_view, (byte_t*)h_src, ret_error); @@ -507,17 +479,41 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl handle, dst_view, (byte_t*)h_dst, ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst copy_from_host failed."); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, idx_view, (byte_t*)h_idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index copy_from_host failed."); + if (h_idx != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, index_tid, &idx, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, type_view, (byte_t*)h_type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type copy_from_host failed."); + idx_view = cugraph_type_erased_device_array_view(idx); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, wgt_view, (byte_t*)h_wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt copy_from_host failed."); + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, idx_view, (byte_t*)h_idx, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index copy_from_host failed."); + } + + if (h_type != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, type_tid, &type, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); + + type_view = cugraph_type_erased_device_array_view(type); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, type_view, (byte_t*)h_type, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type copy_from_host failed."); + } + + if (h_wgt != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, weight_tid, &wgt, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); + + wgt_view = cugraph_type_erased_device_array_view(wgt); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, wgt_view, (byte_t*)h_wgt, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt copy_from_host failed."); + } ret_code = cugraph_mg_graph_create(handle, &properties, @@ -527,7 +523,7 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl idx_view, type_view, store_transposed, - num_edges, + original_num_edges, FALSE, p_graph, ret_error); diff --git a/cpp/tests/c_api/mg_uniform_neighbor_sample_test.c b/cpp/tests/c_api/mg_uniform_neighbor_sample_test.c index 58fc1d20c75..f7254a1a886 100644 --- a/cpp/tests/c_api/mg_uniform_neighbor_sample_test.c +++ b/cpp/tests/c_api/mg_uniform_neighbor_sample_test.c @@ -553,6 +553,245 @@ int test_uniform_neighbor_with_shuffling(const cugraph_resource_handle_t* handle return test_ret_value; } +int test_uniform_neighbor_sample_alex_bug(const cugraph_resource_handle_t* handle) +{ + size_t num_edges = 156; + size_t num_vertices = 34; + size_t fan_out_size = 2; + size_t num_starts = 4; + size_t num_labels = 3; + + vertex_t src[] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 17, 19, 21, 31, 2, + 3, 7, 13, 17, 19, 21, 30, 3, 7, 8, 9, 13, 27, 28, 32, 7, 12, + 13, 6, 10, 6, 10, 16, 16, 30, 32, 33, 33, 33, 32, 33, 32, + 33, 32, 33, 33, 32, 33, 32, 33, 25, 27, 29, 32, 33, 25, 27, + 31, 31, 29, 33, 33, 31, 33, 32, 33, 32, 33, 32, 33, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, + 8, 8, 8, 9, 13, 14, 14, 15, 15, 18, 18, 19, 20, 20, 22, 22, + 23, 23, 23, 23, 23, 24, 24, 24, 25, 26, 26, 27, 28, 28, 29, + 29, 30, 30, 31, 31, 32}; + vertex_t dst[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,4,4,5,5,5,6,8,8,8,9,13,14,14,15,15,18,18,19,20,20,22,22,23,23,23,23,23,24,24,24,25,26,26,27,28,28,29,29,30,30,31,31,32,1,2,3,4,5,6,7,8,10,11,12,13,17,19,21,31,2,3,7,13,17,19,21,30,3,7,8,9,13,27,28,32,7,12,13,6,10,6,10,16,16,30,32,33,33,33,32,33,32,33,32,33,33,32,33,32,33,25,27,29,32,33,25,27,31,31,29,33,33,31,33,32,33,32,33,32,33,33}; + weight_t wgt[] = {1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f}; + + edge_t edge_ids[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155}; + + vertex_t start[] = {0, 1, 2, 5}; + int32_t start_labels[] = { 0, 0, 1, 2 }; + int32_t label_list[] = { 0, 1, 2 }; + int32_t label_to_output_comm_rank[] = { 0, 0, 1 }; + int fan_out[] = {2, 3}; + + size_t expected_size[] = { 3, 2 }; + + // Create graph + int test_ret_value = 0; + cugraph_error_code_t ret_code = CUGRAPH_SUCCESS; + cugraph_error_t* ret_error = NULL; + cugraph_graph_t* graph = NULL; + cugraph_sample_result_t* result = NULL; + + ret_code = create_mg_test_graph_with_properties(handle, + src, + dst, + edge_ids, + NULL, + wgt, + num_edges, + FALSE, + TRUE, + &graph, + &ret_error); + + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "graph creation failed."); + + cugraph_type_erased_device_array_t* d_start = NULL; + cugraph_type_erased_device_array_view_t* d_start_view = NULL; + cugraph_type_erased_device_array_t* d_start_labels = NULL; + cugraph_type_erased_device_array_view_t* d_start_labels_view = NULL; + cugraph_type_erased_device_array_t* d_label_list = NULL; + cugraph_type_erased_device_array_view_t* d_label_list_view = NULL; + cugraph_type_erased_device_array_t* d_label_to_output_comm_rank = NULL; + cugraph_type_erased_device_array_view_t* d_label_to_output_comm_rank_view = NULL; + cugraph_type_erased_host_array_view_t* h_fan_out_view = NULL; + + int rank = cugraph_resource_handle_get_rank(handle); + + if (rank > 0) { + num_starts = 0; + } + + cugraph_rng_state_t* rng_state; + ret_code = cugraph_rng_state_create(handle, rank, &rng_state, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "rng_state create failed."); + TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); + + ret_code = + cugraph_type_erased_device_array_create(handle, num_starts, INT32, &d_start, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "d_start create failed."); + + d_start_view = cugraph_type_erased_device_array_view(d_start); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, d_start_view, (byte_t*)start, &ret_error); + + ret_code = + cugraph_type_erased_device_array_create(handle, num_starts, INT32, &d_start_labels, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "d_start_labels create failed."); + + d_start_labels_view = cugraph_type_erased_device_array_view(d_start_labels); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, d_start_labels_view, (byte_t*)start_labels, &ret_error); + + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "start_labels copy_from_host failed."); + + ret_code = + cugraph_type_erased_device_array_create(handle, num_labels, INT32, &d_label_list, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "d_label_list create failed."); + + d_label_list_view = cugraph_type_erased_device_array_view(d_label_list); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, d_label_list_view, (byte_t*)label_list, &ret_error); + + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "label_list copy_from_host failed."); + + ret_code = + cugraph_type_erased_device_array_create(handle, num_labels, INT32, &d_label_to_output_comm_rank, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "d_label_to_output_comm_rank create failed."); + + d_label_to_output_comm_rank_view = cugraph_type_erased_device_array_view(d_label_to_output_comm_rank); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, d_label_to_output_comm_rank_view, (byte_t*)label_to_output_comm_rank, &ret_error); + + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "label_to_output_comm_rank copy_from_host failed."); + + h_fan_out_view = cugraph_type_erased_host_array_view_create(fan_out, fan_out_size, INT32); + + ret_code = cugraph_uniform_neighbor_sample_with_edge_properties(handle, + graph, + d_start_view, + d_start_labels_view, + d_label_list_view, + d_label_to_output_comm_rank_view, + h_fan_out_view, + rng_state, + FALSE, + TRUE, + FALSE, + &result, + &ret_error); + +#ifdef NO_CUGRAPH_OPS + TEST_ASSERT( + test_ret_value, ret_code != CUGRAPH_SUCCESS, "uniform_neighbor_sample should have failed") +#else + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "uniform_neighbor_sample failed."); + + cugraph_type_erased_device_array_view_t* result_srcs = NULL; + cugraph_type_erased_device_array_view_t* result_dsts = NULL; + cugraph_type_erased_device_array_view_t* result_edge_id = NULL; + cugraph_type_erased_device_array_view_t* result_weights = NULL; + cugraph_type_erased_device_array_view_t* result_hops = NULL; + cugraph_type_erased_device_array_view_t* result_offsets = NULL; + + result_srcs = cugraph_sample_result_get_sources(result); + result_dsts = cugraph_sample_result_get_destinations(result); + result_edge_id = cugraph_sample_result_get_edge_id(result); + result_weights = cugraph_sample_result_get_edge_weight(result); + result_hops = cugraph_sample_result_get_hop(result); + result_offsets = cugraph_sample_result_get_offsets(result); + + size_t result_size = cugraph_type_erased_device_array_view_size(result_srcs); + size_t result_offsets_size = cugraph_type_erased_device_array_view_size(result_offsets); + + vertex_t h_srcs[result_size]; + vertex_t h_dsts[result_size]; + edge_t h_edge_id[result_size]; + weight_t h_weight[result_size]; + int32_t h_hops[result_size]; + size_t h_result_offsets[result_offsets_size]; + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_srcs, result_srcs, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_dsts, result_dsts, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_edge_id, result_edge_id, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_weight, result_weights, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_hops, result_hops, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + handle, (byte_t*)h_result_offsets, result_offsets, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + + // NOTE: The C++ tester does a more thorough validation. For our purposes + // here we will do a simpler validation, merely checking that all edges + // are actually part of the graph + weight_t M_w[num_vertices][num_vertices]; + edge_t M_edge_id[num_vertices][num_vertices]; + + for (int i = 0; i < num_vertices; ++i) + for (int j = 0; j < num_vertices; ++j) { + M_w[i][j] = 0.0; + M_edge_id[i][j] = -1; + } + + for (int i = 0; i < num_edges; ++i) { + M_w[src[i]][dst[i]] = wgt[i]; + M_edge_id[src[i]][dst[i]] = edge_ids[i]; + } + + for (int i = 0; (i < result_size) && (test_ret_value == 0); ++i) { + TEST_ASSERT(test_ret_value, + M_w[h_srcs[i]][h_dsts[i]] == h_weight[i], + "uniform_neighbor_sample got edge that doesn't exist"); + TEST_ASSERT(test_ret_value, + M_edge_id[h_srcs[i]][h_dsts[i]] == h_edge_id[i], + "uniform_neighbor_sample got edge that doesn't exist"); + } + + TEST_ASSERT(test_ret_value, + result_offsets_size == expected_size[rank], + "incorrect number of results"); + + + cugraph_sample_result_free(result); +#endif + + cugraph_sg_graph_free(graph); + cugraph_error_free(ret_error); +} + /******************************************************************************/ int main(int argc, char** argv) @@ -564,6 +803,7 @@ int main(int argc, char** argv) result |= RUN_MG_TEST(test_uniform_neighbor_sample, handle); result |= RUN_MG_TEST(test_uniform_neighbor_from_alex, handle); result |= RUN_MG_TEST(test_uniform_neighbor_with_shuffling, handle); + result |= RUN_TEST_NEW(test_uniform_neighbor_sample_alex_bug, handle); cugraph_free_resource_handle(handle); free_mg_raft_handle(raft_handle); From d34af46cdcdbf771e3289b988d37a16d4bf8a2cf Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Thu, 27 Apr 2023 20:56:41 +0000 Subject: [PATCH 10/37] pull in chuck's changes, update sssp tests --- .../graph_implementation/simpleGraph.py | 5 ---- .../cugraph/tests/traversal/test_sssp.py | 15 +++------- .../cugraph/tests/traversal/test_sssp_mg.py | 30 ------------------- 3 files changed, 4 insertions(+), 46 deletions(-) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 85c9ede7a6e..aa7910586ef 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -51,7 +51,6 @@ def __init__( destination: str, edge_attr: Union[cudf.DataFrame, Dict[str, cudf.DataFrame]] = None, ): - print("edge attr: ", edge_attr) self.edgelist_df = cudf.DataFrame() self.edgelist_df[simpleGraphImpl.srcCol] = source self.edgelist_df[simpleGraphImpl.dstCol] = destination @@ -255,7 +254,6 @@ def __from_edgelist( multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) - print("symmetrized df:\n", value_col) if isinstance(value_col, cudf.DataFrame): value_dict = {} @@ -281,9 +279,6 @@ def __from_edgelist( else None, } - print("weight name:", weight) - print("vc:") - print(value_col) self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, value_col) if self.batch_enabled: diff --git a/python/cugraph/cugraph/tests/traversal/test_sssp.py b/python/cugraph/cugraph/tests/traversal/test_sssp.py index 5e977be570a..0790394c5e0 100644 --- a/python/cugraph/cugraph/tests/traversal/test_sssp.py +++ b/python/cugraph/cugraph/tests/traversal/test_sssp.py @@ -143,6 +143,7 @@ def networkx_call(graph_file, source, edgevals=True): M = utils.read_csv_for_nx(dataset_path, read_weights_in_sp=True) # Directed NetworkX graph edge_attr = "weight" if edgevals else None + print(M) Gnx = nx.from_pandas_edgelist( M, source="0", @@ -162,7 +163,7 @@ def networkx_call(graph_file, source, edgevals=True): nx_paths = nx.single_source_dijkstra_path_length(Gnx, source) G = graph_file.get_graph( - create_using=cugraph.Graph(directed=True), ignore_weights=True + create_using=cugraph.Graph(directed=True), ignore_weights=not edgevals ) t2 = time.time() - t1 @@ -228,8 +229,10 @@ def test_sssp(gpubenchmark, dataset_source_nxresults, cugraph_input_type): input_G_or_matrix = utils.create_obj_from_csv( dataset_path, cugraph_input_type, edgevals=True ) + print(input_G_or_matrix) else: input_G_or_matrix = G + print(G.edgelist.edgelist_df) cu_paths, max_val = cugraph_call(gpubenchmark, input_G_or_matrix, source) @@ -448,13 +451,3 @@ def test_scipy_api_compat(): cugraph.shortest_path(input_coo_matrix, indices=[0, 1, 2]) cugraph.shortest_path(input_coo_matrix, indices=0) - -@pytest.mark.sg -def test_sssp_with_no_edgevals(): - G = datasets.karate.get_graph(ignore_weights=True) - warning_msg = ( - "'SSSP' requires the input graph to be weighted: Unweighted " - "graphs will not be supported in the next release." - ) - with pytest.warns(PendingDeprecationWarning, match=warning_msg): - cugraph.sssp(G, 1) diff --git a/python/cugraph/cugraph/tests/traversal/test_sssp_mg.py b/python/cugraph/cugraph/tests/traversal/test_sssp_mg.py index 0a138fd95ed..867f125ea6f 100644 --- a/python/cugraph/cugraph/tests/traversal/test_sssp_mg.py +++ b/python/cugraph/cugraph/tests/traversal/test_sssp_mg.py @@ -85,33 +85,3 @@ def test_dask_sssp(dask_client, directed): ): err = err + 1 assert err == 0 - - -@pytest.mark.mg -def test_dask_unweighted_sssp(dask_client): - input_data_path = input_data_path = ( - RAPIDS_DATASET_ROOT_DIR_PATH / "karate.csv" - ).as_posix() - chunksize = dcg.get_chunksize(input_data_path) - ddf = dask_cudf.read_csv( - input_data_path, - chunksize=chunksize, - delimiter=" ", - names=["src", "dst", "value"], - dtype=["int32", "int32", "float32"], - ) - - dg = cugraph.Graph(directed=False) - dg.from_dask_cudf_edgelist( - ddf, - source="src", - destination="dst", - store_transposed=True, - ) - - warning_msg = ( - "'SSSP' requires the input graph to be weighted: Unweighted " - "graphs will not be supported in the next release." - ) - with pytest.warns(PendingDeprecationWarning, match=warning_msg): - dcg.sssp(dg, 0) From e7bfba495d8b3c2f7aacb3279c4f58fce4a27803 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Thu, 27 Apr 2023 21:35:58 +0000 Subject: [PATCH 11/37] style --- python/cugraph/cugraph/tests/traversal/test_sssp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/cugraph/cugraph/tests/traversal/test_sssp.py b/python/cugraph/cugraph/tests/traversal/test_sssp.py index 0790394c5e0..7b0cc3b132d 100644 --- a/python/cugraph/cugraph/tests/traversal/test_sssp.py +++ b/python/cugraph/cugraph/tests/traversal/test_sssp.py @@ -450,4 +450,3 @@ def test_scipy_api_compat(): with pytest.raises(ValueError): cugraph.shortest_path(input_coo_matrix, indices=[0, 1, 2]) cugraph.shortest_path(input_coo_matrix, indices=0) - From 90eb5cc5d7008cd5f4bcf753d3c846c45d77f77d Mon Sep 17 00:00:00 2001 From: Charles Hastings Date: Thu, 27 Apr 2023 21:04:06 -0700 Subject: [PATCH 12/37] remove unused header. Modify MG egonet test to work properly --- cpp/include/cugraph/edge_property.hpp | 1 - cpp/tests/c_api/mg_egonet_test.c | 73 ++++++++++++----- cpp/tests/c_api/mg_test_utils.cpp | 108 +++++++++++++------------- 3 files changed, 107 insertions(+), 75 deletions(-) diff --git a/cpp/include/cugraph/edge_property.hpp b/cpp/include/cugraph/edge_property.hpp index 60d14bc1cc2..8904006a2a2 100644 --- a/cpp/include/cugraph/edge_property.hpp +++ b/cpp/include/cugraph/edge_property.hpp @@ -16,7 +16,6 @@ #pragma once -#include #include #include #include diff --git a/cpp/tests/c_api/mg_egonet_test.c b/cpp/tests/c_api/mg_egonet_test.c index 3a300ed8340..bddfc56430b 100644 --- a/cpp/tests/c_api/mg_egonet_test.c +++ b/cpp/tests/c_api/mg_egonet_test.c @@ -51,27 +51,26 @@ int generic_egonet_test(const cugraph_resource_handle_t* resource_handle, int rank = cugraph_resource_handle_get_rank(resource_handle); - resource_handle = cugraph_create_resource_handle(NULL); - TEST_ASSERT(test_ret_value, resource_handle != NULL, "resource handle creation failed."); - - ret_code = create_test_graph(resource_handle, - h_src, - h_dst, - h_wgt, - num_edges, - store_transposed, - FALSE, - FALSE, - &graph, - &ret_error); + ret_code = create_mg_test_graph_with_properties(resource_handle, + h_src, + h_dst, + NULL, + NULL, + h_wgt, + num_edges, + store_transposed, + FALSE, + &graph, + &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "create_test_graph failed."); TEST_ALWAYS_ASSERT(ret_code == CUGRAPH_SUCCESS, cugraph_error_message(ret_error)); - if (rank != 0) { num_seeds = 0; } + size_t num_seeds_to_use = num_seeds; + if (rank != 0) { num_seeds_to_use = 0; } ret_code = - cugraph_type_erased_device_array_create(resource_handle, num_seeds, INT32, &seeds, &ret_error); + cugraph_type_erased_device_array_create(resource_handle, num_seeds_to_use, INT32, &seeds, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "seeds create failed."); seeds_view = cugraph_type_erased_device_array_view(seeds); @@ -113,21 +112,27 @@ int generic_egonet_test(const cugraph_resource_handle_t* resource_handle, resource_handle, (byte_t*)h_result_dst, dst, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); - ret_code = cugraph_type_erased_device_array_view_copy_to_host( - resource_handle, (byte_t*)h_result_wgt, wgt, &ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + if (h_wgt != NULL) { + ret_code = cugraph_type_erased_device_array_view_copy_to_host( + resource_handle, (byte_t*)h_result_wgt, wgt, &ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + } ret_code = cugraph_type_erased_device_array_view_copy_to_host( resource_handle, (byte_t*)h_result_offsets, offsets, &ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "copy_to_host failed."); + printf("rank = %d, num_result_offsets = %lu, num_seeds = %lu\n", rank, num_result_offsets, num_seeds); + TEST_ASSERT( test_ret_value, (num_seeds + 1) == num_result_offsets, "number of offsets doesn't match"); +#if 0 for (int i = 0; (i < num_result_offsets) && (test_ret_value == 0); ++i) { TEST_ASSERT( test_ret_value, h_result_offsets[i] == h_expected_offsets[i], "offsets don't match"); } +#endif weight_t M[num_vertices][num_vertices]; @@ -191,6 +196,37 @@ int test_egonet(const cugraph_resource_handle_t* resource_handle) FALSE); } +int test_egonet_no_weights(const cugraph_resource_handle_t* resource_handle) +{ + size_t num_edges = 9; + size_t num_vertices = 6; + size_t radius = 2; + size_t num_seeds = 2; + + vertex_t h_src[] = {0, 1, 1, 2, 2, 2, 3, 3, 4}; + vertex_t h_dst[] = {1, 3, 4, 0, 1, 3, 4, 5, 5}; + vertex_t h_seeds[] = {0, 1}; + + vertex_t h_result_src[] = {0, 1, 1, 3, 1, 1, 3, 3, 4}; + vertex_t h_result_dst[] = {1, 3, 4, 4, 3, 4, 4, 5, 5}; + size_t h_result_offsets[] = {0, 4, 9}; + + // Egonet wants store_transposed = FALSE + return generic_egonet_test(resource_handle, + h_src, + h_dst, + NULL, + h_seeds, + h_result_src, + h_result_dst, + h_result_offsets, + num_vertices, + num_edges, + num_seeds, + radius, + FALSE); +} + /******************************************************************************/ int main(int argc, char** argv) @@ -200,6 +236,7 @@ int main(int argc, char** argv) int result = 0; result |= RUN_MG_TEST(test_egonet, handle); + result |= RUN_MG_TEST(test_egonet_no_weights, handle); cugraph_free_resource_handle(handle); free_mg_raft_handle(raft_handle); diff --git a/cpp/tests/c_api/mg_test_utils.cpp b/cpp/tests/c_api/mg_test_utils.cpp index 7e8c9b22aac..5a94dff78dc 100644 --- a/cpp/tests/c_api/mg_test_utils.cpp +++ b/cpp/tests/c_api/mg_test_utils.cpp @@ -441,63 +441,35 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl data_type_id_t type_tid = INT32; data_type_id_t weight_tid = FLOAT32; - cugraph_type_erased_device_array_t* src; - cugraph_type_erased_device_array_t* dst; - cugraph_type_erased_device_array_t* idx; - cugraph_type_erased_device_array_t* type; - cugraph_type_erased_device_array_t* wgt; - cugraph_type_erased_device_array_view_t* src_view; - cugraph_type_erased_device_array_view_t* dst_view; - cugraph_type_erased_device_array_view_t* idx_view; - cugraph_type_erased_device_array_view_t* type_view; - cugraph_type_erased_device_array_view_t* wgt_view; + cugraph_type_erased_device_array_t* src = NULL; + cugraph_type_erased_device_array_t* dst = NULL; + cugraph_type_erased_device_array_t* idx = NULL; + cugraph_type_erased_device_array_t* type = NULL; + cugraph_type_erased_device_array_t* wgt = NULL; + cugraph_type_erased_device_array_view_t* src_view = NULL; + cugraph_type_erased_device_array_view_t* dst_view = NULL; + cugraph_type_erased_device_array_view_t* idx_view = NULL; + cugraph_type_erased_device_array_view_t* type_view = NULL; + cugraph_type_erased_device_array_view_t* wgt_view = NULL; int rank = 0; rank = cugraph_resource_handle_get_rank(handle); - if (rank == 0) { - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &src, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &dst, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, index_tid, &idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, type_tid, &type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); - - ret_code = - cugraph_type_erased_device_array_create(handle, num_edges, weight_tid, &wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); - } else { - ret_code = cugraph_type_erased_device_array_create(handle, 0, vertex_tid, &src, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - - ret_code = cugraph_type_erased_device_array_create(handle, 0, vertex_tid, &dst, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); + size_t original_num_edges = num_edges; - ret_code = cugraph_type_erased_device_array_create(handle, 0, index_tid, &idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); + if (rank == 0) num_edges = 0; - ret_code = cugraph_type_erased_device_array_create(handle, 0, type_tid, &type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &src, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "src create failed."); - ret_code = cugraph_type_erased_device_array_create(handle, 0, weight_tid, &wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); - } + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, vertex_tid, &dst, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst create failed."); src_view = cugraph_type_erased_device_array_view(src); dst_view = cugraph_type_erased_device_array_view(dst); - idx_view = cugraph_type_erased_device_array_view(idx); - type_view = cugraph_type_erased_device_array_view(type); - wgt_view = cugraph_type_erased_device_array_view(wgt); ret_code = cugraph_type_erased_device_array_view_copy_from_host( handle, src_view, (byte_t*)h_src, ret_error); @@ -507,17 +479,41 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl handle, dst_view, (byte_t*)h_dst, ret_error); TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "dst copy_from_host failed."); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, idx_view, (byte_t*)h_idx, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index copy_from_host failed."); + if (h_idx != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, index_tid, &idx, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index create failed."); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, type_view, (byte_t*)h_type, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type copy_from_host failed."); + idx_view = cugraph_type_erased_device_array_view(idx); - ret_code = cugraph_type_erased_device_array_view_copy_from_host( - handle, wgt_view, (byte_t*)h_wgt, ret_error); - TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt copy_from_host failed."); + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, idx_view, (byte_t*)h_idx, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "index copy_from_host failed."); + } + + if (h_type != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, type_tid, &type, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type create failed."); + + type_view = cugraph_type_erased_device_array_view(type); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, type_view, (byte_t*)h_type, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "type copy_from_host failed."); + } + + if (h_wgt != nullptr) { + ret_code = + cugraph_type_erased_device_array_create(handle, num_edges, weight_tid, &wgt, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt create failed."); + + wgt_view = cugraph_type_erased_device_array_view(wgt); + + ret_code = cugraph_type_erased_device_array_view_copy_from_host( + handle, wgt_view, (byte_t*)h_wgt, ret_error); + TEST_ASSERT(test_ret_value, ret_code == CUGRAPH_SUCCESS, "wgt copy_from_host failed."); + } ret_code = cugraph_mg_graph_create(handle, &properties, @@ -527,7 +523,7 @@ extern "C" int create_mg_test_graph_with_properties(const cugraph_resource_handl idx_view, type_view, store_transposed, - num_edges, + original_num_edges, FALSE, p_graph, ret_error); From 01d46f7ba5f913a729b23f6e0be80f54cfdcebc8 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 28 Apr 2023 21:32:36 +0000 Subject: [PATCH 13/37] update cugraph-pyg and cugraph-dgl --- .../cugraph_dgl/dataloading/dataloader.py | 3 - .../cugraph_pyg/loader/cugraph_node_loader.py | 52 ++++++------ .../dask/sampling/uniform_neighbor_sample.py | 1 + .../cugraph/gnn/data_loading/__init__.py | 2 +- .../cugraph/gnn/data_loading/bulk_sampler.py | 38 ++------- .../gnn/data_loading/bulk_sampler_io.py | 85 +++++++++++++++++++ .../graph_implementation/simpleGraph.py | 6 +- .../tests/sampling/test_bulk_sampler.py | 8 +- .../tests/sampling/test_bulk_sampler_io.py | 42 +++++++++ .../tests/sampling/test_bulk_sampler_io_mg.py | 49 +++++++++++ .../tests/sampling/test_bulk_sampler_mg.py | 67 +-------------- 11 files changed, 220 insertions(+), 133 deletions(-) create mode 100644 python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py create mode 100644 python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py create mode 100644 python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py diff --git a/python/cugraph-dgl/cugraph_dgl/dataloading/dataloader.py b/python/cugraph-dgl/cugraph_dgl/dataloading/dataloader.py index 31528d7061c..8f229445af9 100644 --- a/python/cugraph-dgl/cugraph_dgl/dataloading/dataloader.py +++ b/python/cugraph-dgl/cugraph_dgl/dataloading/dataloader.py @@ -209,14 +209,12 @@ def __iter__(self): output_dir = os.path.join( self._sampling_output_dir, "epoch_" + str(self.epoch_number) ) - rank = self._rank bs = BulkSampler( output_path=output_dir, batch_size=self._batch_size, graph=self._cugraph_graph, batches_per_partition=self._batches_per_partition, seeds_per_call=self._seeds_per_call, - rank=rank, fanout_vals=self.graph_sampler._reversed_fanout_vals, with_replacement=self.graph_sampler.replace, ) @@ -226,7 +224,6 @@ def __iter__(self): batch_df = create_batch_df(self.tensorized_indices_ds) bs.add_batches(batch_df, start_col_name="start", batch_col_name="batch_id") bs.flush() - output_dir = output_dir + f"/rank={rank}/" self.cugraph_dgl_dataset.set_input_files(input_directory=output_dir) self.epoch_number = self.epoch_number + 1 return super().__iter__() diff --git a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py index fa02ac78f43..df28478530f 100644 --- a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py +++ b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py @@ -14,6 +14,7 @@ import tempfile import os +import re import cupy import cudf @@ -29,8 +30,10 @@ torch_geometric = import_optional("torch_geometric") - class EXPERIMENTAL__BulkSampleLoader: + + __ex_parquet_file = re.compile(r'batch=([0-9]+)\-([0-9]+)\.parquet') + def __init__( self, feature_store: CuGraphStore, @@ -40,7 +43,6 @@ def __init__( shuffle=False, edge_types: Sequence[Tuple[str]] = None, directory=None, - rank=0, starting_batch_id=0, batches_per_partition=100, # Sampler args @@ -84,10 +86,6 @@ def __init__( The path of the directory to write samples to. Defaults to a new generated temporary directory. - rank: int (optional, default=0) - The rank of the current worker. Should be provided - when there are multiple workers. - starting_batch_id: int (optional, default=0) The starting id for each batch. Defaults to 0. Generally used when loading previously-sampled @@ -102,9 +100,8 @@ def __init__( self.__feature_store = feature_store self.__graph_store = graph_store - self.__rank = rank - self.__next_batch = starting_batch_id - self.__end_exclusive = starting_batch_id + self.__next_batch = -1 + self.__end_exclusive = -1 self.__batches_per_partition = batches_per_partition self.__starting_batch_id = starting_batch_id @@ -112,6 +109,8 @@ def __init__( # Will be loading from disk self.__num_batches = all_indices self.__directory = directory + self.__input_files = os.listdir(directory) + self.__input_files.reverse() return if batch_size is None or batch_size < 1: @@ -123,7 +122,6 @@ def __init__( batch_size, self.__directory.name, self.__graph_store._subgraph(edge_types), - rank=rank, fanout_vals=num_neighbors, with_replacement=replace, batches_per_partition=self.__batches_per_partition, @@ -161,32 +159,38 @@ def __init__( ) bulk_sampler.flush() + self.__input_files = os.listdir(self.__directory.name) + self.__input_files.reverse() def __next__(self): - # Quit iterating if there are no batches left - if self.__next_batch >= self.__num_batches + self.__starting_batch_id: - raise StopIteration - # Load the next set of sampling results if necessary + print('batch:', self.__next_batch, self.__end_exclusive) + print(self.__input_files) if self.__next_batch >= self.__end_exclusive: + # Quit iterating if there are no batches left + if len(self.__input_files) == 0: + raise StopIteration + # Read the next parquet file into memory dir_path = ( self.__directory if isinstance(self.__directory, str) else self.__directory.name ) - rank_path = os.path.join(dir_path, f"rank={self.__rank}") - file_end_batch_incl = min( - self.__end_exclusive + self.__batches_per_partition - 1, - self.__starting_batch_id + self.__num_batches - 1, - ) - parquet_path = os.path.join( - rank_path, - f"batch={self.__end_exclusive}" f"-{file_end_batch_incl}.parquet", - ) + fname = self.__input_files.pop() + print('fname: ', fname) + m = self.__ex_parquet_file.match(fname) + if m is None: + raise ValueError(f'Invalid parquet filename {fname}') + + self.__next_batch, end_inclusive = [int(g) for g in m.groups()] + self.__end_exclusive = end_inclusive + 1 - self.__end_exclusive += self.__batches_per_partition + parquet_path = os.path.join( + dir_path, + fname, + ) columns = { "sources": "int64", diff --git a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py index 27cf9a233d1..bbc58ef146d 100644 --- a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py @@ -304,6 +304,7 @@ def uniform_neighbor_sample( List of output GPUs (by rank) corresponding to batch id labels in the label list. Used to assign each batch id to a GPU. + Must be in ascending order (i.e. [0, 0, 1, 2]). random_state: int, optional Random seed to use when making sampling calls. diff --git a/python/cugraph/cugraph/gnn/data_loading/__init__.py b/python/cugraph/cugraph/gnn/data_loading/__init__.py index 6150bf5b422..14d20f43d6c 100644 --- a/python/cugraph/cugraph/gnn/data_loading/__init__.py +++ b/python/cugraph/cugraph/gnn/data_loading/__init__.py @@ -11,4 +11,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -from cugraph.gnn.data_loading.bulk_sampler import EXPERIMENTAL__BulkSampler +from cugraph.gnn.data_loading.bulk_sampler import EXPERIMENTAL__BulkSampler \ No newline at end of file diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py index 0a00cf9754d..036cd5f6295 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py @@ -23,6 +23,8 @@ import cugraph import pylibcugraph +from cugraph.gnn.data_loading.bulk_sampler_io import write_samples + class EXPERIMENTAL__BulkSampler: start_col_name = "_START_" @@ -202,6 +204,7 @@ def flush(self) -> None: self.__sample_call_args["label_to_output_comm_rank"] = ( self.__get_label_to_output_comm_rank(min_batch_id, max_batch_id) ) + self.__sample_call_args["label_list"] = cupy.arange(min_batch_id, max_batch_id+1, dtype='int32') samples, offsets = sample_fn( self.__graph, @@ -213,47 +216,22 @@ def flush(self) -> None: ) self.__batches = self.__batches[~batch_id_filter] - self.__write(samples, offsets, min_batch_id, npartitions) + self.__write(samples, offsets) if self.size > 0: self.flush() + def __write( self, samples: Union[cudf.DataFrame, dask_cudf.DataFrame], offsets: Union[cudf.DataFrame, dask_cudf.DataFrame], - min_batch_id: int, - npartitions: int, ) -> None: os.makedirs(self.__output_path, exist_ok=True) + write_samples(samples, offsets, self.__batches_per_partition, self.__output_path) + - for partition_k in range(npartitions): - ix_partition_start_inclusive = ( - min_batch_id + partition_k * self.batches_per_partition - ) - ix_partition_end_inclusive = ( - min_batch_id + (partition_k + 1) * self.batches_per_partition - 1 - ) - f = (samples.batch_id >= ix_partition_start_inclusive) & ( - samples.batch_id <= ix_partition_end_inclusive - ) - if len(samples[f]) == 0: - break - - ix_partition_end_inclusive = samples[f].batch_id.max() - if hasattr(ix_partition_end_inclusive, "compute"): - ix_partition_end_inclusive = ix_partition_end_inclusive.compute() - ix_partition_end_inclusive = int(ix_partition_end_inclusive) - - inner_path = os.path.join( - self.__output_path, - f"batch={ix_partition_start_inclusive}-{ix_partition_end_inclusive}" - ".parquet", - ) - - samples[f].to_parquet(inner_path, index=False) - - def __get_label_to_output_comm_rank(min_batch_id, max_batch_id): + def __get_label_to_output_comm_rank(self, min_batch_id, max_batch_id): num_workers = dask_cugraph.get_n_workers() num_batches = max_batch_id - min_batch_id + 1 z = cupy.zeros(num_batches, dtype='int32') diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py new file mode 100644 index 00000000000..3e7873ce66c --- /dev/null +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py @@ -0,0 +1,85 @@ +import os +import cudf +import cupy + +from typing import Union, Optional + +def _write_samples_to_parquet(results: cudf.DataFrame, + offsets:cudf.DataFrame, + batches_per_partition:int, + output_path:str, + partition_info:Optional[Union[dict, str]]=None) -> None: + """ + Writes the samples to parquet. + results: cudf.DataFrame + The results dataframe containing the sampled minibatches. + offsets: cudf.DataFrame + The offsets dataframe indicating the start/end of each minibatch + in the reuslts dataframe. + batches_per_partition: int + The maximum number of minibatches allowed per written parquet partition. + output_path: str + The output path (where parquet files should be written to). + partition_info: Union[dict, str] + Either a dictionary containing partition data from dask, the string 'sg' + indicating that this is a single GPU write, or None indicating that this + function should perform a no-op (required by dask). + """ + + # Required by dask; need to skip dummy partitions. + if partition_info is None: + return + if partition_info != 'sg' and (not isinstance(partition_info, dict)): + raise ValueError('Invalid value of partition_info') + + max_batch_id = offsets.batch_id.max() + + for p in range(0, len(offsets), batches_per_partition): + offsets_p = offsets.iloc[p:p+batches_per_partition] + start_batch_id = offsets_p.batch_id.iloc[0] + end_batch_id = offsets_p.batch_id.iloc[-1] + + start_ix = offsets_p.offsets.iloc[0] + if end_batch_id == max_batch_id: + end_ix = len(results) + else: + end_ix = offsets.offsets[offsets.batch_id==(end_batch_id+1)].iloc[0] + + full_output_path = os.path.join(output_path, f'batch={start_batch_id}-{end_batch_id}.parquet') + results_p = results.iloc[start_ix:end_ix] + + results_p['batch_id'] = offsets_p.batch_id.repeat(cupy.diff(offsets_p.offsets.values, append=end_ix)).values + results_p.to_parquet(full_output_path) + +def write_samples(results: cudf.DataFrame, + offsets: cudf.DataFrame, + batches_per_partition: cudf.DataFrame, + output_path: str): + """ + Writes the samples to parquet. + results: cudf.DataFrame + The results dataframe containing the sampled minibatches. + offsets: cudf.DataFrame + The offsets dataframe indicating the start/end of each minibatch + in the reuslts dataframe. + batches_per_partition: int + The maximum number of minibatches allowed per written parquet partition. + output_path: str + The output path (where parquet files should be written to). + """ + if hasattr(results, "compute"): + results.map_partitions( + _write_samples_to_parquet, + offsets, + batches_per_partition, + output_path, + align_dataframes=False + ).compute() + else: + _write_samples_to_parquet( + results, + offsets, + batches_per_partition, + output_path, + partition_info='sg' + ) \ No newline at end of file diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 85c9ede7a6e..08aa3ae4eff 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -51,7 +51,6 @@ def __init__( destination: str, edge_attr: Union[cudf.DataFrame, Dict[str, cudf.DataFrame]] = None, ): - print("edge attr: ", edge_attr) self.edgelist_df = cudf.DataFrame() self.edgelist_df[simpleGraphImpl.srcCol] = source self.edgelist_df[simpleGraphImpl.dstCol] = destination @@ -255,7 +254,6 @@ def __from_edgelist( multi=self.properties.multi_edge, symmetrize=not self.properties.directed, ) - print("symmetrized df:\n", value_col) if isinstance(value_col, cudf.DataFrame): value_dict = {} @@ -281,9 +279,7 @@ def __from_edgelist( else None, } - print("weight name:", weight) - print("vc:") - print(value_col) + self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, value_col) if self.batch_enabled: diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py index bc801cab0a2..8270cff5bd4 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py @@ -23,7 +23,6 @@ @pytest.mark.sg -@pytest.mark.skip("work in progress") def test_bulk_sampler_simple(): el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) el["eid"] = el["eid"].astype("int32") @@ -56,7 +55,7 @@ def test_bulk_sampler_simple(): bs.add_batches(batches, start_col_name="start", batch_col_name="batch") bs.flush() - recovered_samples = cudf.read_parquet(os.path.join(tempdir_object.name, "rank=0")) + recovered_samples = cudf.read_parquet(tempdir_object.name) for b in batches["batch"].unique().values_host.tolist(): assert b in recovered_samples["batch_id"].values_host.tolist() @@ -103,7 +102,7 @@ def test_bulk_sampler_remainder(): bs.add_batches(batches, start_col_name="start", batch_col_name="batch") bs.flush() - tld = os.path.join(tempdir_object.name, "rank=0") + tld = tempdir_object.name recovered_samples = cudf.read_parquet(tld) print(os.listdir(tld)) @@ -123,7 +122,6 @@ def test_bulk_sampler_remainder(): @pytest.mark.sg -@pytest.mark.skip("work in progress") def test_bulk_sampler_large_batch_size(): el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) el["eid"] = el["eid"].astype("int32") @@ -156,7 +154,7 @@ def test_bulk_sampler_large_batch_size(): bs.add_batches(batches, start_col_name="start", batch_col_name="batch") bs.flush() - recovered_samples = cudf.read_parquet(os.path.join(tempdir_object.name, "rank=0")) + recovered_samples = cudf.read_parquet(tempdir_object.name) for b in batches["batch"].unique().values_host.tolist(): assert b in recovered_samples["batch_id"].values_host.tolist() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py new file mode 100644 index 00000000000..93468edf365 --- /dev/null +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py @@ -0,0 +1,42 @@ +import pytest +import cudf +import tempfile +import os + +from cugraph.gnn.data_loading.bulk_sampler_io import write_samples + +@pytest.mark.sg +def test_bulk_sampler_io(): + results = cudf.DataFrame({ + 'sources': [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], + 'destinations': [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], + 'edge_id': None, + 'edge_type': None, + 'weight': None, + 'hop_id': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1] + }) + + offsets = cudf.DataFrame({ + 'offsets': [0, 8], + 'batch_id': [0, 1] + }) + + tempdir_object = tempfile.TemporaryDirectory() + write_samples(results, offsets, 1, tempdir_object.name) + + assert len(os.listdir(tempdir_object.name)) == 2 + + df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=0-0.parquet')) + assert len(df) == 8 + + assert df.sources.values_host.tolist() == results.sources.iloc[0:8].values_host.tolist() + assert df.destinations.values_host.tolist() == results.destinations.iloc[0:8].values_host.tolist() + assert df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() + assert (df.batch_id==0).all() + + df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=1-1.parquet')) + assert len(df) == 4 + assert df.sources.values_host.tolist() == results.sources.iloc[8:12].values_host.tolist() + assert df.destinations.values_host.tolist() == results.destinations.iloc[8:12].values_host.tolist() + assert df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() + assert (df.batch_id==1).all() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py new file mode 100644 index 00000000000..199c411e705 --- /dev/null +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py @@ -0,0 +1,49 @@ +import pytest + +import cudf +import dask_cudf + +import tempfile +import os + +from cugraph.gnn.data_loading.bulk_sampler_io import write_samples + +@pytest.mark.mg +def test_bulk_sampler_io(): + results = cudf.DataFrame({ + 'sources': [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], + 'destinations': [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], + 'edge_id': None, + 'edge_type': None, + 'weight': None, + 'hop_id': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1] + }) + results = dask_cudf.from_cudf(results, npartitions=1).repartition(divisions=[0, 8, 11]) + + offsets = cudf.DataFrame({ + 'offsets': [0, 0], + 'batch_id': [0, 1] + }) + offsets = dask_cudf.from_cudf(offsets, npartitions=2) + print(offsets.npartitions) + + tempdir_object = tempfile.TemporaryDirectory() + write_samples(results, offsets, 1, tempdir_object.name) + + assert len(os.listdir(tempdir_object.name)) == 2 + + df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=0-0.parquet')) + assert len(df) == 8 + + results = results.compute() + assert df.sources.values_host.tolist() == results.sources.iloc[0:8].values_host.tolist() + assert df.destinations.values_host.tolist() == results.destinations.iloc[0:8].values_host.tolist() + assert df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() + assert (df.batch_id==0).all() + + df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=1-1.parquet')) + assert len(df) == 4 + assert df.sources.values_host.tolist() == results.sources.iloc[8:12].values_host.tolist() + assert df.destinations.values_host.tolist() == results.destinations.iloc[8:12].values_host.tolist() + assert df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() + assert (df.batch_id==1).all() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py index 8bb16e03252..b510aaa2c8e 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py @@ -59,75 +59,12 @@ def test_bulk_sampler_simple(dask_client): bs.add_batches(batches, start_col_name="start", batch_col_name="batch") bs.flush() - recovered_samples = cudf.read_parquet(os.path.join(tempdir_object.name, "rank=0")) + recovered_samples = cudf.read_parquet(tempdir_object.name) for b in batches["batch"].unique().compute().values_host.tolist(): assert b in recovered_samples["batch_id"].values_host.tolist() -@pytest.mark.mg -def test_bulk_sampler_remainder(dask_client): - el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) - el["eid"] = el["eid"].astype("int32") - el["etp"] = cupy.int32(0) - - G = cugraph.Graph(directed=True) - G.from_dask_cudf_edgelist( - dask_cudf.from_cudf(el, npartitions=2), - source="src", - destination="dst", - edge_attr=["wgt", "eid", "etp"], - ) - - tempdir_object = tempfile.TemporaryDirectory() - bs = BulkSampler( - batch_size=2, - output_path=tempdir_object.name, - graph=G, - seeds_per_call=7, - batches_per_partition=2, - fanout_vals=[2, 2], - with_replacement=False, - ) - - # Should process batch (0, 1, 2) then (3, 4, 5) then 6 - - batches = dask_cudf.from_cudf( - cudf.DataFrame( - { - "start": cudf.Series( - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype="int32" - ), - "batch": cudf.Series( - [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6], dtype="int32" - ), - } - ), - npartitions=2, - ) - - bs.add_batches(batches, start_col_name="start", batch_col_name="batch") - bs.flush() - - tld = os.path.join(tempdir_object.name, "rank=0") - print(os.listdir(tld)) - recovered_samples = cudf.read_parquet(tld) - - for b in batches["batch"].compute().unique().values_host.tolist(): - assert b in recovered_samples["batch_id"].values_host.tolist() - - for x in range(0, 6, 2): - subdir = f"{x}-{x+1}" - df = cudf.read_parquet(os.path.join(tld, f"batch={subdir}.parquet")) - - assert ((df.batch_id == x) | (df.batch_id == (x + 1))).all() - assert ((df.hop_id == 0) | (df.hop_id == 1)).all() - - assert ( - cudf.read_parquet(os.path.join(tld, "batch=6-6.parquet")).batch_id == 6 - ).all() - - @pytest.mark.mg def test_bulk_sampler_mg_graph_sg_input(dask_client): el = karate.get_edgelist().reset_index().rename(columns={"index": "eid"}) @@ -161,7 +98,7 @@ def test_bulk_sampler_mg_graph_sg_input(dask_client): bs.add_batches(batches, start_col_name="start", batch_col_name="batch") bs.flush() - recovered_samples = cudf.read_parquet(os.path.join(tempdir_object.name, "rank=0")) + recovered_samples = cudf.read_parquet(tempdir_object.name) for b in batches["batch"].unique().values_host.tolist(): assert b in recovered_samples["batch_id"].values_host.tolist() From 9a30a7e58397a869555c98316518e9b142638e06 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 1 May 2023 15:33:53 +0000 Subject: [PATCH 14/37] fix style and copyright --- .../cugraph_pyg/data/cugraph_store.py | 4 +- .../cugraph_pyg/loader/cugraph_node_loader.py | 11 +-- .../dask/sampling/uniform_neighbor_sample.py | 8 +- .../cugraph/gnn/data_loading/__init__.py | 2 +- .../cugraph/gnn/data_loading/bulk_sampler.py | 20 ++--- .../gnn/data_loading/bulk_sampler_io.py | 65 +++++++++------ .../graph_implementation/simpleGraph.py | 1 - .../tests/sampling/test_bulk_sampler_io.py | 75 ++++++++++++------ .../tests/sampling/test_bulk_sampler_io_mg.py | 79 +++++++++++++------ .../tests/sampling/test_bulk_sampler_mg.py | 1 - 10 files changed, 173 insertions(+), 93 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py b/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py index f7589ac877e..7e52f820ec4 100644 --- a/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py +++ b/python/cugraph-pyg/cugraph_pyg/data/cugraph_store.py @@ -439,7 +439,7 @@ def __construct_graph( df, source="src", destination="dst", - edge_type='etp', + edge_type="etp", ) distributed.get_client().publish_dataset(cugraph_graph=graph) else: @@ -447,7 +447,7 @@ def __construct_graph( df, source="src", destination="dst", - edge_type='etp', + edge_type="etp", ) return graph diff --git a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py index df28478530f..3a4ec19ae79 100644 --- a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py +++ b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py @@ -30,9 +30,10 @@ torch_geometric = import_optional("torch_geometric") + class EXPERIMENTAL__BulkSampleLoader: - __ex_parquet_file = re.compile(r'batch=([0-9]+)\-([0-9]+)\.parquet') + __ex_parquet_file = re.compile(r"batch=([0-9]+)\-([0-9]+)\.parquet") def __init__( self, @@ -164,7 +165,7 @@ def __init__( def __next__(self): # Load the next set of sampling results if necessary - print('batch:', self.__next_batch, self.__end_exclusive) + print("batch:", self.__next_batch, self.__end_exclusive) print(self.__input_files) if self.__next_batch >= self.__end_exclusive: # Quit iterating if there are no batches left @@ -179,10 +180,10 @@ def __next__(self): ) fname = self.__input_files.pop() - print('fname: ', fname) + print("fname: ", fname) m = self.__ex_parquet_file.match(fname) if m is None: - raise ValueError(f'Invalid parquet filename {fname}') + raise ValueError(f"Invalid parquet filename {fname}") self.__next_batch, end_inclusive = [int(g) for g in m.groups()] self.__end_exclusive = end_inclusive + 1 @@ -190,7 +191,7 @@ def __next__(self): parquet_path = os.path.join( dir_path, fname, - ) + ) columns = { "sources": "int64", diff --git a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py index bbc58ef146d..03f36b88299 100644 --- a/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py +++ b/python/cugraph/cugraph/dask/sampling/uniform_neighbor_sample.py @@ -120,10 +120,10 @@ def convert_to_cudf(cp_arrays, weight_t, with_edge_properties, return_offsets=Fa df[hop_id_n] = hop_ids print( - f'sources: {sources}\n' - f'destinations: {destinations}\n' - f'batch: {batch_ids}\n' - f'offset: {offsets}\n' + f"sources: {sources}\n" + f"destinations: {destinations}\n" + f"batch: {batch_ids}\n" + f"offset: {offsets}\n" ) if return_offsets: diff --git a/python/cugraph/cugraph/gnn/data_loading/__init__.py b/python/cugraph/cugraph/gnn/data_loading/__init__.py index 14d20f43d6c..6150bf5b422 100644 --- a/python/cugraph/cugraph/gnn/data_loading/__init__.py +++ b/python/cugraph/cugraph/gnn/data_loading/__init__.py @@ -11,4 +11,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -from cugraph.gnn.data_loading.bulk_sampler import EXPERIMENTAL__BulkSampler \ No newline at end of file +from cugraph.gnn.data_loading.bulk_sampler import EXPERIMENTAL__BulkSampler diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py index 036cd5f6295..8a07c0c60c4 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py @@ -201,10 +201,12 @@ def flush(self) -> None: else: sample_fn = cugraph.dask.uniform_neighbor_sample self.__sample_call_args["_multiple_clients"] = True - self.__sample_call_args["label_to_output_comm_rank"] = ( - self.__get_label_to_output_comm_rank(min_batch_id, max_batch_id) + self.__sample_call_args[ + "label_to_output_comm_rank" + ] = self.__get_label_to_output_comm_rank(min_batch_id, max_batch_id) + self.__sample_call_args["label_list"] = cupy.arange( + min_batch_id, max_batch_id + 1, dtype="int32" ) - self.__sample_call_args["label_list"] = cupy.arange(min_batch_id, max_batch_id+1, dtype='int32') samples, offsets = sample_fn( self.__graph, @@ -221,22 +223,22 @@ def flush(self) -> None: if self.size > 0: self.flush() - def __write( self, samples: Union[cudf.DataFrame, dask_cudf.DataFrame], offsets: Union[cudf.DataFrame, dask_cudf.DataFrame], ) -> None: os.makedirs(self.__output_path, exist_ok=True) - write_samples(samples, offsets, self.__batches_per_partition, self.__output_path) - + write_samples( + samples, offsets, self.__batches_per_partition, self.__output_path + ) def __get_label_to_output_comm_rank(self, min_batch_id, max_batch_id): num_workers = dask_cugraph.get_n_workers() num_batches = max_batch_id - min_batch_id + 1 - z = cupy.zeros(num_batches, dtype='int32') + z = cupy.zeros(num_batches, dtype="int32") s = cupy.array_split(cupy.arange(num_batches), num_workers) for i, t in enumerate(s): z[t] = i - - return cudf.Series(z) \ No newline at end of file + + return cudf.Series(z) diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py index 3e7873ce66c..fd7366cbe40 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler_io.py @@ -1,14 +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 os import cudf import cupy from typing import Union, Optional -def _write_samples_to_parquet(results: cudf.DataFrame, - offsets:cudf.DataFrame, - batches_per_partition:int, - output_path:str, - partition_info:Optional[Union[dict, str]]=None) -> None: + +def _write_samples_to_parquet( + results: cudf.DataFrame, + offsets: cudf.DataFrame, + batches_per_partition: int, + output_path: str, + partition_info: Optional[Union[dict, str]] = None, +) -> None: """ Writes the samples to parquet. results: cudf.DataFrame @@ -29,13 +45,13 @@ def _write_samples_to_parquet(results: cudf.DataFrame, # Required by dask; need to skip dummy partitions. if partition_info is None: return - if partition_info != 'sg' and (not isinstance(partition_info, dict)): - raise ValueError('Invalid value of partition_info') + if partition_info != "sg" and (not isinstance(partition_info, dict)): + raise ValueError("Invalid value of partition_info") max_batch_id = offsets.batch_id.max() for p in range(0, len(offsets), batches_per_partition): - offsets_p = offsets.iloc[p:p+batches_per_partition] + offsets_p = offsets.iloc[p : p + batches_per_partition] start_batch_id = offsets_p.batch_id.iloc[0] end_batch_id = offsets_p.batch_id.iloc[-1] @@ -43,18 +59,25 @@ def _write_samples_to_parquet(results: cudf.DataFrame, if end_batch_id == max_batch_id: end_ix = len(results) else: - end_ix = offsets.offsets[offsets.batch_id==(end_batch_id+1)].iloc[0] - - full_output_path = os.path.join(output_path, f'batch={start_batch_id}-{end_batch_id}.parquet') + end_ix = offsets.offsets[offsets.batch_id == (end_batch_id + 1)].iloc[0] + + full_output_path = os.path.join( + output_path, f"batch={start_batch_id}-{end_batch_id}.parquet" + ) results_p = results.iloc[start_ix:end_ix] - results_p['batch_id'] = offsets_p.batch_id.repeat(cupy.diff(offsets_p.offsets.values, append=end_ix)).values + results_p["batch_id"] = offsets_p.batch_id.repeat( + cupy.diff(offsets_p.offsets.values, append=end_ix) + ).values results_p.to_parquet(full_output_path) -def write_samples(results: cudf.DataFrame, - offsets: cudf.DataFrame, - batches_per_partition: cudf.DataFrame, - output_path: str): + +def write_samples( + results: cudf.DataFrame, + offsets: cudf.DataFrame, + batches_per_partition: cudf.DataFrame, + output_path: str, +): """ Writes the samples to parquet. results: cudf.DataFrame @@ -73,13 +96,9 @@ def write_samples(results: cudf.DataFrame, offsets, batches_per_partition, output_path, - align_dataframes=False + align_dataframes=False, ).compute() else: _write_samples_to_parquet( - results, - offsets, - batches_per_partition, - output_path, - partition_info='sg' - ) \ No newline at end of file + results, offsets, batches_per_partition, output_path, partition_info="sg" + ) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 08aa3ae4eff..aa7910586ef 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -279,7 +279,6 @@ def __from_edgelist( else None, } - self.edgelist = simpleGraphImpl.EdgeList(source_col, dest_col, value_col) if self.batch_enabled: diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py index 93468edf365..83d20ea2cf5 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io.py @@ -1,3 +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. + import pytest import cudf import tempfile @@ -5,38 +18,54 @@ from cugraph.gnn.data_loading.bulk_sampler_io import write_samples + @pytest.mark.sg def test_bulk_sampler_io(): - results = cudf.DataFrame({ - 'sources': [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], - 'destinations': [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], - 'edge_id': None, - 'edge_type': None, - 'weight': None, - 'hop_id': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1] - }) - - offsets = cudf.DataFrame({ - 'offsets': [0, 8], - 'batch_id': [0, 1] - }) + results = cudf.DataFrame( + { + "sources": [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], + "destinations": [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], + "edge_id": None, + "edge_type": None, + "weight": None, + "hop_id": [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], + } + ) + + offsets = cudf.DataFrame({"offsets": [0, 8], "batch_id": [0, 1]}) tempdir_object = tempfile.TemporaryDirectory() write_samples(results, offsets, 1, tempdir_object.name) assert len(os.listdir(tempdir_object.name)) == 2 - df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=0-0.parquet')) + df = cudf.read_parquet(os.path.join(tempdir_object.name, "batch=0-0.parquet")) assert len(df) == 8 - assert df.sources.values_host.tolist() == results.sources.iloc[0:8].values_host.tolist() - assert df.destinations.values_host.tolist() == results.destinations.iloc[0:8].values_host.tolist() - assert df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() - assert (df.batch_id==0).all() + assert ( + df.sources.values_host.tolist() + == results.sources.iloc[0:8].values_host.tolist() + ) + assert ( + df.destinations.values_host.tolist() + == results.destinations.iloc[0:8].values_host.tolist() + ) + assert ( + df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() + ) + assert (df.batch_id == 0).all() - df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=1-1.parquet')) + df = cudf.read_parquet(os.path.join(tempdir_object.name, "batch=1-1.parquet")) assert len(df) == 4 - assert df.sources.values_host.tolist() == results.sources.iloc[8:12].values_host.tolist() - assert df.destinations.values_host.tolist() == results.destinations.iloc[8:12].values_host.tolist() - assert df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() - assert (df.batch_id==1).all() + assert ( + df.sources.values_host.tolist() + == results.sources.iloc[8:12].values_host.tolist() + ) + assert ( + df.destinations.values_host.tolist() + == results.destinations.iloc[8:12].values_host.tolist() + ) + assert ( + df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() + ) + assert (df.batch_id == 1).all() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py index 199c411e705..0d07eb5530b 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py @@ -1,3 +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. + import pytest import cudf @@ -8,22 +21,24 @@ from cugraph.gnn.data_loading.bulk_sampler_io import write_samples + @pytest.mark.mg def test_bulk_sampler_io(): - results = cudf.DataFrame({ - 'sources': [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], - 'destinations': [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], - 'edge_id': None, - 'edge_type': None, - 'weight': None, - 'hop_id': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1] - }) - results = dask_cudf.from_cudf(results, npartitions=1).repartition(divisions=[0, 8, 11]) - - offsets = cudf.DataFrame({ - 'offsets': [0, 0], - 'batch_id': [0, 1] - }) + results = cudf.DataFrame( + { + "sources": [0, 0, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7], + "destinations": [1, 2, 3, 3, 3, 4, 1, 1, 6, 7, 2, 3], + "edge_id": None, + "edge_type": None, + "weight": None, + "hop_id": [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], + } + ) + results = dask_cudf.from_cudf(results, npartitions=1).repartition( + divisions=[0, 8, 11] + ) + + offsets = cudf.DataFrame({"offsets": [0, 0], "batch_id": [0, 1]}) offsets = dask_cudf.from_cudf(offsets, npartitions=2) print(offsets.npartitions) @@ -32,18 +47,34 @@ def test_bulk_sampler_io(): assert len(os.listdir(tempdir_object.name)) == 2 - df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=0-0.parquet')) + df = cudf.read_parquet(os.path.join(tempdir_object.name, "batch=0-0.parquet")) assert len(df) == 8 results = results.compute() - assert df.sources.values_host.tolist() == results.sources.iloc[0:8].values_host.tolist() - assert df.destinations.values_host.tolist() == results.destinations.iloc[0:8].values_host.tolist() - assert df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() - assert (df.batch_id==0).all() + assert ( + df.sources.values_host.tolist() + == results.sources.iloc[0:8].values_host.tolist() + ) + assert ( + df.destinations.values_host.tolist() + == results.destinations.iloc[0:8].values_host.tolist() + ) + assert ( + df.hop_id.values_host.tolist() == results.hop_id.iloc[0:8].values_host.tolist() + ) + assert (df.batch_id == 0).all() - df = cudf.read_parquet(os.path.join(tempdir_object.name, 'batch=1-1.parquet')) + df = cudf.read_parquet(os.path.join(tempdir_object.name, "batch=1-1.parquet")) assert len(df) == 4 - assert df.sources.values_host.tolist() == results.sources.iloc[8:12].values_host.tolist() - assert df.destinations.values_host.tolist() == results.destinations.iloc[8:12].values_host.tolist() - assert df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() - assert (df.batch_id==1).all() + assert ( + df.sources.values_host.tolist() + == results.sources.iloc[8:12].values_host.tolist() + ) + assert ( + df.destinations.values_host.tolist() + == results.destinations.iloc[8:12].values_host.tolist() + ) + assert ( + df.hop_id.values_host.tolist() == results.hop_id.iloc[8:12].values_host.tolist() + ) + assert (df.batch_id == 1).all() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py index b510aaa2c8e..f717d452403 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_mg.py @@ -20,7 +20,6 @@ from cugraph.experimental import BulkSampler import tempfile -import os @pytest.mark.mg From 4f732a8420406c9ba1996baeb4998ccecafb6157 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 2 May 2023 20:38:45 +0000 Subject: [PATCH 15/37] fix pylibcugraph empty weights issue, update tests --- python/cugraph/cugraph/community/egonet.py | 6 ++++-- python/cugraph/cugraph/dask/community/egonet.py | 9 ++++++++- .../cugraph/cugraph/tests/sampling/test_egonet_mg.py | 2 +- python/pylibcugraph/pylibcugraph/egonet.pyx | 10 ++++++++-- python/pylibcugraph/pylibcugraph/k_core.pyx | 8 ++++++-- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/python/cugraph/cugraph/community/egonet.py b/python/cugraph/cugraph/community/egonet.py index f39ed8bf86c..531f52c4c27 100644 --- a/python/cugraph/cugraph/community/egonet.py +++ b/python/cugraph/cugraph/community/egonet.py @@ -18,6 +18,7 @@ from cugraph.utilities import cugraph_to_nx import cudf +import cupy from pylibcugraph import ego_graph as pylibcugraph_ego_graph @@ -132,13 +133,14 @@ def ego_graph(G, n, radius=1, center=True, undirected=None, distance=None): df = cudf.DataFrame() df["src"] = source df["dst"] = destination - df["weight"] = weight + if weight is not None: + df["weight"] = weight if G.renumbered: df, src_names = G.unrenumber(df, "src", get_column_names=True) df, dst_names = G.unrenumber(df, "dst", get_column_names=True) else: - # FIXME: THe original 'src' and 'dst' are not stored in 'simpleGraph' + # FIXME: The original 'src' and 'dst' are not stored in 'simpleGraph' src_names = "src" dst_names = "dst" diff --git a/python/cugraph/cugraph/dask/community/egonet.py b/python/cugraph/cugraph/dask/community/egonet.py index 2d0d07b59ce..2fbf92e3584 100644 --- a/python/cugraph/cugraph/dask/community/egonet.py +++ b/python/cugraph/cugraph/dask/community/egonet.py @@ -18,6 +18,7 @@ import cugraph.dask.comms.comms as Comms import dask_cudf import cudf +import cupy from cugraph.dask.common.input_utils import get_distributed_data from pylibcugraph import ResourceHandle, ego_graph as pylibcugraph_ego_graph @@ -63,10 +64,15 @@ def consolidate_results(df, offsets): def convert_to_cudf(cp_arrays): cp_src, cp_dst, cp_weight, cp_offsets = cp_arrays + print(cp_weight) + df = cudf.DataFrame() df["src"] = cp_src df["dst"] = cp_dst - df["weight"] = cp_weight + if cp_weight is None: + df['weight'] = None + else: + df["weight"] = cp_weight offsets = cudf.Series(cp_offsets) @@ -180,4 +186,5 @@ def ego_graph(input_graph, n, radius=1, center=True): ddf = input_graph.unrenumber(ddf, "src") ddf = input_graph.unrenumber(ddf, "dst") + print(ddf.compute()) return ddf, offsets diff --git a/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py b/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py index 96b5ec2ac3a..674761154ff 100644 --- a/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py @@ -76,7 +76,7 @@ def input_expected_output(input_combo): directed = input_combo["directed"] seeds = input_combo["seeds"] radius = input_combo["radius"] - G = utils.generate_cugraph_graph_from_file(input_data_path, directed=directed) + G = utils.generate_cugraph_graph_from_file(input_data_path, directed=directed, edgevals=True) sg_cugraph_ego_graphs = cugraph.batched_ego_graphs(G, seeds=seeds, radius=radius) diff --git a/python/pylibcugraph/pylibcugraph/egonet.pyx b/python/pylibcugraph/pylibcugraph/egonet.pyx index 779aa0028b3..14a5b95b17b 100644 --- a/python/pylibcugraph/pylibcugraph/egonet.pyx +++ b/python/pylibcugraph/pylibcugraph/egonet.pyx @@ -153,10 +153,16 @@ def ego_graph(ResourceHandle resource_handle, # for perfomance improvement cupy_sources = copy_to_cupy_array( c_resource_handle_ptr, sources_ptr) + cupy_destinations = copy_to_cupy_array( c_resource_handle_ptr, destinations_ptr) - cupy_edge_weights = copy_to_cupy_array( - c_resource_handle_ptr, edge_weights_ptr) + + if edge_weights_ptr is not NULL: + cupy_edge_weights = copy_to_cupy_array( + c_resource_handle_ptr, edge_weights_ptr) + else: + cupy_edge_weights = None + cupy_subgraph_offsets = copy_to_cupy_array( c_resource_handle_ptr, subgraph_offsets_ptr) diff --git a/python/pylibcugraph/pylibcugraph/k_core.pyx b/python/pylibcugraph/pylibcugraph/k_core.pyx index 50344469b11..d905b68c439 100644 --- a/python/pylibcugraph/pylibcugraph/k_core.pyx +++ b/python/pylibcugraph/pylibcugraph/k_core.pyx @@ -156,12 +156,16 @@ def k_core(ResourceHandle resource_handle, cugraph_k_core_result_get_src_vertices(k_core_result_ptr) cdef cugraph_type_erased_device_array_view_t* dst_vertices_ptr = \ cugraph_k_core_result_get_dst_vertices(k_core_result_ptr) - cdef cugraph_type_erased_device_array_view_t* weigths_ptr = \ + cdef cugraph_type_erased_device_array_view_t* weights_ptr = \ cugraph_k_core_result_get_weights(k_core_result_ptr) cupy_src_vertices = copy_to_cupy_array(c_resource_handle_ptr, src_vertices_ptr) cupy_dst_vertices = copy_to_cupy_array(c_resource_handle_ptr, dst_vertices_ptr) - cupy_weights = copy_to_cupy_array(c_resource_handle_ptr, weigths_ptr) + + if weights_ptr is not NULL: + cupy_weights = copy_to_cupy_array(c_resource_handle_ptr, weights_ptr) + else: + cupy_weights = None cugraph_k_core_result_free(k_core_result_ptr) cugraph_core_result_free(core_result_ptr) From 918bdbe7b8bdc069db01fd795f4ffbdb234054eb Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 5 May 2023 14:43:32 +0000 Subject: [PATCH 16/37] style,copyright --- python/cugraph/cugraph/community/egonet.py | 3 +-- python/cugraph/cugraph/dask/community/egonet.py | 2 +- python/cugraph/cugraph/tests/sampling/test_egonet_mg.py | 4 +++- python/pylibcugraph/pylibcugraph/egonet.pyx | 2 +- python/pylibcugraph/pylibcugraph/k_core.pyx | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/python/cugraph/cugraph/community/egonet.py b/python/cugraph/cugraph/community/egonet.py index 531f52c4c27..684ae92febd 100644 --- a/python/cugraph/cugraph/community/egonet.py +++ b/python/cugraph/cugraph/community/egonet.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# Copyright (c) 2021-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 @@ -18,7 +18,6 @@ from cugraph.utilities import cugraph_to_nx import cudf -import cupy from pylibcugraph import ego_graph as pylibcugraph_ego_graph diff --git a/python/cugraph/cugraph/dask/community/egonet.py b/python/cugraph/cugraph/dask/community/egonet.py index 2fbf92e3584..1b0bac7ba45 100644 --- a/python/cugraph/cugraph/dask/community/egonet.py +++ b/python/cugraph/cugraph/dask/community/egonet.py @@ -70,7 +70,7 @@ def convert_to_cudf(cp_arrays): df["src"] = cp_src df["dst"] = cp_dst if cp_weight is None: - df['weight'] = None + df["weight"] = None else: df["weight"] = cp_weight diff --git a/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py b/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py index 674761154ff..172296c07f9 100644 --- a/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_egonet_mg.py @@ -76,7 +76,9 @@ def input_expected_output(input_combo): directed = input_combo["directed"] seeds = input_combo["seeds"] radius = input_combo["radius"] - G = utils.generate_cugraph_graph_from_file(input_data_path, directed=directed, edgevals=True) + G = utils.generate_cugraph_graph_from_file( + input_data_path, directed=directed, edgevals=True + ) sg_cugraph_ego_graphs = cugraph.batched_ego_graphs(G, seeds=seeds, radius=radius) diff --git a/python/pylibcugraph/pylibcugraph/egonet.pyx b/python/pylibcugraph/pylibcugraph/egonet.pyx index 14a5b95b17b..d011d946e46 100644 --- a/python/pylibcugraph/pylibcugraph/egonet.pyx +++ b/python/pylibcugraph/pylibcugraph/egonet.pyx @@ -1,4 +1,4 @@ -# Copyright (c) 2022, NVIDIA CORPORATION. +# Copyright (c) 2022-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 diff --git a/python/pylibcugraph/pylibcugraph/k_core.pyx b/python/pylibcugraph/pylibcugraph/k_core.pyx index d905b68c439..c47cfef7a7a 100644 --- a/python/pylibcugraph/pylibcugraph/k_core.pyx +++ b/python/pylibcugraph/pylibcugraph/k_core.pyx @@ -1,4 +1,4 @@ -# Copyright (c) 2022, NVIDIA CORPORATION. +# Copyright (c) 2022-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 From 4c3088297eb2510d592f4bf64f2e3be9c62bf701 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 5 May 2023 14:45:19 +0000 Subject: [PATCH 17/37] style --- python/cugraph/cugraph/dask/community/egonet.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/cugraph/cugraph/dask/community/egonet.py b/python/cugraph/cugraph/dask/community/egonet.py index 1b0bac7ba45..622d7fb2126 100644 --- a/python/cugraph/cugraph/dask/community/egonet.py +++ b/python/cugraph/cugraph/dask/community/egonet.py @@ -18,7 +18,6 @@ import cugraph.dask.comms.comms as Comms import dask_cudf import cudf -import cupy from cugraph.dask.common.input_utils import get_distributed_data from pylibcugraph import ResourceHandle, ego_graph as pylibcugraph_ego_graph From aa8cca5da4e0dc3771a9207178ec454992f962cc Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Fri, 5 May 2023 14:45:40 +0000 Subject: [PATCH 18/37] style --- python/cugraph/cugraph/dask/community/egonet.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/cugraph/cugraph/dask/community/egonet.py b/python/cugraph/cugraph/dask/community/egonet.py index 1b0bac7ba45..622d7fb2126 100644 --- a/python/cugraph/cugraph/dask/community/egonet.py +++ b/python/cugraph/cugraph/dask/community/egonet.py @@ -18,7 +18,6 @@ import cugraph.dask.comms.comms as Comms import dask_cudf import cudf -import cupy from cugraph.dask.common.input_utils import get_distributed_data from pylibcugraph import ResourceHandle, ego_graph as pylibcugraph_ego_graph From e8b05a5a70a819df2d3dabf23dd2ce00a0885789 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:17:51 +0000 Subject: [PATCH 19/37] iterator, print statement fix --- .../cugraph_pyg/loader/cugraph_node_loader.py | 17 +++++++---------- .../cugraph/tests/sampling/test_bulk_sampler.py | 1 - .../tests/sampling/test_bulk_sampler_io_mg.py | 1 - 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py index 3a4ec19ae79..b4cbd989eee 100644 --- a/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py +++ b/python/cugraph-pyg/cugraph_pyg/loader/cugraph_node_loader.py @@ -110,8 +110,7 @@ def __init__( # Will be loading from disk self.__num_batches = all_indices self.__directory = directory - self.__input_files = os.listdir(directory) - self.__input_files.reverse() + iter(os.listdir(self.__directory)) return if batch_size is None or batch_size < 1: @@ -160,16 +159,12 @@ def __init__( ) bulk_sampler.flush() - self.__input_files = os.listdir(self.__directory.name) - self.__input_files.reverse() + self.__input_files = iter(os.listdir(self.__directory.name)) def __next__(self): # Load the next set of sampling results if necessary - print("batch:", self.__next_batch, self.__end_exclusive) - print(self.__input_files) if self.__next_batch >= self.__end_exclusive: - # Quit iterating if there are no batches left - if len(self.__input_files) == 0: + if self.__directory is None: raise StopIteration # Read the next parquet file into memory @@ -179,8 +174,9 @@ def __next__(self): else self.__directory.name ) - fname = self.__input_files.pop() - print("fname: ", fname) + # Will raise StopIteration if there are no files left + fname = next(self.__input_files) + m = self.__ex_parquet_file.match(fname) if m is None: raise ValueError(f"Invalid parquet filename {fname}") @@ -217,6 +213,7 @@ def __next__(self): if self.__next_batch >= self.__num_batches + self.__starting_batch_id: # Won't delete a non-temp dir (since it would just be deleting a string) del self.__directory + self.__directory = None # Get and return the sampled subgraph if isinstance(torch_geometric, MissingModule): diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py index 8270cff5bd4..c25b5297e18 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler.py @@ -104,7 +104,6 @@ def test_bulk_sampler_remainder(): tld = tempdir_object.name recovered_samples = cudf.read_parquet(tld) - print(os.listdir(tld)) for b in batches["batch"].unique().values_host.tolist(): assert b in recovered_samples["batch_id"].values_host.tolist() diff --git a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py index 0d07eb5530b..eacd697b7b3 100644 --- a/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py +++ b/python/cugraph/cugraph/tests/sampling/test_bulk_sampler_io_mg.py @@ -40,7 +40,6 @@ def test_bulk_sampler_io(): offsets = cudf.DataFrame({"offsets": [0, 0], "batch_id": [0, 1]}) offsets = dask_cudf.from_cudf(offsets, npartitions=2) - print(offsets.npartitions) tempdir_object = tempfile.TemporaryDirectory() write_samples(results, offsets, 1, tempdir_object.name) From 99e2491fa815679a248df0ebc8f9bc5c2f14129a Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:18:21 +0000 Subject: [PATCH 20/37] remove egonet prints --- python/cugraph/cugraph/dask/community/egonet.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/cugraph/cugraph/dask/community/egonet.py b/python/cugraph/cugraph/dask/community/egonet.py index 622d7fb2126..06f5d5b9a79 100644 --- a/python/cugraph/cugraph/dask/community/egonet.py +++ b/python/cugraph/cugraph/dask/community/egonet.py @@ -63,8 +63,6 @@ def consolidate_results(df, offsets): def convert_to_cudf(cp_arrays): cp_src, cp_dst, cp_weight, cp_offsets = cp_arrays - print(cp_weight) - df = cudf.DataFrame() df["src"] = cp_src df["dst"] = cp_dst @@ -185,5 +183,4 @@ def ego_graph(input_graph, n, radius=1, center=True): ddf = input_graph.unrenumber(ddf, "src") ddf = input_graph.unrenumber(ddf, "dst") - print(ddf.compute()) return ddf, offsets From 11a1a62e48308c3c670f7fba1293bad7b031285d Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:20:37 +0000 Subject: [PATCH 21/37] fix --- python/cugraph/cugraph/dask/traversal/sssp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cugraph/cugraph/dask/traversal/sssp.py b/python/cugraph/cugraph/dask/traversal/sssp.py index 6740ef5a3f1..053a93fb42a 100644 --- a/python/cugraph/cugraph/dask/traversal/sssp.py +++ b/python/cugraph/cugraph/dask/traversal/sssp.py @@ -106,7 +106,7 @@ def sssp(input_graph, source, cutoff=None, check_source=True): "'SSSP' requires the input graph to be weighted." "'BFS' should be used instead of 'SSSP' for unweighted graphs." ) - raise RuntimeError(err_msg) + raise ValueError(err_msg) client = default_client() From 3f23d4df1e7474fdebfcffd99eb61415606ff6d8 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:27:52 +0000 Subject: [PATCH 22/37] style fix --- .../cugraph/gnn/data_loading/bulk_sampler.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py index 8a07c0c60c4..57b465067ba 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py @@ -200,12 +200,16 @@ def flush(self) -> None: sample_fn = cugraph.uniform_neighbor_sample else: sample_fn = cugraph.dask.uniform_neighbor_sample - self.__sample_call_args["_multiple_clients"] = True - self.__sample_call_args[ - "label_to_output_comm_rank" - ] = self.__get_label_to_output_comm_rank(min_batch_id, max_batch_id) - self.__sample_call_args["label_list"] = cupy.arange( - min_batch_id, max_batch_id + 1, dtype="int32" + self.__sample_call_args.update( + { + "_multiple_clients": True, + "label_to_output_comm_rank": self.__get_label_to_output_comm_rank( + min_batch_id, max_batch_id + ), + "label_list": cupy.arange( + min_batch_id, max_batch_id + 1, dtype="int32" + ), + } ) samples, offsets = sample_fn( From 911517cd5dc8c769de23add4d795f0c2c2714066 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:29:25 +0000 Subject: [PATCH 23/37] remove print --- python/cugraph/cugraph/tests/traversal/test_sssp.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/python/cugraph/cugraph/tests/traversal/test_sssp.py b/python/cugraph/cugraph/tests/traversal/test_sssp.py index 7b0cc3b132d..02f4370c0de 100644 --- a/python/cugraph/cugraph/tests/traversal/test_sssp.py +++ b/python/cugraph/cugraph/tests/traversal/test_sssp.py @@ -143,7 +143,7 @@ def networkx_call(graph_file, source, edgevals=True): M = utils.read_csv_for_nx(dataset_path, read_weights_in_sp=True) # Directed NetworkX graph edge_attr = "weight" if edgevals else None - print(M) + Gnx = nx.from_pandas_edgelist( M, source="0", @@ -229,10 +229,8 @@ def test_sssp(gpubenchmark, dataset_source_nxresults, cugraph_input_type): input_G_or_matrix = utils.create_obj_from_csv( dataset_path, cugraph_input_type, edgevals=True ) - print(input_G_or_matrix) else: input_G_or_matrix = G - print(G.edgelist.edgelist_df) cu_paths, max_val = cugraph_call(gpubenchmark, input_G_or_matrix, source) From c1ddad896604a69269938419a0cdf19ab63b35d5 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:29:39 +0000 Subject: [PATCH 24/37] reformat --- python/cugraph/cugraph/tests/traversal/test_sssp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/cugraph/cugraph/tests/traversal/test_sssp.py b/python/cugraph/cugraph/tests/traversal/test_sssp.py index 02f4370c0de..f6aba8d769c 100644 --- a/python/cugraph/cugraph/tests/traversal/test_sssp.py +++ b/python/cugraph/cugraph/tests/traversal/test_sssp.py @@ -143,7 +143,7 @@ def networkx_call(graph_file, source, edgevals=True): M = utils.read_csv_for_nx(dataset_path, read_weights_in_sp=True) # Directed NetworkX graph edge_attr = "weight" if edgevals else None - + Gnx = nx.from_pandas_edgelist( M, source="0", From d54cd6a7c7bb530dbf13169267fe0711ba77b0f3 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 15:36:09 +0000 Subject: [PATCH 25/37] update docstrings --- python/cugraph/cugraph/traversal/bfs.py | 2 +- python/cugraph/cugraph/traversal/sssp.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/python/cugraph/cugraph/traversal/bfs.py b/python/cugraph/cugraph/traversal/bfs.py index a200ba9b5d8..f2c1f5c5662 100644 --- a/python/cugraph/cugraph/traversal/bfs.py +++ b/python/cugraph/cugraph/traversal/bfs.py @@ -126,7 +126,7 @@ def bfs( ): """ Find the distances and predecessors for a breadth first traversal of a - graph. + graph. Unlike SSSP, BFS supports unweighted graphs. Parameters ---------- diff --git a/python/cugraph/cugraph/traversal/sssp.py b/python/cugraph/cugraph/traversal/sssp.py index bccbc21b515..7afe78c2d89 100644 --- a/python/cugraph/cugraph/traversal/sssp.py +++ b/python/cugraph/cugraph/traversal/sssp.py @@ -149,7 +149,9 @@ def sssp( unreachable will have a distance of infinity denoted by the maximum value of the data type and the predecessor set as -1. The source vertex's predecessor is also set to -1. Graphs with negative weight cycles are not - supported. + supported. Unweighted graphs are also unsupported. + + For finding shortest paths on an unweighted graph, use BFS instead. Parameters ---------- From 5f52c08f49af7c999b50fd7a36fa99c60bad76b7 Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Mon, 8 May 2023 18:03:19 -0400 Subject: [PATCH 26/37] correct error message --- cpp/src/c_api/graph_mg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/c_api/graph_mg.cpp b/cpp/src/c_api/graph_mg.cpp index f59bf703f19..f50c7c08fb6 100644 --- a/cpp/src/c_api/graph_mg.cpp +++ b/cpp/src/c_api/graph_mg.cpp @@ -340,7 +340,7 @@ extern "C" cugraph_error_code_t cugraph_mg_graph_create( CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", + "Invalid input arguments: Edge id type must match edge type", *error); CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), From 4cdb7838a99613651e7d1e45c7bc707bde6635b2 Mon Sep 17 00:00:00 2001 From: Alex Barghi <105237337+alexbarghi-nv@users.noreply.github.com> Date: Mon, 8 May 2023 18:03:55 -0400 Subject: [PATCH 27/37] correct error message --- cpp/src/c_api/graph_sg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/c_api/graph_sg.cpp b/cpp/src/c_api/graph_sg.cpp index 2ec1c536651..735b7616449 100644 --- a/cpp/src/c_api/graph_sg.cpp +++ b/cpp/src/c_api/graph_sg.cpp @@ -515,7 +515,7 @@ extern "C" cugraph_error_code_t cugraph_sg_graph_create( CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->type_ == edge_type), CUGRAPH_INVALID_INPUT, - "Invalid input arguments: Edge id type must match edge (src/dst) type", + "Invalid input arguments: Edge id type must match edge type", *error); CAPI_EXPECTS((edge_ids == nullptr) || (p_edge_ids->size_ == p_src->size_), From df7f0abe6c37eeb21f27844bf02a9d6274ab5e21 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Mon, 8 May 2023 22:21:09 +0000 Subject: [PATCH 28/37] update graph creation with warning when edge id type doesn't match --- .../graph_implementation/simpleDistributedGraph.py | 9 +++++++++ .../structure/graph_implementation/simpleGraph.py | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index f4b193d015e..c3be8e10763 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -99,6 +99,14 @@ def _make_plc_graph( if simpleDistributedGraphImpl.edgeIdCol in edata_x[0]: edge_ids = edata_x[0][simpleDistributedGraphImpl.edgeIdCol] + if edata_x[0][src_col_name].dtype == 'int64' and edge_ids.dtype != 'int64': + edge_ids = edge_ids.astype('int64') + warnings.warn( + f"Vertex type is int64 but edge id type is {edge_ids.dtype}" + ", automatically casting edge id type to int64. " + "This may cause extra memory usage. Consider passing" + " a int64 list of edge ids instead." + ) if simpleDistributedGraphImpl.edgeTypeCol in edata_x[0]: edge_types = edata_x[0][simpleDistributedGraphImpl.edgeTypeCol] @@ -230,6 +238,7 @@ def __from_edgelist( ) value_col = None else: + source_col, dest_col, value_col = symmetrize( input_ddf, source, diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index aa7910586ef..5cf99b12f4c 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -1047,6 +1047,16 @@ def _make_plc_graph( weight_col = weight_col.astype("float32") if weight_t == "int64": weight_col = weight_col.astype("float64") + + if id_col is not None: + if src_or_offset_array.dtype == 'int64' and id_col.dtype != 'int64': + id_col = id_col.astype('int64') + warnings.warn( + f"Vertex type is int64 but edge id type is {id_col.dtype}" + ", automatically casting edge id type to int64. " + "This may cause extra memory usage. Consider passing" + " a int64 list of edge ids instead." + ) self._plc_graph = SGGraph( resource_handle=ResourceHandle(), From 155536f28d7b0513e615e9ff6110d43fe367958c Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 03:54:02 +0000 Subject: [PATCH 29/37] fix style --- .../graph_implementation/simpleDistributedGraph.py | 6 +++--- .../cugraph/structure/graph_implementation/simpleGraph.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index c3be8e10763..0e958028101 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -99,8 +99,8 @@ def _make_plc_graph( if simpleDistributedGraphImpl.edgeIdCol in edata_x[0]: edge_ids = edata_x[0][simpleDistributedGraphImpl.edgeIdCol] - if edata_x[0][src_col_name].dtype == 'int64' and edge_ids.dtype != 'int64': - edge_ids = edge_ids.astype('int64') + if edata_x[0][src_col_name].dtype == "int64" and edge_ids.dtype != "int64": + edge_ids = edge_ids.astype("int64") warnings.warn( f"Vertex type is int64 but edge id type is {edge_ids.dtype}" ", automatically casting edge id type to int64. " @@ -238,7 +238,7 @@ def __from_edgelist( ) value_col = None else: - + source_col, dest_col, value_col = symmetrize( input_ddf, source, diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 5cf99b12f4c..16c2e257f1c 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -1047,10 +1047,10 @@ def _make_plc_graph( weight_col = weight_col.astype("float32") if weight_t == "int64": weight_col = weight_col.astype("float64") - + if id_col is not None: - if src_or_offset_array.dtype == 'int64' and id_col.dtype != 'int64': - id_col = id_col.astype('int64') + if src_or_offset_array.dtype == "int64" and id_col.dtype != "int64": + id_col = id_col.astype("int64") warnings.warn( f"Vertex type is int64 but edge id type is {id_col.dtype}" ", automatically casting edge id type to int64. " From 1bb92714f393a0aad5d3e002c743bcf0fdccc1c1 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 03:54:29 +0000 Subject: [PATCH 30/37] fix style --- .../graph_implementation/simpleDistributedGraph.py | 6 +++--- .../cugraph/structure/graph_implementation/simpleGraph.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py index c3be8e10763..0e958028101 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleDistributedGraph.py @@ -99,8 +99,8 @@ def _make_plc_graph( if simpleDistributedGraphImpl.edgeIdCol in edata_x[0]: edge_ids = edata_x[0][simpleDistributedGraphImpl.edgeIdCol] - if edata_x[0][src_col_name].dtype == 'int64' and edge_ids.dtype != 'int64': - edge_ids = edge_ids.astype('int64') + if edata_x[0][src_col_name].dtype == "int64" and edge_ids.dtype != "int64": + edge_ids = edge_ids.astype("int64") warnings.warn( f"Vertex type is int64 but edge id type is {edge_ids.dtype}" ", automatically casting edge id type to int64. " @@ -238,7 +238,7 @@ def __from_edgelist( ) value_col = None else: - + source_col, dest_col, value_col = symmetrize( input_ddf, source, diff --git a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py index 5cf99b12f4c..16c2e257f1c 100644 --- a/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py +++ b/python/cugraph/cugraph/structure/graph_implementation/simpleGraph.py @@ -1047,10 +1047,10 @@ def _make_plc_graph( weight_col = weight_col.astype("float32") if weight_t == "int64": weight_col = weight_col.astype("float64") - + if id_col is not None: - if src_or_offset_array.dtype == 'int64' and id_col.dtype != 'int64': - id_col = id_col.astype('int64') + if src_or_offset_array.dtype == "int64" and id_col.dtype != "int64": + id_col = id_col.astype("int64") warnings.warn( f"Vertex type is int64 but edge id type is {id_col.dtype}" ", automatically casting edge id type to int64. " From ad051c163d5d8e5ef8249b8ec4fcd80727bf92c0 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 04:32:27 +0000 Subject: [PATCH 31/37] remove rank option --- python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py index 57b465067ba..0257a56ba08 100644 --- a/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py +++ b/python/cugraph/cugraph/gnn/data_loading/bulk_sampler.py @@ -37,7 +37,6 @@ def __init__( graph, seeds_per_call: int = 200_000, batches_per_partition=100, - rank: int = 0, **kwargs, ): """ @@ -56,9 +55,6 @@ def __init__( a single sampling call. batches_per_partition: int (optional, default=100) The number of batches outputted to a single parquet partition. - rank: int (optional, default=0) - The rank of this sampler. Used to isolate this sampler from - others that may be running on other nodes. kwargs: kwargs Keyword arguments to be passed to the sampler (i.e. fanout). """ @@ -80,14 +76,9 @@ def __init__( self.__graph = graph self.__seeds_per_call = seeds_per_call self.__batches_per_partition = batches_per_partition - self.__rank = rank self.__batches = None self.__sample_call_args = kwargs - @property - def rank(self) -> int: - return self.__rank - @property def seeds_per_call(self) -> int: return self.__seeds_per_call From d34190d137dbf6dd37b24908012369ed6d64b11b Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 14:18:45 +0000 Subject: [PATCH 32/37] remove explicit gtest, gmock dependencies --- dependencies.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/dependencies.yaml b/dependencies.yaml index ddb56429d03..9a3fe8387f5 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -214,8 +214,6 @@ dependencies: packages: - c-compiler - cxx-compiler - - gmock=1.10.0 - - gtest=1.10.0 - libcugraphops=23.6.* - libraft-headers=23.6.* - libraft=23.6.* From bc4b2a157b9941a8af8019601c4ea0832cf331d3 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 14:19:22 +0000 Subject: [PATCH 33/37] generate --- conda/environments/all_cuda-118_arch-x86_64.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/conda/environments/all_cuda-118_arch-x86_64.yaml b/conda/environments/all_cuda-118_arch-x86_64.yaml index 5b416134ef1..5120fbee1a1 100644 --- a/conda/environments/all_cuda-118_arch-x86_64.yaml +++ b/conda/environments/all_cuda-118_arch-x86_64.yaml @@ -23,9 +23,7 @@ dependencies: - doxygen - fsspec[http]>=0.6.0 - gcc_linux-64=11.* -- gmock=1.10.0 - graphviz -- gtest=1.10.0 - ipython - libcudf=23.6.* - libcugraphops=23.6.* From a2bd38927d17ce8178bd74fb7a4fd7d3d656f890 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 14:58:03 +0000 Subject: [PATCH 34/37] update gtest to 1.13 --- dependencies.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dependencies.yaml b/dependencies.yaml index 9a3fe8387f5..eaec03a619c 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -214,6 +214,8 @@ dependencies: packages: - c-compiler - cxx-compiler + - gmock>=1.13.0.* + - gtest>=1.13.0.* - libcugraphops=23.6.* - libraft-headers=23.6.* - libraft=23.6.* From b9202dd2026bc70287a14ce9efbcf3997acf2f83 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 14:58:30 +0000 Subject: [PATCH 35/37] generate --- conda/environments/all_cuda-118_arch-x86_64.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conda/environments/all_cuda-118_arch-x86_64.yaml b/conda/environments/all_cuda-118_arch-x86_64.yaml index 5120fbee1a1..3bb4ad61bce 100644 --- a/conda/environments/all_cuda-118_arch-x86_64.yaml +++ b/conda/environments/all_cuda-118_arch-x86_64.yaml @@ -23,7 +23,9 @@ dependencies: - doxygen - fsspec[http]>=0.6.0 - gcc_linux-64=11.* +- gmock>=1.13.0.* - graphviz +- gtest>=1.13.0.* - ipython - libcudf=23.6.* - libcugraphops=23.6.* From abbe83e36f0017e40d517e0cc7bcf4ba96301129 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 15:24:10 +0000 Subject: [PATCH 36/37] fix dependencies --- conda/recipes/libcugraph/conda_build_config.yaml | 2 +- dependencies.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conda/recipes/libcugraph/conda_build_config.yaml b/conda/recipes/libcugraph/conda_build_config.yaml index 83a383236a4..2fa26d99c09 100644 --- a/conda/recipes/libcugraph/conda_build_config.yaml +++ b/conda/recipes/libcugraph/conda_build_config.yaml @@ -17,7 +17,7 @@ nccl_version: - ">=2.9.9" gtest_version: - - "=1.10.0" + - ">=1.13.0" cuda_profiler_api_version: - ">=11.8.86,<12" diff --git a/dependencies.yaml b/dependencies.yaml index eaec03a619c..a8b0dd172cf 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -214,8 +214,8 @@ dependencies: packages: - c-compiler - cxx-compiler - - gmock>=1.13.0.* - - gtest>=1.13.0.* + - gmock>=1.13.0 + - gtest>=1.13.0 - libcugraphops=23.6.* - libraft-headers=23.6.* - libraft=23.6.* From 4b892694bfa1344dcaed94d4bcb095d74d180a74 Mon Sep 17 00:00:00 2001 From: Alexandria Barghi Date: Tue, 9 May 2023 15:24:25 +0000 Subject: [PATCH 37/37] generate --- conda/environments/all_cuda-118_arch-x86_64.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conda/environments/all_cuda-118_arch-x86_64.yaml b/conda/environments/all_cuda-118_arch-x86_64.yaml index 3bb4ad61bce..cf496bd1deb 100644 --- a/conda/environments/all_cuda-118_arch-x86_64.yaml +++ b/conda/environments/all_cuda-118_arch-x86_64.yaml @@ -23,9 +23,9 @@ dependencies: - doxygen - fsspec[http]>=0.6.0 - gcc_linux-64=11.* -- gmock>=1.13.0.* +- gmock>=1.13.0 - graphviz -- gtest>=1.13.0.* +- gtest>=1.13.0 - ipython - libcudf=23.6.* - libcugraphops=23.6.*